我想找到减少 OpenMP 中私有数组(1-D 或 2-D)的最佳方法,并在并行区域结束时使用关键语句。这是为了解决一个数组的问题,该数组的元素在所有线程的各个点都被递增,我通过在并行区域内声明临时数组来解决这个问题(即临时数组初始化为 0,然后在并行区域内递增,并添加到原来的共享数组中,最后从内存中删除)。
为了解决这个问题,我创建了以下宏来递增一个数组:
// This is in a frame.h file
static INT count,count2;
/* Increment 1-D array x by array y */
#define Arr1Inc(x,y,n) \
{ for(count=0;count<n;count++) \
x[count]+=y[count]; }
/* Increment 2-D array x by array y */
#define Arr2Inc(x,y,m,n) \
{ for(count2=0;count2<m;count2++) \
for(count=0;count<n;count++) \
x[count2][count]+=y[count2][count]; }
使用这些宏的示例如下:
// This is at the end of my parallel zone
// d1nfcx and d2nft are shared arrays
// d1nfcx_tmp and d2nft_tmp are private arrays
// mnodim and mnopo are the array sizes
#pragma omp critical (update_force)
{
Arr1Inc(d1nfcx,d1nfcx_tmp,mnopo)
Arr2Inc(d2nft,d2nft_tmp,mnodim,mnopo)
}
free(d1nfcx_tmp);
free(d2nft_tmp);
这似乎工作正常,但是,为了让它工作,我需要在我的并行区域开始时将 count 和 count2 变量声明为私有。有没有更好的方法来减少?
请注意,我需要它尽可能高效,因为我的数组可能非常大(> 100,000s 个元素)。
谢谢!