0

我想找到减少 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 个元素)。

谢谢!

4

0 回答 0