gpt4 book ai didi

macos - Cython:prange 正在重复而不是并行化

转载 作者:行者123 更新时间:2023-12-04 17:40:24 27 4
gpt4 key购买 nike

我有以下用于并行归约的简单 Cython 函数:

# cython: boundscheck = False
# cython: initializedcheck = False
# cython: wraparound = False
# cython: cdivision = True
# cython: language_level = 3

from cython.parallel import parallel, prange

cpdef double simple_reduction(int n, int num_threads):
cdef int i
cdef int sum = 0

for i in prange(n, nogil=True, num_threads=num_threads):
sum += 1
return sum

这会可怕地返回以下内容:

In [3]: simple_reduction(n=10, num_threads=1)                                                                                                              
Out[3]: 10.0

In [4]: simple_reduction(n=10, num_threads=2)
Out[4]: 20.0

In [5]: simple_reduction(n=10, num_threads=3)
Out[5]: 30.0

换句话说,它似乎是在为每个线程重复循环的所有 n 次迭代,而不是在每个线程上并行执行迭代。知道发生了什么吗?

我在 macOS Mojave 10.14.3 上使用 Python 3.7.1 和 Cython 0.29.2。

更新:这是我的 setup.py 文件:

from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext
from Cython.Build import cythonize

import os
import sys

if sys.platform == 'darwin':
os.environ['CC'] = 'gcc-8'
os.environ['CXX'] = 'g++-8'

EXT_MODULES = [Extension('foo', ['foo.pyx'],
extra_compile_args=['-fopenmp'],
extra_link_args=['-fopenmp'])]

setup(name='foo',
ext_modules=cythonize(EXT_MODULES))

我已经单独安装了 GCC,并且在使用 OSX 时必须设置环境变量 'CC' 和 'CXX' 以避免 OSX 别名那些 clang 的问题。

最佳答案

我通过首先使用 Anaconda 安装 gcc 修复了这个错误:

conda install gcc

然后更改 setup.py 中的行以使用新的编译器:

if sys.platform == 'darwin':
os.environ['CC'] = '/anaconda3/bin/gcc'
os.environ['CXX'] = '/anaconda3/bin/g++'

使用 Anaconda gcc(而不是我最初使用的 brew 安装的 gcc)并没有立即解决问题。由于以下错误,它无法编译:

/anaconda3/envs/python36/lib/gcc/x86_64-apple-darwin11.4.2/4.8.5/include-fixed/limits.h:168:61: fatal error: limits.h: No such file or directory #include_next /* recurse down to the real one */

此处的问题必须归因于 macOS 10.14 和 XCode 10.0。但是@Maxxx 在 this related question 中给出的解决方案为我工作。安装后隐藏在命令行工具目录下的.pkg

/Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg

编译的代码和并行性按预期工作。

更新:更新到 OSX Catalina 后,此修复程序不再有效,因为上面的 .pkg 文件不再存在。我找到了一个新的解决方案 from reading this related question .在我的例子中,将以下路径导出到 CPATH 解决了这个问题。

export CPATH=~/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include

关于macos - Cython:prange 正在重复而不是并行化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54776301/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com