求和运算的局部并行计算

2024-04-20 16:10:03 发布

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

我已经开始玩弄并行编程和cython/openmp,我有一个简单的程序,它使用prange对数组求和:

import numpy as np
from cython.parallel import prange
from cython import boundscheck, wraparound

@boundscheck(False)
@wraparound(False)

def parallel_summation(double[:] vec):

    cdef int n = vec.shape[0]
    cdef double total
    cdef int i

    for i in prange(n, nogil=True):
        total += vec[i]

    return total

它似乎可以与一个设置.py文件。不过,我想知道是否有可能调整这个功能,并有一点更多的控制处理器在做什么。你知道吗

假设我有4个处理器:我想把向量分解成4个部分,然后让每个处理器局部地添加其中的元素。最后,我可以合并每个处理器的结果,得到总的和。从cython文档中,我无法收集这样的东西是否可行(文档有点稀疏)。你知道吗

如果有人能解释一下是否/如何使用cython/openmp实现这样的功能,或者帮助查找一些相关的示例(在网上很难找到简单的示例),我将不胜感激。你知道吗


Tags: fromimportfalseparallel处理器cythoninttotal
1条回答
网友
1楼 · 发布于 2024-04-20 16:10:03

I want to split the vector to be summed into 4 parts, and then have each processor locally add the elements inside. Then at the end, I can combine the results from each processor to get the total sum.

这正是这里已经发生的事情。Cython从你的就地操作推断出你想做一个缩减。OpenMP将使用total变量的私有(零初始化)副本实现并行循环,并将它们全部添加到循环末尾的total。你知道吗

在生成的C中,如下所示:

#pragma omp parallel
{
    #pragma omp for firstprivate(__pyx_v_i) lastprivate(__pyx_v_i) reduction(+:__pyx_v_total)
    for (__pyx_t_2 = 0; __pyx_t_2 < __pyx_t_3; __pyx_t_2++){
        {
            __pyx_v_i = (int)(0 + 1 * __pyx_t_2);
            __pyx_t_4 = __pyx_v_i;
            __pyx_v_total = (__pyx_v_total + (*((double *) ( /* dim=0 */ (__pyx_v_vec.data + __pyx_t_4 * __pyx_v_vec.strides[0]) ))));
        }
    }
}

您只需要启用OpenMPas described here。你知道吗

您应该在代码中更改的一件事是初始化total = 0,否则它只是一个可能包含垃圾的单元化C变量。你知道吗

相关问题 更多 >