C++ OpenMP更新结构的最快方法

C++ OpenMP更新结构的最快方法,c++,c,struct,parallel-processing,openmp,C++,C,Struct,Parallel Processing,Openmp,在我的代码中,我有很多片段,其中有一个双循环,我需要更新结构中的值。问题是它是一个结构数组,因此有大量的去引用操作。以下是一个例子: for(i=0;i<y;i++) { for(j=0;j<x;j++) { index = i*x+j; y1 = (i + 1) % y; x1 = (j + 1) % x; y2 = (i

在我的代码中,我有很多片段,其中有一个双循环,我需要更新结构中的值。问题是它是一个结构数组,因此有大量的去引用操作。以下是一个例子:

    for(i=0;i<y;i++) {
            for(j=0;j<x;j++) {
                index = i*x+j;
                y1 = (i + 1) % y;
                x1 = (j + 1) % x;
                y2 = (i == 0) ? (i + y - 1) : (i - 1);
                x2 = (j == 0) ? (j + x - 1) : (j - 1);
                str[i *x + j].arr[0]  = c[index].arr[0];
                str[i *x + x1].arr[1] = c[index].arr[1]; 
                str[y1*x + j].arr[2]  = c[index].arr[2]; 
                str[i *x + x2].arr[3] = c[index].arr[3];
                str[y2*x + j].arr[4]  = c[index].arr[4]; 
                str[y1*x + x1].arr[5] = c[index].arr[5];
                str[y1*x + x2].arr[6] = c[index].arr[6];

            }
   }

for(i=0;i您尝试过类似的方法吗

#pragma omp parallel for
for(i=0;i<y;i++) {
    y1 = (i + 1) % y;
    y2 = i? i-1 : y-1;
    for(j=0;j<x;j++) {
        index = i*x+j;
        x1 = (j + 1) % x;
        x2 = j? j-1:x-1;
        str[i *x +  j].arr[0] = c[index].arr[0];
        str[i *x + x1].arr[1] = c[index].arr[1]; 
        str[y1*x +  j].arr[2] = c[index].arr[2]; 
        str[i *x + x2].arr[3] = c[index].arr[3];
        str[y2*x +  j].arr[4] = c[index].arr[4]; 
        str[y1*x + x1].arr[5] = c[index].arr[5];
        str[y1*x + x2].arr[6] = c[index].arr[6];

    }
}
#pragma omp parallel for

对于(i=0;i您是在多核系统上运行的吗?即使不将内容拆分为多核,您也可以进行很多小优化,但看起来您可能已经注意到了其中的一些。一个大问题是,C在存储阵列数据的方式上本质上是行主要的。这意味着X[i][j]和X[i][j+1]它们彼此相邻,而X[i][j]和X[i+1][j]不是,事实上可能很远。需要做的是确保你的索引是通过邻域顺序访问内存,而不是在大陆上跳跃。我在i7上运行它,但我也要在其他机器上测试它。我尝试使用pragma omp进行有无计划和崩溃。我的平均时间是10.4秒(最短10.20秒,最长11秒)。当我使用pragma时,速度会慢很多。我得到的时间与此更改几乎相同。因此,我想我无法对结构做太多处理。