现在在Windows上使用最新版本的Tensor Flow,我试图让所有内容尽可能高效地运行。但是,即使从源代码编译,我仍然无法弄清楚如何启用SSE和AVX指令。
默认流程: https://github.com/tensorflow/tensorflow/tree/r0.12/tensorflow/contrib/cmake 没有提到如何做到这一点。
我发现的唯一参考是使用谷歌的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)
任何帮助表示赞赏!
答案 0 :(得分: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
是否可用并使用它。对于MSDN和MSDN,默认情况下对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包。它可能比以前更快,但我不想写一个新的基准......
任何对此感兴趣的人,请测试新包装是否真的更快。
我在2017-3-12的持续git master分支上做了所有这些。 pip包名称显示它是tensorflow 1.0.1
答案 1 :(得分:2)
我认为您必须将/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)。
答案 2 :(得分:0)
Tensorflow在标志“tensorflow_WIN_CPU_SIMD_OPTIONS”上出错。
它是一个Flag,而不是一个布尔值。
“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缓存(After Fix Image),并重新配置。
你会发现tensorflow_WIN_CPU_SIMD_OPTIONS是带有输入区域的标志而不是复选框。
“/ arch:AVX”或“/ arch:AVX2”可用