【问题标题】:False sharing in OpenMP when writing to a single vector写入单个向量时 OpenMP 中的错误共享
【发布时间】:2018-09-11 20:19:29
【问题描述】:

我使用Tim Matterson's lecture notes学习OpenMP,他举了一个虚假共享的例子,如下所示。代码很简单,用于从 4.0/(1+x*x) 的数值积分计算 pi,x 的范围是 0 到 1。代码使用向量来包含 4.0/(1+x*x) 的值对于从 0 到 1 的每个 x,然后在最后对向量求和:

#include <omp.h>
static long num_steps = 100000;
double step;
#define NUM_THREADS 2
void main()
{
    int i, nthreads; double pi, sum[NUM_THREADS];
    step = 1.0/(double)num_steps;
    omp_set_num_threads(NUM_THREADS);
    #pragma omp parallel
    {
        int i, id, nthrds;
        double x;
        id = omp_get_thread_num();
        nthrds = omp_get_num_threads();
        if (id == 0) nthreads = nthrds;
        for (i=id, sum[id]=0.0; i<num_steps; i=i+nthrds){
            x = (i+0.5)*step;
            sum[id] += 4.0/(1.0+x*x);
        }
    }
    for (i=0; pi=0.0; i<nthreads;i++) pi += sum[i]*step;
}

我对这个例子中的虚假分享有一些疑问:

  1. 写入数组的工作在两个线程(即 [thread0,thread1,thread0,thread1,...]如果我们使用#pragma omp parallel for,那么数组将被划分为[thread0, thread0, thread0, ...., thread1, thread1, thread1, ...],那么我们是否还有错误共享,现在地址是每个线程访问的距离远吗?
  2. 如果我的工作使用 #pragma omp parallel for 写入与我的输入向量具有 1 对 1 对应关系的输出向量(例如,输入是预测变量矩阵,输出是预测向量) ,那我什么时候需要担心虚假分享?

【问题讨论】:

    标签: parallel-processing openmp false-sharing


    【解决方案1】:

    本教程不断向 Stack Overflow 发送困惑的人 - 有时自下而上学习并不是一个好主意。

    1. 数组sum 只有2 === NUM_THREADS 条目,即[sum of thread 0, sum of thread 1]。这些值很可能在同一缓存行上,因此会导致错误共享。

    2. 如果输入和输出向量足够多(即每个线程有数百个元素),那就没问题了。您应该始终使用惯用的 OpenMP,即使用 parallel for 而不是本教程有问题的示例中展示的手动工作共享。那么默认情况下就可以了,因为 OpenMP 会将相邻的索引分配给同一个线程。

    如果您在教程中没有达到重点,请确保使用内置的归约关键字,而不是像示例中公开的那样手动组合归约。

    【讨论】:

      猜你喜欢
      • 2012-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-17
      • 1970-01-01
      • 2015-01-17
      • 1970-01-01
      相关资源
      最近更新 更多