c++ - OpenMP 的扩展不佳(缓存争用?)

标签 c++ multithreading parallel-processing openmp

我正在尝试了解有关 OpenMP 和缓存争用的更多信息,因此我编写了一个简单的程序来更好地理解它的工作原理。对于简单的 vector 相加,我的线程缩放很糟糕,但我不明白为什么。这是我的程序:

#include <iostream>
#include <omp.h>
#include <vector>

using namespace std;

int main(){

    // Initialize stuff
    int nuElements=20000000; // Number of elements
    int i;
    vector<int> x, y, z;
    x.assign(nuElements,0);
    y.assign(nuElements,0);
    z.assign(nuElements,0);
    double start; // Timer

    for (i=0;i<nuElements;++i){
       x[i]=i;
       y[i]=i;
    }    

    // Increase the threads by 1 every time, and add the two vectors  
    for (int t=1;t<5;++t){

        // Re-set z vector values
        z.clear();

        // Set number of threads for this iteration
        omp_set_num_threads(t);

        // Start timer
        start=omp_get_wtime();

        // Parallel for
#pragma omp parallel for
        for (i=0;i<nuElements;++i)
        {
            z[i]=x[i]+y[i];
        }
        // Print wall time
        cout<<"Time for "<<omp_get_max_threads()<<" thread(s) : "<<omp_get_wtime()-start<<endl;
    }
    return 0;
}

运行此命令会产生以下输出:

Time for 1 thread(s) : 0.020606
Time for 2 thread(s) : 0.022671
Time for 3 thread(s) : 0.026737
Time for 4 thread(s) : 0.02825

我使用此命令进行编译:clang++ -O3 -std=c++11 -fopenmp=libiomp5 test_omp.cpp

正如您所看到的,随着线程数量的增加,扩展会变得更糟。我在 4 核 Intel-i7 处理器上运行它。有谁知道发生了什么事吗?

最佳答案

您受到内存带宽的限制,而不是 CPU 速度。如果您所做的只是加法和复制,那么只需要一个 CPU 就能让您的内存保持忙碌,因此添加更多内核并没有帮助。

如果您想了解添加更多线程的好处,请尝试在足够小以适合 L1 或 L2 缓存的内存上执行更复杂的操作。

关于c++ - OpenMP 的扩展不佳(缓存争用?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37427032/

相关文章:

c++ - 从字符串中读取多个逗号分隔的 double

c++ - 我应该如何为小于标准的 std::mersenne_twister_engine 选择参数?

c++ - 合并两个排序的链表

multithreading - Arduino 是否支持线程?

c++ - std::async 在指定 launch::async 时不执行

database - 当我初始化 greenplum 时,它会打印 [FATAL] :-Errors generated from parallel processes

c++ - 读取 Unicode 文件

java - 在后台任务 javafx 中执行进度指示器

ubuntu - 可以有多少个并行用户进程?

python - 函数内部的并行性?