在我的代码中,我有以下部分(简化)
#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[] 时可能存在缓存冲突问题。
我想所有这些都是错误共享的可能原因,但是有什么方法可以解决它?是否有任何操作(读取与写入)或多或少会导致错误共享问题?