cython在中共享内存cython.parallel.prange公司b

2024-04-29 02:13:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个函数foo,它以指向内存的指针为参数,同时对该内存进行读写操作:

cdef void foo (double *data):
   data[some_index_int] = some_value_double
   do_something_dependent_on (data)

我分配给data如下:

^{pr2}$

我现在的问题是:不同的线程如何处理这个问题?我的猜测是,data所指向的内存将由所有线程共享,并且在函数foo内“同时”读写。这会把所有结果搞砸,因为不能依赖之前设置的数据值(在foo内)?我的猜测是正确的还是在cython编译器中实现了一些神奇的安全带?在

事先非常感谢。在


Tags: 函数内存data参数indexfoosome线程
2条回答

我假设没有对data线程的读写同步锁,它将读/写内存位置,并覆盖彼此的更改。如果没有某种同步,您将无法获得一致的结果。在

尽管文档(http://docs.cython.org/src/userguide/parallelism.html)似乎建议OpenMP(默认后端)会自动创建线程局部变量。在

一个好的方法是让主数组位于线程之外。然后给每个线程一个指针,指向线程应该计算的主数组的一部分。在

以下示例是矩阵乘法的实现(类似于二维数组的dot),其中:

c = a*b

这里的并行性是在a的行上实现的。检查如何将指针传递给multiply函数,以便允许不同的线程共享相同的数组。在

^{pr2}$

要检查是否可以使用此脚本:

import time

import numpy as np

import _stack

a = np.random.random((10000,500))
b = np.random.random((500,2000))

t = time.clock()
c = np.dot(a, b)
print('finished dot: {} s'.format(time.clock()-t))

t = time.clock()
c2 = _stack.mydot(a, b)
print('finished mydot: {} s'.format(time.clock()-t))

print 'Passed test:', np.allclose(c, c2)

在我的电脑上显示:

finished dot: 0.601547366526 s
finished mydot: 2.834147917 s
Passed test: True

如果a的行数小于然后的列数或{}中的列数,mydot会更糟,需要更好地检查哪个维度可以实现并行。在

相关问题 更多 >