我正在使用 OpenMP 编写 c++ 代码。我有一个全局巨大数组(100,000+ 个元素),将通过在 for 循环中添加值来修改它。有没有一种方法可以有效地让 OpenMP 为并行创建的每个线程维护其本地数组副本,然后在循环后加入?由于线程数是一个变量,我无法事先创建数组的本地副本。如果使用全局副本并通过同步锁解决竞争条件,则性能很糟糕。
谢谢!
编辑:抱歉不清楚。这是一些伪代码,希望可以澄清这种情况:
int* huge_array=new int[N];
memset(huge_array, 0, N*sizeof(int));
#pragma omp parallel for
for (i=0; i<n; i++)
{
get a value v independently
get a position p independently
// I have to set a lock here
omp_set_lock(&lock);
huge_array[p] += v;
omp_unset_lock(&lock);
}
有没有办法提高上面代码的性能?