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

2023-12-01

这是运行脚本检查 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

(Update: 构建脚本可能正在吃东西-march=native,可能是因为它包含一个=.)

-mfpmath=both只适用于 gcc,不适用于 clang。-mfpmath=sse可能同样好,甚至更好,并且是 x86-64 的默认值。 32 位构建默认为-mfpmath=387,因此更改它对于 32 位会有帮助。 (但是如果您想要高性能的数字处理,您应该构建 64 位二进制文​​件。)

我不确定 TensorFlow 的默认值是什么-O2 or -O3 is. gcc -O3可以实现包括自动矢量化在内的全面优化,但这有时会使代码变慢。


这是做什么的:--copt for bazel build直接向 gcc 传递一个选项以编译 C 和 C++ 文件(但不链接,因此您需要一个不同的选项来进行跨文件链接时间优化)

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

-march=native启用您的CPU支持的所有选项,因此它使得-mavx512f -mavx2 -mavx -mfma -msse4.2多余的。 (还,-mavx2已经启用-mavx and -msse4.2,所以雅罗斯拉夫的命令应该没问题)。另外,如果您使用的 CPU 不支持这些选项之一(例如 FMA),请使用-mfma会生成一个因非法指令而出错的二进制文件。

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

-march=native使-mtune=native, so 它针对您的 CPU 进行优化对于诸如哪种 AVX 指令序列最适合未对齐负载之类的问题。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用SSE4.2和AVX指令编译Tensorflow? 的相关文章

  • 在不丢失基数信息的情况下对 TensorFlow 数据集进行窗口处理?

    tf data Dataset window返回一个新的数据集 其元素是数据集 这些嵌套数据集的元素是所需大小的窗口 如果您有一个数据集 例如 Dataset range 10 并想要一个像这样的窗口数据集 0 1 2 1 2 3 7 8
  • Native TF 与 Keras TF 性能比较

    我使用本机和后端张量流创建了完全相同的网络 但在使用多个不同参数进行了多个小时的测试后 仍然无法弄清楚为什么 keras 优于本机张量流并产生更好 稍微但更好 的结果 Keras 是否实现了不同的权重初始化方法 或者执行除 tf train
  • 错误:tensorflow:无法匹配检查点的文件

    我正在训练一个张量流模型 在每个时期之后我都会保存模型状态并腌制一些数组 到目前为止 我的模型执行了 2 个纪元 并且保存状态的文件夹包含以下文件 checkpoint model e knihy preprocessed txt e0 c
  • Keras ImageDataGenerator 相当于 csv 文件

    我在文件夹中排序了一堆数据 如下图所示 我需要构建一个 DataIterator 以便将数据放入神经网络模型中 当数据是图像时 我找到了很多例子来解决这个问题 使用 Keras 类图像数据生成器及其方法流自目录 但当数据是 csv 结构时则
  • 安装tensorflow的正确命令

    当尝试在 Anaconda 上安装 Tensorflow 时 我尝试了两种类型的命令 conda install tensorflow gpu工作得很好 然而 当尝试conda install c anaconda tensorflow g
  • Keras ZeroDivisionError:整数除法或以零为模

    我正在尝试使用 Keras 和 Tensorflow 实现卷积神经网络 我有以下代码 from keras models import Sequential from keras layers import Conv2D MaxPoolin
  • X86 预取优化:“计算 goto”线程代码

    我有一个相当重要的问题 我的计算图有循环和多个 计算路径 我没有制作一个调度程序循环 其中每个顶点将被一一调用 而是将所有预先分配的 框架对象 放置在堆中 代码 数据 这有点类似于线程代码 甚至更好 CPS 只是在堆中跳转 执行代码 每个代
  • Tensorflow 不分配完整的 GPU 内存

    Tensorflow 默认分配所有 GPU 内存 但我的新设置实际上只有 9588 MiB 11264 MiB 我预计大约 11 000MiB 就像我的旧设置一样 张量流信息在这里 from tensorflow python client
  • 对于只有 10000 个单词的字典来说,真正需要什么嵌入层 output_dim?

    我正在训练一个 RNN 其单词特征集非常少 大约 10 000 个 我计划在添加 RNN 之前从嵌入层开始 但我不清楚真正需要什么维度 我知道我可以尝试不同的值 32 64 等 但我宁愿先有一些直觉 例如 如果我使用 32 维嵌入向量 则每
  • 在 x86 程序集中存储大量布尔值的最佳方法是什么?

    最近我一直在处理充满布尔值的大型数组 目前 我将它们存储在 bss部分有一个 space指令 它允许我创建字节数组 但是 由于我只需要存储布尔值 因此我希望从数组中逐位读取和写入数据 目前 我能想到的最好方法是有一个 space指令所需存储
  • 为什么我的代码显示垃圾?

    当我也想打印列表中的每个数字时 我的代码显示垃圾 有什么问题吗 输出应如下所示 给定的数组是 2G 4 PT为什么这是垃圾总数是 7 Code ASSUME CS CODE DS DATA SS STK ORG 0000H DATA SEG
  • Tensorflow中通过字符串选择不同的模式

    我正在尝试构建一个 VAE 网络 我希望模型在不同的模式下做不同的事情 我有三种模式 训练 相同 和 不同 以及一个名为 interpolation mode 的函数 它根据模式执行不同的操作 我的代码如下所示 import tensorf
  • 阻止 TensorFlow 访问 GPU? [复制]

    这个问题在这里已经有答案了 有没有一种方法可以纯粹在CPU上运行TensorFlow 我机器上的所有内存都被运行 TensorFlow 的单独进程占用 我尝试将 per process memory fraction 设置为 0 但未成功
  • 异常:加载数据时 URL 获取失败

    我正在尝试设置我的机器来运行 Tensorflow 2 我从未使用过 Tensorflow 只是下载了 Python 3 7 我不确定这是否是我的机器的问题 我按照上面列出的安装说明进行操作TensorFlow 的网站 https www
  • pip:需要将包名称tensorflow-gpu更改为tensorflow

    我正在尝试将具有 GPU 支持的张量流安装到 conda 环境中 我使用命令 pip install ignore installed upgrade https storage googleapis com tensorflow linu
  • 如何手动计算分类交叉熵?

    当我手动计算二元交叉熵时 我应用 sigmoid 来获取概率 然后使用交叉熵公式并平均结果 logits tf constant 1 1 0 1 2 labels tf constant 0 0 1 1 1 probs tf nn sigm
  • 为什么X86中没有NAND、NOR和XNOR指令?

    它们是您可以在计算机上执行的最简单的 指令 之一 它们是我亲自实施的第一个指令 执行 NOT AND x y 会使执行时间和依赖链长度和代码大小加倍 BMI1 引入了 andnot 这是一个有意义的补充 是一个独特的操作 为什么不是这个问题
  • 何时可以重用avx指令中的源寄存器

    在 avx 指令中用作源的寄存器何时可以在指令开始处理后重用 例如 我想使用vgatherdps该指令消耗两个 ymm 寄存器 其中之一是位移索引 我意识到vgatherdps由于数据的局部性较差 因此需要花费大量时间来收集 位移索引寄存器
  • 英特尔的最后分支记录功能是英特尔处理器独有的吗?

    最后分支记录是指存储与最近执行的分支相关的源地址和目标地址的寄存器对 MSR 的集合 它们受英特尔酷睿 2 英特尔至强和英特尔凌动处理器系列的支持 http css csail mit edu 6 858 2012 readings ia3
  • 使用预训练的 word2vec 初始化 Seq2seq 嵌入

    我对使用预训练的 word2vec 初始化tensorflow seq2seq 实现感兴趣 我已经看过代码了 嵌入似乎已初始化 with tf variable scope scope or embedding attention deco

随机推荐