如何在Windows上使用SSE和AVX指令编译Tensor Flow?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在Windows上使用SSE和AVX指令编译Tensor Flow?相关的知识,希望对你有一定的参考价值。

随着最新版本的Tensor Flow现在在Windows上,我试图尽可能高效地运行一切。但是,即使从源代码编译,我仍然无法弄清楚如何启用SSE和AVX指令。

默认过程:https://github.com/tensorflow/tensorflow/tree/r0.12/tensorflow/contrib/cmake没有提到如何执行此操作。

我发现的唯一参考是使用Google的Bazel:How to compile Tensorflow with SSE4.2 and AVX instructions?

有谁知道使用MSBuild打开这些高级指令的简单方法?我听说他们至少加速了3倍。

为了帮助那些寻找类似解决方案的人,这是我目前得到的警告:https://github.com/tensorflow/tensorflow/tree/r0.12/tensorflow/contrib/cmake

我在64位平台上使用Windows 10 Professional,Visual Studio 2015社区版,带有cmake版本3.6.3的Anaconda Python 3.6(更高版本不适用于Tensor Flow)

任何帮助赞赏!

答案

好吧,我试图修复它,但我不确定它是否真的有效。

CMakeLists.txt,您将找到以下声明:

if (tensorflow_OPTIMIZE_FOR_NATIVE_ARCH)
  include(CheckCXXCompilerFlag)
  CHECK_CXX_COMPILER_FLAG("-march=native" COMPILER_OPT_ARCH_NATIVE_SUPPORTED)

在MSVC平台上,测试失败,因为MSVC不支持-march=native标志。我修改了如下语句:

if (tensorflow_OPTIMIZE_FOR_NATIVE_ARCH)
  include(CheckCXXCompilerFlag)
  CHECK_CXX_COMPILER_FLAG("-march=native" COMPILER_OPT_ARCH_NATIVE_SUPPORTED)
  if (COMPILER_OPT_ARCH_NATIVE_SUPPORTED)
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=native")
  else()
    CHECK_CXX_COMPILER_FLAG("/arch:AVX" COMPILER_OPT_ARCH_AVX_SUPPORTED)
    if(COMPILER_OPT_ARCH_AVX_SUPPORTED)
      set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /arch:AVX")
    endif()
  endif()
endif()

通过这样做,cmake将检查/arch:AVX是否可用并使用它。对于MSDNMSDN,默认情况下启用SSE2支持进行x86编译,但不支持x64编译。对于x64编译,您可以选择使用AVX或AVX2。我上面使用AVX是因为我的CPU只支持AVX,如果你有兼容的CPU,你可以试试AVX2。

通过编译使用上面的CMakeLists.txt,编译程序比正式版本慢得多,关于'AVX / AVX2'的警告消失了,但是关于SSE / SSE2 / 3 / 4.1 / 4.2的警告仍然存在。我认为这些警告可以忽略,因为x64 MSBuild没有SSE支持。

我现在正在测试新的pip包。它可能比以前更快,但我不想写一个新的基准...

任何对此感兴趣的人,请测试新包装是否真的更快。

我在2017-3-12的持续git master分支上做了所有这些。 pip包名称显示它是tensorflow 1.0.1

另一答案

我认为你必须将/arch:avx2添加到编译器标志。一种方法是修改您的构建文件夹中的CMakeCache.txt。寻找一条线CMAKE_CXX_FLAGS:STRING并将其修改为

CMAKE_CXX_FLAGS:STRING=/DWIN32 /D_WINDOWS /W3 /GR /EHsc /arch:AVX2 /fp:fast

但是,根据github上的this issue/arch:avx2此刻被打破(在HEAD)。

另一答案

Tensorflow在标志“tensorflow_WIN_CPU_SIMD_OPTIONS”上出错。

它是一个Flag,而不是一个布尔值。

Before Fix Image

After Fix Image


如何解决它

“Tensorflow-github / tensorflow / contrib / cmake / CMakeLists.txt”第34行,有:

option(tensorflow_WIN_CPU_SIMD_OPTIONS "Enables CPU SIMD instructions")

替换为

set(tensorflow_WIN_CPU_SIMD_OPTIONS "/arch:AVX" CACHE STRING "Enables CPU SIMD instructions" )

然后,清除cmake缓存(location),并重新配置。

您会发现tensorflow_WIN_CPU_SIMD_OPTIONS是带有输入区域的标志而不是复选框。


tensorflow_WIN_CPU_SIMD_OPTIONS

“/ arch:AVX”或“/ arch:AVX2”可用

以上是关于如何在Windows上使用SSE和AVX指令编译Tensor Flow?的主要内容,如果未能解决你的问题,请参考以下文章

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

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

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

TensorFlow关于 SSE AVX的Warning问题

如何在 Visual Studio 2017 15.5 中禁用 AVX?

MSVC /arch:[指令集] - SSE3、AVX、AVX2