2016-06-11 4 views
5

Я пытаюсь добавить внешний файл заголовка (например, заголовочный файл OpenCL) для некоторых экспериментов для тензорного потока. Я попытался добавить это в файл сборки под tensorflow/ядро ​​/ 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 

Я также создал мягкую ссылку в этом каталоге для размещения этих файлов заголовков из драйвера OpenCL (под tensorflow/THIRD_PARTY) тоже (например, ln -s/opt/opencl /), но он все еще жалуется, что он не нашел этот заголовочный файл.

Если я добавляю внешний файл заголовка напрямую (например,/opt/opencl/CL /), он жалуется, что внешние файлы не могут быть включены (или некоторые такие вещи).

У меня нет пароля root для копирования этих файлов заголовков в/usr/include /.

Может кто-нибудь объяснить, как именно делать внешние файлы заголовков в тензорном потоке для построения?

Спасибо за любую быструю помощь.

ответ

0

Bazel пытается быть очень строгим, чтобы убедиться, что его сборки содержат только файлы, о которых он знает, чтобы убедиться, что они воспроизводимы. К сожалению, это может затруднить эксперимент. Правильный способ решения проблемы - создать файл BUILD и правило для заголовков, которые вы хотите включить. Возможно, вы сможете что-то взломать, повесив палочки с созданной базой, но я не рекомендую ее.

+1

Спасибо для помощи, но я хотел знать, как конкретно это сделать. Как я уже сказал в своем оригинальном посте, когда я добавляю софт-ссылку во внутренний каталог и даю это как «-I», он все равно не работает. Итак, хотелось точно знать, как мы можем это сделать. –

1

Вы должны добавить файлы в качестве зависимости от этого правила.

IIUC, вы иметь следующую структуру:

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

Вы хотите выставить .h файлы таким образом, Базэл может понять/зависит, поэтому откройте файл tensorflow/BUILD и добавьте следующее:

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

Это создает C++-библиотеку из файлов .h в разделе third_party/include, от которой можно зависеть из любого места в исходном дереве.

Теперь перейдите к файлу tensorflow/core/BUILD и добавить зависимость к cc_library там:

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

Установка копты только изменяет флаги, когда GCC запускается. Добавление //:opencl к зависимостям сообщает Bazel, чтобы эти файлы были доступны при запуске gcc.

2

Я столкнулся с подобной проблемой, когда я построил TensorFlow с Intel MKL и должен был добавить заголовки MKL.Мое решение заключается в следующем:

  1. Создание символической ссылки на заголовки, в THIRD_PARTY папку, например:

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

    с командой:

    ln -s /opt/OpenCL/include <your tensorflow folder>/third_party/opencl 
    
  2. Создать простой файл BUILD в <your tensorflow folder>/third_party/opencl папку:

    cc_library(
        name = "opencl", 
        hdrs = glob(["include/CL/*.h"]), 
        visibility = ["//visibility:public"], 
    ) 
    
  3. Добавить DEPS в целевой библиотеке:

    cc_library(
        name = "all_kernels", 
        visibility = ["//visibility:public"], 
        copts = tf_copts() + ["-Ithird_party/opencl/include"], 
        deps = [ 
         "//third_party/opencl", 
         ... 
        ], 
    ) 
    
  4. Не забудьте добавить параметры компилятора либо в целевой библиотеке, как показано выше, или просто в качестве флага Базэл:

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