Multithreading 在cython中使用线程本地数组以便调整它们的大小?
我有一个interval treeish算法,我希望对使用线程的许多查询并行运行。问题是,那个么每个线程都需要自己的数组,因为我无法预先知道会有多少次点击 还有其他类似的问题,建议的解决方案总是使用一个大小为(K,t)的数组,其中K是输出长度,t是线程数。这对我不起作用,因为每个线程的K可能不同,每个线程可能需要调整数组大小以适应它得到的所有结果 伪代码:Multithreading 在cython中使用线程本地数组以便调整它们的大小?,multithreading,openmp,cython,Multithreading,Openmp,Cython,我有一个interval treeish算法,我希望对使用线程的许多查询并行运行。问题是,那个么每个线程都需要自己的数组,因为我无法预先知道会有多少次点击 还有其他类似的问题,建议的解决方案总是使用一个大小为(K,t)的数组,其中K是输出长度,t是线程数。这对我不起作用,因为每个线程的K可能不同,每个线程可能需要调整数组大小以适应它得到的所有结果 伪代码: for i in prange(len(starts)): qs, qe, qx = starts[i], ends[i], in
for i in prange(len(starts)):
qs, qe, qx = starts[i], ends[i], index[i]
results = t.search(qs, qe)
if len(results) + nfound < len(output):
# add result to output
else:
# resize array
# then add results
prange中的i的(len(开始)):
qs,qe,qx=开始[i],结束[i],索引[i]
结果=t.search(qs、qe)
如果len(结果)+nfound
通常的模式是每个线程都有自己的容器,这是速度/复杂性和内存开销之间的折衷:
i
-value)”相比,开销要少得多%%cython-+-c=/openmp--link args=/openmp
来自cython.parallel import prange,threadid
从libcpp.vector cimport vector
cimport openmp
def calc_并联(N):
cdef int i、k、tid
cdef int n=n
cdef向量[vector[int]]vecs
#每个线程都有自己的容器
vecs.resize(openmp.omp\u get\u max\u threads())
对于prange中的i(n,nogil=True):
tid=threadid()
对于范围(i)中的k:
#使用线程的容器
vecs[tid]。推回(k)#用于计算的虚拟对象
返回向量
在许多情况下,对线程数使用omp\u get\u max\u threads()
会高估实际线程数。在prange
中显式设置线程数可能更可靠,即
。。。
线程数=2
调整大小(线程数)
对于prange中的i(n,nogil=True,num\u threads=num\u threads):
...
使用纯C也可以采用类似的方法,但在这种情况下需要更多的锅炉板代码(内存管理)。您知道
K
的绝对上限吗?不知道,所以我猜这是不可能的。但是如果是这样的话,这也是一个可以接受的答案,如果我得到一个简短的解释:)或者对于q数量的查询,我想搜索的间隔是q*我猜,但这太大了:)另一件事可以做的是让每个线程都有一个线程本地C数组,使用malloc
,realloc
和free
。说明了一些但不是全部的想法。目前我对写这篇文章并没有太大的热情,但希望这足以让你开始(并在你开始工作时自己写一个答案:)。我认为对“每线程”变量使用vector
是一个很好的方法(如果你已经在使用C++,肯定比malloc/free好)。我还认为,如果你有兴趣在那里发布它,它也可以应用于。