C OpenMP中数组内容的并行更新-并发添加元素

C OpenMP中数组内容的并行更新-并发添加元素,c,parallel-processing,openmp,C,Parallel Processing,Openmp,我有以下代码,我想使其并行(伪代码) int na=10000000; int nb=na; 双A[na]; 双B[2*na]; 双a; 对于(int j=0;j有两种方法: 对值使用原子更新 #pragma omp parallel for for(int j=0;j<nb;j++) { // make sure to declare i locally! int i = fun(); #pragma omp atomic A[i]+=5.0*i; }

我有以下代码,我想使其并行(伪代码)

int na=10000000;
int nb=na;
双A[na];
双B[2*na];
双a;

对于(int j=0;j有两种方法:

  • 对值使用原子更新

    #pragma omp parallel for
    for(int j=0;j<nb;j++)
    {
        // make sure to declare i locally!
        int i = fun();
        #pragma omp atomic
        A[i]+=5.0*i;
    }
    
    这将为每个线程创建一个
    a
    的本地副本,该副本在并行区域之后添加到外部
    a
    中。这需要更多内存和一些计算,但并行代码本身可以最有效地工作。如果
    a
    较小且每次更新的计算量较小,则使用此方法

顺便说一句:不要在并行应用程序中使用
rand()


编辑:在使用
B
的示例中,您可以安全地将
omp-atomic
reduce
分别应用于语句,因为每个操作只需要在原子上独立执行。

我不使用rand()。此处使用rand作为示例,以展示您编写的有趣的内容()此外,我是否可以使用
#pragma omp atomic
进行多个更新(例如
A[I]+=fun()B[I+5]+=fun())
etc?您不能在一次原子更新中更新两个值-但如果更新彼此不依赖,则可能仍然有效。这需要一个特定的示例。可能有两个不同的
原子
子句?每个要更新的值一个。请编辑您的问题,以包含显示依赖项CI的两次更新的特定示例请为更新发送电子邮件。
#pragma omp parallel for
for(int j=0;j<nb;j++)
{
    // make sure to declare i locally!
    int i = fun();
    #pragma omp atomic
    A[i]+=5.0*i;
}
#pragma omp parallel for reduction(+:A)
for(int j=0;j<nb;j++)
{
    // make sure to declare i locally!
    int i = fun();
    A[i]+=5.0*i;
}