2016-06-11 12 views
5

Sto cercando di aggiungere un file di intestazione esterno (come il file di intestazione OpenCL) per alcuni esperimenti per tensorflow. Ho cercato di aggiungere questo nella lima BUILD sotto tensorflow/file/BUILD nucleo:Come aggiungere file di intestazione esterni durante la build bazel/tensorflow

# This includes implementations of all kernels built into TensorFlow. 
cc_library(
    name = "all_kernels", 
    visibility = ["//visibility:public"], 
    copts = tf_copts() + ["-Ithird_party/include"], <==== this is the line I added 

Ho anche creato un link simbolico in questo elenco per il percorso di questi file di intestazione dal driver di OpenCL (sotto tensorflow/THIRD_PARTY) troppo (come ln -s/opt/opencl /) ma si lamenta ancora che non ha trovato quel file di intestazione.

Se aggiungo direttamente un file di intestazione esterno (come/opt/opencl/CL /) si lamenta che i file esterni non possono essere inclusi (o qualcosa del genere).

Non ho la password di root per copiare questi file di intestazione in/usr/include/too.

Qualcuno può spiegare esattamente come eseguire i file di intestazione esterni in tensorflow per la costruzione?

Grazie per qualsiasi aiuto rapido.

risposta

0

Bazel cerca di essere molto severo per assicurarsi che le sue build includano solo i file di cui è a conoscenza, per cercare di assicurarsi che siano riproducibili. Sfortunatamente ciò può rendere difficile sperimentare. Il modo corretto per risolvere il problema è creare un file BUILD e una regola per le intestazioni che si desidera includere. Potresti riuscire a modificare qualcosa aggirando anche le cartelle generate da bazel- *, ma non lo consiglio.

+1

Grazie per l'aiuto, ma volevo sapere in che modo fare esattamente questo. Come ho detto nel mio post originale, quando aggiungo il soft link alla directory interna e lo assegno come "-I" non funziona ancora. Quindi, volevo sapere esattamente come possiamo fare questo. –

1

È necessario aggiungere i file come dipendenza di questa regola.

IIUC, si ha la seguente struttura:

tensorflow/ 
    BUILD 
    WORKSPACE 
    tensorflow/ 
    core/ 
     BUILD 
    third_party/ 
    include -> /opt/opencl/CL # or something like that 

si desidera esporre i file .h in modo Bazel in grado di capire/dipenderà, in modo da aprire il file tensorflow/BUILD e aggiungere il seguente:

cc_library(
    name = "opencl", 
    hdrs = glob(["third_party/include/*.h"]), 
    visibility = ["//visibility:public"], 
) 

Questo crea una libreria C++ dai file .h in third_party/include, che può essere utilizzata da qualsiasi punto dell'albero sorgente.

Passare al file tensorflow/core/BUILD e aggiungere una dipendenza al cc_library lì:

cc_library(
    name = "all_kernels", 
    visibility = ["//visibility:public"], 
    copts = tf_copts() + ["-Ithird_party/include"], 
    deps = [ 
     "//:opencl", 
     # plus any other deps 
    ], 
) 

Impostazione copti cambia solo le bandiere quando viene eseguito gcc. L'aggiunta di //:opencl alle dipendenze dice a Bazel di rendere disponibili quei file quando gcc è in esecuzione.

2

Ho affrontato il problema simile quando ho creato TensorFlow con Intel MKL e ho dovuto aggiungere le intestazioni MKL.La mia soluzione è la seguente:

  1. Crea collegamento simbolico per le intestazioni in THIRD_PARTY cartella, come:

    <your tensorflow folder>/third_party/opencl/include -> /opt/OpenCL/include 
    

    con il comando:

    ln -s /opt/OpenCL/include <your tensorflow folder>/third_party/opencl 
    
  2. creare semplici file di generazione nella cartella <your tensorflow folder>/third_party/opencl:

    cc_library(
        name = "opencl", 
        hdrs = glob(["include/CL/*.h"]), 
        visibility = ["//visibility:public"], 
    ) 
    
  3. Add deps nella libreria di destinazione:

    cc_library(
        name = "all_kernels", 
        visibility = ["//visibility:public"], 
        copts = tf_copts() + ["-Ithird_party/opencl/include"], 
        deps = [ 
         "//third_party/opencl", 
         ... 
        ], 
    ) 
    
  4. Non dimenticare di aggiungere opzioni di compilazione o nella libreria di destinazione come mostrato sopra o semplicemente come una bandiera per Bazel:

    bazel build --copt="-Ithird_party/opencl/include" ... 
    
Problemi correlati