8

我正在尝试为 tensorflow 的一些实验添加外部头文件(如 OpenCL 头文件)。我尝试将其添加到 tensorflow/core/BUILD 文件下的 BUILD 文件中:

# 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 中进行构建吗?

感谢您的快速帮助。

4

3 回答 3

6

当我使用英特尔 MKL 构建 TensorFlow 并且必须添加 MKL 标头时,我遇到了类似的问题。我的解决方案如下:

  1. 将您的标头的符号链接创建到第三方文件夹中,例如:

    <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 的标志:

     bazel build --copt="-Ithird_party/opencl/include" ...
    
于 2016-11-09T10:07:12.910 回答
3

您必须将文件添加为此规则的依赖项。

IIUC,您具有以下结构:

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

您想以 Bazel 可以理解/依赖的方式公开 .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 那里:

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

设置 copts 只是在 gcc 运行时更改标志。添加//:opencl到依赖项告诉 Bazel 在 gcc 运行时使这些文件可用。

于 2016-06-15T19:40:59.690 回答
0

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

于 2016-06-13T23:37:29.257 回答