我正在使用 Pythran 将 Python 代码编译成 C/C++,并在 Windows 上支持 OpenMP。现在文档不适用于 Windows - 它指出:“Windows 支持正在进行中,并且仅针对带有 Visual Studio 2017 或更好的 clang-cl 的 Python 3.5+。请注意,使用 clang-cl.exe 是默认设置. 可以通过CXX和CC环境变量来改变。"
从玩弄我发现你必须使用clang-cl.exe
,否则代码将无法编译(MSVC 不喜欢它)。
因此,首选编译器是Clang 12clang-cl.exe
的“插入式”替代品,它是cl.exe
通过选择“C++ Clang tools for Windows”从 Visual Studio 2019 安装程序安装的,现在我拥有C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\VC\Tools\Llvm\x64\bin\clang-cl.exe
LLVM 链接器lld-link.exe
- 因为clang-cl.exe
是默认值我不需要更改任何设置文件,我只是vcvarsall.bat
在 Pythran 之前运行,所以编译器目录在路径中。(我后来注意到lld-link.exe
需要对 distutils _msvccompiler.py 进行一些黑客攻击,切换link.exe
到lld-link.exe
并注释掉该'/LTCG'
标志,因为 Clang 没有该选项,然后它可以工作......但仍然没有 OpenMP......
我在 Anaconda 中使用虚拟环境编译了一个示例,该环境pip
安装了 NumPy 和 SciPy 库(OpenBLAS 后端),因为几乎没有记录 MKL 支持。它需要这个pythran-openblas
包,所以我也安装了它,它编译得很好,clang-cl
我可以毫无问题地导入它。我发现 [Python]\Lib\site-packages\pythran\pythran-win32.cfg 有一个选项可以传递cflags
,我可以在其中键入正确的编译器参数,例如:-Xclang -fopenmp -march=ivybridge
当运行 pythran [script.py] 时,所有这些标志都被传递正确的方法(使用默认值是不正确的)。但是......来自文档的这个例子仍然没有并行运行。
我在 Stack Exchange 上发现:clang-cl -cc1 --help
会输出 clang 可以处理的所有参数。在 openmp 下它声明:-fopenmp
解析 OpenMP 编译指示并生成并行代码。所以我的猜测是 Pythran 文档中给出的示例没有 OpenMP pragma 可以并行。现在他们为什么要这样做?不知道,因为他们展示了一个通过 OpenMP 使其速度更快的示例,但我无法在 Windows 上重现它。而且我有 6 个核心 / 12 个虚拟,所以我应该看到加速。
其他人有另一个 OpenMP 示例,我可以尝试一下???还是以另一种方式解决了使用 OpenMP 的谜团?
非常感激!