Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/sharepoint/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 在cython中使用线程本地数组以便调整它们的大小?_Multithreading_Openmp_Cython - Fatal编程技术网

Multithreading 在cython中使用线程本地数组以便调整它们的大小?

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

我有一个interval treeish算法,我希望对使用线程的许多查询并行运行。问题是,那个么每个线程都需要自己的数组,因为我无法预先知道会有多少次点击

还有其他类似的问题,建议的解决方案总是使用一个大小为(K,t)的数组,其中K是输出长度,t是线程数。这对我不起作用,因为每个线程的K可能不同,每个线程可能需要调整数组大小以适应它得到的所有结果

伪代码:

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)”相比,开销要少得多
  • 在并行部分之后,必须在后处理步骤(也可以并行进行)中在最终容器中收集数据,或者后续算法应该能够处理容器集合

    下面是一个使用c++vector的示例(它已经内置了内存管理和不断增大的大小):

    %%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好)。我还认为,如果你有兴趣在那里发布它,它也可以应用于。