减少cython并行中的数组

     2023-02-17     283

关键词:

【中文标题】减少cython并行中的数组【英文标题】:Reduction of array in cython parallel 【发布时间】:2016-04-10 18:02:05 【问题描述】:

我有一个需要包含不同事物总和的数组,因此我想对其每个元素执行归约。 代码如下:

cdef int *a=<int *>malloc(sizeof(int) * 3)
for i in range(3):
    a[i]=1*i
cdef int *b
for i in prange(1000,nogil=True,num_threads=10):
    b=res() #res returns an array initialized to 1s
    with gil: #if commented this line gives erroneous results 
        for k in range(3):
            a[k]+=b[k]
for i in range(3):
    print a[i]

直到有 with gil 代码运行良好,否则会给出错误的结果。 如何在不使用 gil 的情况下处理数组每个元素的减少,因为我认为 gil 会阻塞其他线程

【问题讨论】:

cdef int k了吗? 【参考方案1】:

在实践中通常的减少方式是对每个线程单独进行求和,然后在最后将它们相加。您可以手动执行此操作,例如

cdef int *b
cdef int *a_local # version of a that is duplicated by each thread
cdef int i,j,k

# set up as before
cdef int *a=<int *>malloc(sizeof(int) * 3)
for i in range(3):
    a[i]=1*i

# multithreaded from here
with nogil, parallel(num_threads=10):
    # setup and initialise a_local on each thread
    a_local = <int*>malloc(sizeof(int)*3)
    for k in range(3):
        a_local[k] = 0

    for i in prange(1000):
        b=res() # Note - you never free b
                # this is likely a memory leak....

        for j in range(3):
            a_local[j]+=b[j]

    # finally at the end add them all together.
    # this needs to be done `with gil:` to avoid race conditions 
    # but it isn't a problem
    # because it's only a small amount of work being done
    with gil:
        for k in range(3):
            a[k] += a_local[k]
    free(a_local)

【讨论】:

和我给出的例子有什么不同?? a_local 是为每个线程创建的,并在不使用 gil 的情况下在主循环中汇总(因此这可以并行发生)。最后,将每个线程的a_locals 添加在一起。这需要 gil,但每个线程只需要发生一次(而不是每个循环一次),因此成本很小。

减少 OpenMP 中的数组

