虚假分享诊断/预防

时间:2018-03-04 20:53:12

标签: c parallel-processing openmp false-sharing

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

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

我想所有这些都是错误共享的可能原因,但有哪些方法可以修复它?是否有任何操作(阅读与写作)或多或少可能导致错误的共享问题?

0 个答案:

没有答案