我正在尝试添加外部头文件(如OpenCL头文件)进行tensorflow的一些实验。我尝试将其添加到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进行构建吗?
感谢您的快速帮助。
答案 0 :(得分:3)
当我使用英特尔MKL构建TensorFlow并且必须添加MKL标头时,我遇到了类似的问题。我的解决方案如下:
将标题符号链接创建到third_party文件夹中,例如:
<your tensorflow folder>/third_party/opencl/include -> /opt/OpenCL/include
使用命令:
ln -s /opt/OpenCL/include <your tensorflow folder>/third_party/opencl
在<your tensorflow folder>/third_party/opencl
文件夹中创建简单的BUILD文件:
cc_library(
name = "opencl",
hdrs = glob(["include/CL/*.h"]),
visibility = ["//visibility:public"],
)
将deps添加到目标库中:
cc_library(
name = "all_kernels",
visibility = ["//visibility:public"],
copts = tf_copts() + ["-Ithird_party/opencl/include"],
deps = [
"//third_party/opencl",
...
],
)
不要忘记将编译器选项添加到目标库中,如上所示,或者只是作为bazel的标志:
bazel build --copt="-Ithird_party/opencl/include" ...
答案 1 :(得分:2)
您必须将文件添加为此规则的依赖项。
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时使这些文件可用。
答案 2 :(得分:0)
Bazel试图非常严格地确保其构建仅包含它知道的文件,以确保它们是可重现的。不幸的是,这可能使其难以进行实验。解决问题的正确方法是为要包含的标头创建BUILD文件和规则。您也可以通过搞乱bazel- *生成的文件夹来破解某些东西,但我不推荐它。