在我的代码中,我有以下部分(简化)
#pragma omp parallel for
for(i = 0; i < N; i++) {
int x = struct_arr[i].x;
double y = struct_arr[i].y;
double z = struct_arr[i].z;
double w = struct_arr[i].w;
out[i].x = get_new_x(x,y,z,w);
}
,当并行化时,会遭受严重的减速。我怀疑存在错误共享的问题,并且使用valgrind我发现在给定的执行中存在大量缓存未命中。
我没有提供有关get_new_x中发生的事情的详细信息,因为我希望一次只关注一件事;猜测在运行函数调用的部分中是否存在一些错误共享是否合理?每个线程都有自己的x,y,z,w局部变量,但它们都将从同一个数组中读取。这可能足以导致缓存未命中吗?类似地,我怀疑从get_new_x写到out []时可能存在缓存冲突问题。
我想所有这些都是错误共享的可能原因,但有哪些方法可以修复它?是否有任何操作(阅读与写作)或多或少可能导致错误的共享问题?