】减少OpenMP中的数组【英文标题】:ReducingonarrayinOpenMP【发布时间】:2013-12-2305:16:22【问题描述】:我正在尝试并行化以下程序,但不知道如何减少数组。我知道这样做是不可能的,但有其他选择吗?谢谢。(我在m上添加了减法... 查看详情

如何并行执行 cython 文件编译?

】如何并行执行cython文件编译?【英文标题】:Howtoperformcythonfilescompilationinparallel?【发布时间】:2016-10-2702:25:09【问题描述】:我想并行执行cython文件编译。所以,我查看Cython.Build源文件,并找到cythonize函数的以下签名:defcython... 查看详情

如何从 Cython 中的数组列表中检索数组条目

】如何从Cython中的数组列表中检索数组条目【英文标题】:HowtoretrievearrayentriesfromalistofarrayinCython【发布时间】:2020-05-0816:18:40【问题描述】:我正在尝试使用Cython加速Python代码的计算。它确实服务于它的目的。但我有一个问题... 查看详情

cython中的二维数组切片

】cython中的二维数组切片【英文标题】:twodimensionalarrayslicingincython【发布时间】:2017-10-0413:25:51【问题描述】:我有一个简单的问题,为什么这样没有效率:importnumpyasnpcimportnumpyasc_npimportcythondeffunction():cdefc_np.ndarray[double,ndim=2]A=... 查看详情

使用 Cython 启用并行性

】使用Cython启用并行性【英文标题】:EnablingParallelismwithCython【发布时间】:2018-04-0904:36:42【问题描述】:我正在尝试让Cython的parallel包的prange函数工作,似乎没有并行性生效。为了拥有一个MWE,我从Cython:AGuideforPythonProgrammers书... 查看详情

控制并行循环中的线程数并减少开销

】控制并行循环中的线程数并减少开销【英文标题】:ControllingNumberofThreadsinParallelLoops&ReducingOverhead【发布时间】:2017-05-0712:47:01【问题描述】:在我的Fortran95代码中,我有一系列嵌套的DO循环,整个循环需要大量时间来计算... 查看详情

使用 OPTION (MAXDOP 1) 减少 SQL Server 中的并行性是不是安全?

】使用OPTION(MAXDOP1)减少SQLServer中的并行性是不是安全?【英文标题】:ItissafetouseOPTION(MAXDOP1)toreduceparallelisminSQLServer?使用OPTION(MAXDOP1)减少SQLServer中的并行性是否安全?【发布时间】:2021-06-1402:37:03【问题描述】:我正在尝试使用O... 查看详情

Cython 似乎通过减少时间分析器而不是核心代码的开销来提供加速?

】Cython似乎通过减少时间分析器而不是核心代码的开销来提供加速?【英文标题】:Cythonseemstoprovidespeed-upbyreducingtheoverheadintimeprofilerratherthanthecorecode?【发布时间】:2018-03-1423:57:32【问题描述】:我试图学习和使用cython来加速我... 查看详情

使用交错寻址方法并行减少存储冲突

】使用交错寻址方法并行减少存储冲突【英文标题】:Bankconflictinparallelreductionusinginterleavedaddressingmethod【发布时间】:2017-04-0507:42:31【问题描述】:我正在阅读MarkHarris的关于在CUDA中优化并行缩减的演示文稿。这是一张我遇到问... 查看详情

gpu上的并行减少和计算错误的opencl

】gpu上的并行减少和计算错误的opencl【英文标题】:Parallelreductionsumongpucomputeswrongopencl【发布时间】:2016-03-2913:36:01【问题描述】:所以我在全局内存中的gpu上写了一个并行归约和,因为我的gpu没有共享内存(我相信这意味着我... 查看详情

在 Cython 的结构中使用指针数组

】在Cython的结构中使用指针数组【英文标题】:UsingapointerarraywithinastructinCython【发布时间】:2014-09-1216:06:05【问题描述】:我正在尝试围绕C库编写Cython包装器。我对Cython很陌生,所以如果问题很明显,我提前道歉。在文件wrapper.... 查看详情

在 cython 的循环中创建 c++ 映射

】在cython的循环中创建c++映射【英文标题】:Creatingc++mapsinaloopincython【发布时间】:2017-08-2823:17:19【问题描述】:我正在尝试创建一个cython函数,该函数迭代两个numpy字符串数组,并根据其中找到的数据创建一个新的字典列表。... 查看详情

Cython 中动态大小的对象数组

】Cython中动态大小的对象数组【英文标题】:DynamicallysizedarrayofobjectsinCython【发布时间】:2018-06-2401:19:21【问题描述】:如何在Cython中执行与以下C++代码等效的操作?typedefvector<double>dvec;dvec*arr=newdvec[n];//nisanunsignedint(unknownatco... 查看详情

为啥在迭代 NumPy 数组时 Cython 比 Numba 慢得多?

】为啥在迭代NumPy数组时Cython比Numba慢得多?【英文标题】:WhyisCythonsomuchslowerthanNumbawheniteratingoverNumPyarrays?为什么在迭代NumPy数组时Cython比Numba慢得多?【发布时间】:2019-04-0918:43:36【问题描述】:在遍历NumPy数组时,Numba似乎比Cy... 查看详情

数组的并行求和比 C++ 中的顺序求和慢

】数组的并行求和比C++中的顺序求和慢【英文标题】:ParallelsummationofthearrayisslowerthanthesequentialoneinC++【发布时间】:2019-01-1406:30:13【问题描述】:我用C++std::thread编写了数组的并行求和代码。但是并行求和需要0.6s,顺序求和需要... 查看详情

PHP中的并行数组赋值

】PHP中的并行数组赋值【英文标题】:ParallelarrayassignmentinPHP【发布时间】:2011-01-1201:24:39【问题描述】:大多数语言都可以很容易地使用一个命令来获取像[1,2,3]这样的数组并将这些值分配给变量a、b和c。例如,在Perl中你可以这... 查看详情

使用 Cython 加速连接组件算法

】使用Cython加速连接组件算法【英文标题】:UsingCythontospeedupconnectedcomponentsalgorithm【发布时间】:2012-08-2003:55:45【问题描述】:首先,我在windowsxp机器上使用python[2.7.2]、numpy[1.6.2rc1]、cython[0.16]、gcc[MinGW]编译器。我需要一个3D连... 查看详情

Cython:从参考获得时,Numpy 数组缺少两个第一个元素

】Cython:从参考获得时,Numpy数组缺少两个第一个元素【英文标题】:Cython:Numpyarraymissingtwofirstelementswhenobtainedfromreference【发布时间】:2018-01-1512:31:22【问题描述】:这是最奇怪的错误,我试图从一个返回reference向量的c++函数中... 查看详情