如何在Windows系统上使用SSE和AVX指令编译TensorFlow?

7
使用最新版本的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

我正在使用Windows 10专业版64位平台,Visual Studio 2015社区版,Anaconda Python 3.6,以及cmake版本3.6.3(Tensor Flow不支持更高版本)。


旁注,他们最多可以提高3倍速度。如果您的计算主要是巨大矩阵乘法,您将看到这种加速。 - Yaroslav Bulatov
3个回答

6

我尝试着修复了那个问题,但不确定是否已经解决。

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,默认情况下启用了x86编译的SSE2支持,但对于x64编译不可用。对于x64编译,您可以选择使用AVX或AVX2。我在上面使用了AVX,因为我的CPU只支持AVX,如果您有兼容的CPU,可以尝试AVX2。
通过使用上述的CMakeLists.txt进行编译,编译过程比官方版本慢得多,并且有关“AVX / AVX2”的警告消失了,但有关SSE / SSE2 / 3/4.1 / 4.2的警告仍然存在。我认为这些警告可以被忽略,因为x64 MSBuild没有SSE支持。
我现在正在测试新的pip包。它可能比以前更快,但我不想编写新的基准测试...
任何对此感兴趣的人,请测试新软件包是否真的更快。
我在最新的git主分支上进行了所有这些操作,日期是2017-3-12。 pip软件包名称显示它是tensorflow 1.0.1。

使用此处的指示进行编译,加上这些修改后可以工作,但如果构建和运行GPU版本,则看不到加速。请注意,我也尝试了完全相同的AVX2方式,但正如@TLJ所提到的,它目前已经损坏了。 - Alexander Pacha

3

我认为您需要在编译器标志中添加/arch:avx2。一种方法是修改您构建文件夹中的CMakeCache.txt。查找一行CMAKE_CXX_FLAGS:STRING并将其修改为

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

然而,根据Github上这个问题的描述,目前/arch:avx2有些故障(在HEAD版本下)。


尝试了您建议的在构建文件夹中编辑CMakeCache.txt文件的方法...在卸载/重新安装新版本后,没有成功 :(. 是否没有cmake选项可以传递来完成同样的事情? - Aerophilic
CMakeLists.txt 文件中,标志 tensorflow_OPTIMIZE_FOR_NATIVE_ARCH(默认为 On)假定为每个选择编译代码的人自动设置 -march=native。在使用 gcc 时,这应该可以解决问题。我不确定它是否在 VC 上执行相同的操作。 - TLJ
@Aerophilic 我也在研究这个。根据MSDN,SSE2支持默认已启用。 - Wesley Ranger
1
@Aerophilic 嗯,SSE/SSE2 只适用于 x86,而对于 x64,您应该使用 AVX/AVX2。对于我的 CPU,只支持 AVX。我正在尝试使用 /arch:AVX 选项进行编译,如果成功了,我会在这里发布结果。 - Wesley Ranger

1

TensorFlow 在标志“tensorflow_WIN_CPU_SIMD_OPTIONS”上犯了一个错误。

它是一个标志,而不是布尔值。

修复前的图像

修复后的图像


如何修复

在"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缓存(位置),并重新配置。

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


tensorflow_WIN_CPU_SIMD_OPTIONS

可用的选项为"/arch:AVX"或"/arch:AVX2"


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接