2016-06-11 266 views
5

我想为tensorflow的某些实验添加外部头文件(如OpenCL头文件)。我试图在tensorflow /核心/ BUILD文件添加到build文件:如何在bazel /张量流构建期间添加外部头文件

# 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 /中。

有人可以解释如何完全做外部头文件成tensorflow建设?

感谢您的快速帮助。

回答

0

Bazel试图非常严格地确保它的构建只包含它所知道的文件,并尝试确保它们是可重现的。不幸的是,这可能使实验变得困难。解决问题的正确方法是为要包含的标题创建BUILD文件和规则。您也许可以通过乱动bazel- *生成的文件夹来破解某些东西,但我不推荐它。

+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"], 
) 

这将从third_party/include下的.h文件创建一个C++库,这可以从源树中的任何位置使用。

现在去你tensorflow/core/BUILD文件,并添加一个依赖于cc_library有:运行GCC时

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

设置科普特人只是改变的标志。将//:opencl添加到依赖项会告诉Bazel在运行gcc时使这些文件可用。

2

当我使用英特尔MKL构建TensorFlow并且必须添加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. 创建简单的构建文件到<your tensorflow folder>/third_party/opencl文件夹:

    cc_library(
        name = "opencl", 
        hdrs = glob(["include/CL/*.h"]), 
        visibility = ["//visibility:public"], 
    ) 
    
  3. 添加到的DEP目标库:

    cc_library(
        name = "all_kernels", 
        visibility = ["//visibility:public"], 
        copts = tf_copts() + ["-Ithird_party/opencl/include"], 
        deps = [ 
         "//third_party/opencl", 
         ... 
        ], 
    ) 
    
  4. 不要忘了添加编译器选项要么到目标库如上图所示,或者只是作为一个标志BAZEL:

    bazel build --copt="-Ithird_party/opencl/include" ... 
    
相关问题