如何在 openMP 中使用保护数组中的一个元素?

How to use protect one element in an array in openMP?

例如:

int a[100];
int i=0;
for(i=0;i<100;i++)
{
   a[i]=i;
}
#pragma omp parallel for firstprivate(a[0])
for(i=0;i<100;i++)
{

    a[i]=a[i]+a[((i+1)%100)];

}

但是编译失败:

error: syntax error in omp clause
 #pragma omp parallel for firstprivate(a[0])
                                        ^

抱歉我之前的描述。我希望输出为:a[i]=a[i]+a[((i+1)%100)],例如 a[10]=a[10]+a[11],a[ 99]=a[99]+a[0]。但是,当i变成99时,a[99]应该是a[99]=a[99]+a[0]。但是当线程执行a[99]=a[99]+a[0]时,a[0]的值已经被另一个并行线程改变为a[0]=a[0]+a[1](它具有依赖性)。我应该怎么做才能保证每个线程都可以使用 a[i] 中的原始值来完成 a[i]=a[i]+a[((i+1)%100)] ?

您的代码无法保证获得正确的结果,因为它存在竞争条件。解决这个问题的一种方法是像这样在不合适的地方进行

void foo2(int * __restrict a, int * __restrict b) {
    int i;
    #pragma omp parallel for schedule(static)
    for (i = 0; i<N; i++) {
        b[i] = a[i] + a[((i + 1) % N)];
    }   
}

如果你真的想就地做,那就有点复杂了

void foo3(int a[]) {    
    int n = N - 1;
    #pragma omp parallel
    {
        int i;
        int ithread = omp_get_thread_num();
        int nthread = omp_get_num_threads();
        int start = ithread*n / nthread;
        int finish = (ithread + 1)*n/ nthread;
        int tmp = a[finish];
        for (i = start; i < finish-1; i++) {
            a[i] += a[i + 1];
        }
        a[finish-1] += tmp;
    }
    a[n] += a[0];
}