OpenMP 更新结构体的最快方法
OpenMP fastest way to update a struct
在我的代码中,我有很多部分有一个双循环,我需要更新结构中的值。问题是它是一个结构数组,所以有很多去引用正在进行。下面是一个示例:
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++ 指针问题 - 通过方法更新指针
- 从另一个线程更新QT小部件的一种详细方法
- 从工作线程更新QtCharts的正确方法
- 游戏实体更新方法
- OpenGL-更新模型信息的最有效方法(例如模型矩阵)
- 用类方法更新指针的困难
- 是从C 中更新QML梯度值的最佳方法
- 在条件上更新变量的最快方法是什么?
- MSVC2015更新3变量模板解决方法
- 将项目"更新插入"到映射<键、shared_ptr的正确方法<foo>>
- 在运行时动态更新二进制文件(可执行文件)而不停止的任何类型的方法
- 矢量下标超出范围 - 更新方法
- 如何自动更新重写方法的 *this 返回类型
- 在JIT期间更新方法属性
- Qt模型视图:当数据存储和更改数据时,更新模型和视图的正确方法是什么::vector
- 如何在方法中更新向量
- OpenMP 更新结构体的最快方法
- C++更新 txt 文件方法
- Qt从子方法更新文本框