c++ - 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 == 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];

            }
   }

我想尽可能加快速度,也许使用 OpenMP。我认为会有很多错误共享,而且我也无法使用指针。你们知道加快速度的有效方法(以及类似的代码)

最佳答案

你尝试过这样的事情吗?

#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];

    }
}

我认为不会有太多的错误共享,因为 str[] 仅读取,而 c[] 似乎在线程之间很好地分离(应该有不同线程写入的缓存行很少重叠)。只要尝试计时即可。如果扩展性良好,那么错误共享就不是问题。

关于c++ - OpenMP 更新结构的最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19339392/

相关文章:

c++ - 指向同一对象的不同基类型的指针和唯一指针

c - "get_user_pages"是如何工作的(对于 linux 驱动程序)

c - 如何在C中打开连接到主cmd的新cmd

局部变量和寄存器变量可以声明为外部吗?

c++ - 为什么我的 For 循环没有完成收集数据以保存在动态分配的数组中?

c - 自动为 C 结构分配内存

c# - 在 C# 中使用 DLL 导入很困难

c++ - 了解后缀表达式评估代码

c++ - 使用 std::array 移植 C++ 代码以使用 CUDA 推力的简单方法?

有人可以解释一下为什么我们会得到以下输出吗?