【问题标题】:Can cython be compiled with icc?cython可以用icc编译吗?
【发布时间】:2016-06-19 05:53:15
【问题描述】:

我正在尝试在 Ubuntu 14.04 上使用 icc 编译器从源代码构建 cython,因为我的 python 是使用 Intel icc 编译器编译的。

当我尝试使用 pip3 install cython 安装 cython 然后运行 ​​cython 时出现以下错误

Traceback (most recent call last):
File "/usr/local/bin/cython", line 9, in <module>
load_entry_point('Cython==0.24', 'console_scripts', 'cython')()
File "/usr/lib/python3/dist-packages/pkg_resources.py", line 351, in load_entry_point
return get_distribution(dist).load_entry_point(group, name)
File "/usr/lib/python3/dist-packages/pkg_resources.py", line 2363, in load_entry_point
return ep.load()
File "/usr/lib/python3/dist-packages/pkg_resources.py", line 2088, in load
entry = __import__(self.module_name, globals(),globals(), ['__name__'])
File "/usr/local/lib/python3.4/dist-packages/Cython/Compiler/Main.py", line 28, in <module>
from .Scanning import PyrexScanner, FileSourceDescriptor
ImportError: /usr/local/lib/python3.4/dist-packages/Cython/Compiler/Scanning.cpython-34m.so: undefined symbol: __intel_sse2_strchr 

如何使用 icc 编译器从源代码安装 cython?

我试过了,还是不行

来自cython目录(从github下载)

python3.4 setup.py CC=icc

我收到以下消息 -

/home/aa/libPython/cython/Cython/Distutils/build_ext.py:20: UserWarning:    
Cython.Distutils.build_ext does not properly handle dependencies and is deprectated. Use Cython.Build.build_ext instead.
"Cython.Distutils.build_ext does not properly handle dependencies "
 Unable to find pgen, not compiling formal grammar.
 invalid command name 'CC=icc'

【问题讨论】:

    标签: python-3.x ubuntu-14.04 cython distutils icc


    【解决方案1】:

    CC=icc 不足以用 icc 构建。您还应该与 icc 链接(https://stackoverflow.com/a/10891764/196561; icc 会将其内部库添加到 ELF 文件中),因此为您的 setup.py 找到链接器变量的名称,可能是 LD 并将其设置为 icc LD=icc(默认可能是gcc)。

    其实是LINKCC - https://github.com/cython/cython/blob/970c2fc0e676ca22016e14147ada0edba937dc6b/Cython/Build/BuildExecutable.py

    CC = get_config_var('CC', os.environ.get('CC', ''))
    CFLAGS = get_config_var('CFLAGS') + ' ' + os.environ.get('CFLAGS', '')
    LINKCC = get_config_var('LINKCC', os.environ.get('LINKCC', CC))
    

    因此,使用 icc 正确构建 cython 应该使用 CC=icc LINKCC=icc,不知道应该如何将变量传递到 setup.py,检查 How to tell distutils to use gcc? 或尝试

    CC=icc LINKCC=icc python3.4 setup.py
    

    更新:根据来自 gansub 的消息,“LDSHARED=icc”环境。变量将有助于构建 cython:“您需要设置环境变量 LDSHARED=icc” - https://chat.stackoverflow.com/transcript/message/31231907#31231907https://stackoverflow.com/a/37914227

    Syrtis Major 更新:有文章“Cython* 中的线程并行性”https://software.intel.com/en-us/articles/thread-parallelism-in-cython 由 Nguyen,Loc Q(英特尔),2016 年 12 月 15 日推荐 LDSHARED="icc -shared" CC=icc:: p>

    要显式使用英特尔 icc 编译此应用程序,请使用以下命令执行 setup.py 文件:

     $ LDSHARED="icc -shared" CC=icc python setup.py build_ext --inplace
    

    【讨论】:

    • gansub,但 python3.4 setup.py CC=icc 是您使用的命令并且处理正确?我没有 cython 也没有 icc,也没有 pyhton。但是从引用的错误消息中我可以得出结论,链接步骤不正确,由ldgcc 完成,而不是由icc 完成。因此,请检查您的构建系统以与 icc 进行链接
    • 使用distutils.cfg文件设置CC和LINKCC,如stackoverflow.com/questions/16737260/…所示
    • gansub,您的链接命令x86_64-linux-gnu-gcc 仍然不正确。
    • 仅供参考,这是一个很好的参考software.intel.com/en-us/articles/thread-parallelism-in-cython。它还建议LDSHARED="icc -shared" CC=icc
    猜你喜欢
    • 2011-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多