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

新手上路,请多包涵

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

默认过程: https ://github.com/tensorflow/tensorflow/tree/r0.12/tensorflow/contrib/cmake 没有提到如何做到这一点。

我发现的唯一参考是使用 Google 的 Bazel: 如何使用 SSE4.2 和 AVX 指令编译 Tensorflow?

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

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

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

原文由 Aerophilic 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.1k
1 个回答

好吧,我试图解决这个问题,但我不确定它是否真的有效。

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.14.2 的警告仍然存在。我认为这些警告可以忽略,因为 x64 MSBuild 没有 SSE 支持。

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

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

我在最后一个 git master 分支上做了所有这些,2017-3-12。 pip 包名显示是 tensorflow 1.0.1

原文由 Wesley Ranger 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题