【问题标题】:OpenMP and memory bandwidth restrictionOpenMP 和内存带宽限制
【发布时间】:2013-03-05 20:46:56
【问题描述】:

编辑:我的第一个代码示例是错误的。用更简单的方法修复。

我为大型向量和矩阵之间的代数运算实现了一个 C++ 库。 我发现在 x86-x64 CPU 上,OpenMP 并行向量加法、点积等并不比单线程快。 并行操作比单线程快 -1% - 6%。 发生这种情况是因为内存带宽限制(我认为)。

所以,问题是,这样的代码是否有真正的性能优势:

void DenseMatrix::identity()
{
    assert(height == width);
    size_t i = 0;
    #pragma omp parallel for if (height > OPENMP_BREAK2)
    for(unsigned int y = 0; y < height; y++)
        for(unsigned int x = 0; x < width; x++, i++)
            elements[i] = x == y ? 1 : 0;
}

在此示例中,使用 OpenMP 没有严重的缺陷。 但是,如果我正在使用稀疏向量和稀疏矩阵处理 OpenMP,例如,我不能使用 *.push_back(),在这种情况下,问题变得很严重。 (稀疏向量的元素不像密集向量那样连续,因此并行编程有一个缺点,因为结果元素可以随时到达 - 而不是从低到高的索引)

【问题讨论】:

    标签: c++ parallel-processing openmp memory-bandwidth


    【解决方案1】:

    我不认为这是内存带宽的问题。我清楚地看到r 上的一个问题:r 是从多个线程访问的,这会导致 数据竞争错误共享。虚假分享会严重影响您的表现。

    我想知道你是否能得到正确的答案,因为r 上存在数据竞争。你得到正确答案了吗?

    但是,解决方案将非常简单。对r进行的操作是reduction,可以通过OpenMP的reduction子句轻松实现。

    尝试在#pragma omp parallel 之后简单地附加reduction(+ : r)

    (注意:double 上的添加不是可交换和关联的。您可能会看到一些精度错误,或者与串行代码的结果有些差异。)

    【讨论】:

      猜你喜欢
      • 2015-06-02
      • 2014-06-10
      • 1970-01-01
      • 2011-02-26
      • 1970-01-01
      • 1970-01-01
      • 2021-03-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多