当前位置: 首页 > 面试题库 >

如何使用SSE4.2和AVX指令编译Tensorflow?

夏侯衡
2023-03-14
问题内容

这是从运行脚本以检查Tensorflow是否正常运行时收到的消息:

I tensorflow/stream_executor/dso_loader.cc:125] successfully opened CUDA library libcublas.so.8.0 locally
I tensorflow/stream_executor/dso_loader.cc:125] successfully opened CUDA library libcudnn.so.5 locally
I tensorflow/stream_executor/dso_loader.cc:125] successfully opened CUDA library libcufft.so.8.0 locally
I tensorflow/stream_executor/dso_loader.cc:125] successfully opened CUDA library libcuda.so.1 locally
I tensorflow/stream_executor/dso_loader.cc:125] successfully opened CUDA library libcurand.so.8.0 locally
W tensorflow/core/platform/cpu_feature_guard.cc:95] The TensorFlow library wasn't compiled to use SSE4.2 instructions, but these are available on your machine and could speed up CPU computations.
W tensorflow/core/platform/cpu_feature_guard.cc:95] The TensorFlow library wasn't compiled to use AVX instructions, but these are available on your machine and could speed up CPU computations.
I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:910] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero

我注意到它提到了SSE4.2和AVX,

  1. 什么是SSE4.2和AVX?
  2. 这些SSE4.2和AVX如何改善Tensorflow任务的CPU计算。
  3. 如何使用这两个库使Tensorflow进行编译?

问题答案:

我只是遇到了同样的问题,似乎Yaroslav Bulatov的建议并未涵盖SSE4.2支持,添加--copt=-msse4.2就足够了。最后,我成功建立了

bazel build -c opt --copt=-mavx --copt=-mavx2 --copt=-mfma --copt=-mfpmath=both --copt=-msse4.2 --config=cuda -k //tensorflow/tools/pip_package:build_pip_package

没有任何警告或错误。

任何系统的最佳选择可能是:

bazel build -c opt --copt=-march=native --copt=-mfpmath=both --config=cuda -k //tensorflow/tools/pip_package:build_pip_package

(更新:构建脚本可能正在吃东西-march=native,可能是因为其中包含=。)

-mfpmath=both仅适用于gcc,不适用于clang。 -mfpmath=sse即使不是更好,它也可能一样好,并且是x86-64的默认设置。32位版本的默认设置为-mfpmath=387,因此对其进行更改将有助于32位。(但是,如果您想要高性能的数字运算,则应该构建64位二进制文​​件。)

我不知道为了什么TensorFlow的默认-O2或者-O3是。 gcc -O3可以进行包括自动矢量化在内的全面优化,但这有时会使代码变慢。

这里做的事情:--copt用于bazel build直接传递一个选项,GCC编译C和C ++文件(但不连接,所以你需要跨文件链接时优化不同的选项)

x86-64 gcc默认只使用SSE2或更旧的SIMD指令,因此您可以在任何x86-64系统上运行二进制文件。(请参阅https://gcc.gnu.org/onlinedocs/gcc/x86-Options.html)。那不是你想要的。您想制作一个可以利用CPU可以运行的所有指令的二进制文件,因为您只在构建二进制文件的系统上运行该二进制文件

-march=native启用您的CPU支持的所有选项,从而使其-mavx512f -mavx2 -mavx -mfma -msse4.2多余。(此外,-mavx2已经启用-mavx和-msse4.2,因此Yaroslav的命令应该没问题)。另外,如果您使用的CPU不支持这些选项之一(例如FMA),则使用-mfma会产生二进制文件,错误指令无效。

TensorFlow的./configure默认设置为enabled-march=native,因此使用它应该避免需要手动指定编译器选项。

-march=nativeenable -mtune=native,因此它针对您的CPU进行了优化,例如哪种AVX指令序列最适合未对齐的负载。

所有这些都适用于gcc,clang或ICC。(对于ICC,您可以使用-xHOST代替-march=native。)



 类似资料:
  • 这是运行脚本检查Tensorflow是否工作时收到的消息: 我注意到它提到了SSE4。2和AVX, 什么是SSE4。2和AVX 这些是怎么做的。2和AVX改进了Tensorflow任务的CPU计算 如何使用这两个库来编译Tensorflow

  • 我是TensorFlow的新手。我最近安装了它(Windows CPU版本),收到以下消息: 成功安装TensorFlow-1.4.0 TensorFlow-TensorBoard-0.4.0 RC2 当我想跑的时候 (我是通过https://github.com/tensorflow/tensorflow找到的) 我收到以下消息: 2017-11-02 01:56:21.698935:I C:\

  • 问题内容: 请帮助我,如何使AngularJS编译指令生成的代码? 您甚至可以在这里找到相同的代码,http://jsbin.com/obuqip/4/edit 的HTML Java脚本 问题答案: 这是一个既不使用编译功能也不使用链接功能的版本: 请注意,模板被包装在中,因为模板需要具有一个根元素。(如果没有,它将有两个 根元素。) 需要对HTML进行少许修改以进行插值: 小提琴。

  • 主要内容:实例,实例,实例,实例,实例,实例,实例以反引号 ` 开始的某些标识符是 Verilog 系统编译指令。 编译指令为 Verilog 代码的撰写、编译、调试等提供了极大的便利。 下面介绍下完整的 8 种编译指令,其中前 4 种使用频率较高。 `define, `undef 在编译阶段,`define 用于文本替换,类似于 C 语言中的 #define。 一旦 `define 指令被编译,其在整个编译过程中都会有效。例如,在一个文件中定义

  • 我在网上的某个地方发现这样一句话:“解释器是一个程序,它使用编程语言的基本指令集作为其机器语言来实现或模拟虚拟机。”在上述引用的上下文中,有人能解释一下解释器是如何实际完成高级指令的执行的吗?网上的教程只涉及抽象的方式,即一次只需要一行代码就可以执行。它是使用机器指令库还是如何使用?我很想知道这件事。

  • 为了在运行windows 7 pro的intel core 2上完成一些cmov指令,我编写了以下代码。它所做的就是从控制台获取一个字符串作为输入,应用一些移位操作来生成一个随机种子,然后将该种子传递给srand,以生成一个小的伪随机数数组。然后评估伪随机数是否满足谓词函数(更任意的位随机),并输出“*”或“\u1”。实验的目的是生成cmov指令,但正如您在下面的反汇编中所看到的,没有。 有没有关