首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用clang-cl.exe和OpenMP工作设置Pythran以便在Windows上编译:需要一种传递编译器参数的方法

用clang-cl.exe和OpenMP工作设置Pythran以便在Windows上编译:需要一种传递编译器参数的方法
EN

Stack Overflow用户
提问于 2022-02-17 15:26:38
回答 1查看 311关注 0票数 1

我使用Pythran将Python代码编译成C/C++,并在Windows上支持OpenMP。现在,这些文档对于Windows来说并不是很好--它声明:"Windows支持正在进行,并且只使用Visual 2017或者更好的clang。注意,使用clang-cl.exe是默认设置。它可以通过CXX和CC环境变量进行更改。“

在玩游戏时,我发现您必须使用clang-cl.exe,否则代码就不会编译(MSVC不喜欢它)。

因此,首选编译器是clang-cl.exe,它是cl.exe的“下拉”替换,因此Clang 12是从VisualStudio2019安装程序中通过选择"C++ Clang“安装的,现在我有了C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\VC\Tools\Llvm\x64\bin\clang-cl.exe和LLVM链接器lld-link.exe --因为clang-cl.exe是默认的,所以我不需要更改任何安装文件,所以我只是在Pythran之前运行vcvarsall.bat,这样编译器目录就在路径中了。(我后来注意到,为了让lld-link.exe使用一些黑客攻击distutils,_msvccompiler.py是必需的,切换link.exelld-link.exe,并且注释掉'/LTCG'标志,因为Clang没有这个选项,那么它就能工作了.但还是没有OpenMP..。

我在Anaconda中用虚拟环境编译了其中一个示例,其中安装了pip和SciPy库(OpenBLAS后端),因为MKL支持几乎没有文档化。它需要pythran-openblas包,所以我也安装了它,它用clang-cl编译得很好,我可以导入它。我发现Python\Lib\site-packages\pythran\pythran-win32.cfg可以通过cflags传递正确的编译器参数,比如:-Xclang -fopenmp -march=ivybridge和运行pythran script.py时,所有这些标志都以正确的方式传递(使用默认值是不正确的)。但是..。文档中的这个示例仍然没有并行运行。

我在Stack上发现:clang-cl -cc1 --help将输出clang可以处理的所有参数。在openmp下,它声明:-fopenmp解析OpenMP杂注并生成并行代码。因此,我在这里猜测,在Pythran文档中给出的示例没有可以并行的OpenMP实用程序。他们为什么要这么做?不知道,就像他们展示的那样,通过OpenMP使它变得非常快,但我不能在Windows上复制它。我有6个核心/12个虚拟的,所以我应该看到一个加速。

还有其他人有另一个OpenMP示例,我可以在上面试用吗?或者用另一种方式解决了使用OpenMP的谜团?

非常感谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-02-20 03:30:46

在我直接给他发邮件后,Pythran项目的维护者回复了我。似乎只有通过显式#omp语句才支持OpenMP。所以,不久前,当他们编写文档时,它会推断出并行例程,但现在不行。因此,要将示例转换为OpenMP,需要进行一些更改:

代码语言:javascript
复制
#pythran export arc_distance(float[], float[], float[], float[])
import numpy as np
def arc_distance(theta_1, phi_1, theta_2, phi_2):
"""
Calculates the pairwise arc distance
between all points in vector a and b.
"""
    size = theta_1.size
    distance_matrix=np.empty_like(theta_1)
    #omp parallel for
    for i in range(size):
        temp = (np.sin((theta_2[i]-theta_1[i])/2)**2 + np.cos(theta_1[i])*np.cos(theta_2[i]) * np.sin((phi_2[i]-phi_1[i])/2)**2)
        distance_matrix[i] = 2 * np.arctan2(np.sqrt(temp), np.sqrt(1-temp))
    return distance_matrix

但是..。还有一些没有文档化的编译器参数需要被传递才能让一个OpenBLAS支持的OpenMP模块工作,我花了几个小时才弄清楚。下面是它们:

Pythran OpenBLAS Windows 10设置:

查找文件Python\Lib\site-packages\pythran\pythran-win32.cfg

添加到library_dirs:'C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\VC\Tools\Llvm\x64\lib'

添加到c标志中:-Xclang -fopenmp

添加到ld频标:\libiomp5md.lib

将blas设置为:blas=pythran-openblas

然后,它应该使用一个:pythran -v arc_distance.py来编译--添加-v标志对于查找问题非常有用(冗长的编译器模式),但不需要。

Pythran Intel MKL 10设置(Anaconda3默认库):我也决定为什么不尝试在默认Anaconda3上工作,其中NumPy和SciPy等都是用MKL编译的?我的公司使用Anaconda3,所以每个人都有英特尔MKL。和OpenBLAS设置一样,Windows的MKL设置也没有文档化。所以我想明白了:

查找文件Python\Lib\site-packages\pythran\pythran-win32.cfg,(很可能在C:\Usersusername\Anaconda3 3处)

添加到include_dirs='C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\VC\Tools\Llvm\x64\lib', '[Python]\Library\include'

添加到c标志中:-Xclang -fopenmp

添加到ld频标:\libomp.lib

将blas设置为:blas=mkl

现在,您将注意到与OpenBLAS设置相比,上面的一些奇怪的事情。库路径没有填充,而是必须在包含路径中(不要问为什么,我不知道)。而且,OpenMP库是不同的。同样,我不知道为什么与OpenBLAS一起工作的那个拒绝与英特尔MKL合作。但是无论如何,这会让你在一个基于英特尔MKL的系统上使用Pythran和OpenMP。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71160885

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档