0

在我的代码中,我有以下部分(简化)

  #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[] 时可能存在缓存冲突问题。

我想所有这些都是错误共享的可能原因,但是有什么方法可以解决它?是否有任何操作(读取与写入)或多或少会导致错误共享问题?

4

0 回答 0