在openmp

时间:2015-10-12 00:16:10

标签: c++ multithreading openmp

我正在尝试使用多个线程组装一个大向量。每个线程都通过自己的线程向量读取并写入大向量的特定部分(索引是连续的)。

条目总数是固定数N,每个线程都会将N / numberOfThreads条目写入大向量。我做了以下实验:

//each vector contains the data that a particular thread needs to process
//and has the same length = N/numberOfThreads;
vector<vector<double> > threadVectors; 
//the big vector that each thread needs to write into
vector<double> totalVector(N); 

//initialize threadVectors ...

#pramga omp parallel
{
    int threadId = omp_get_thread_num();
    vector<double>& threadVector = threadVectors[threadId];
    int globalStartId = threadId * threadVector.size();
    std::copy(threadVector.begin(), threadVector.end(),
        totalVector.begin() + globalStartId);
}

我正在运行并行部分的计时10次重复和N = 1e7。在我试验1-24线程后,我获得了以下加速:

线程数,时间,加速w.r.t到单线程

1:0.1797加速0.99

2:0.1362加速1.31

3:0.1430加速1.25

4:0.1249加速1.43

5:0.1314加速1.36

6:0.1446加速1.23

7:0.1343加速1.33

8:0.1414加速1.26

9:0.1370加速1.30

10:0.1387加速1.28

11:0.1434加速1.24

12:0.1344加速1.33

13:0.1299加速1.37

14:0.1303加速1.37

16:0.1362加速1.31

18:0.1341加速1.33

20:0.1384加速1.29

22:0.1319加速1.35

23:0.1303加速1.37

24:0.1298加速1.37

该机器是12核,超线程(24线程)。看起来加速很差,而算法并不涉及任何种族或锁定。

任何人都知道这个问题吗?

1 个答案:

答案 0 :(得分:0)

由于您的线程任务非常内存密集型,将数据从一个内存块复制到另一个内存块,因此性能受内存限制。这不是可以很好地扩展的东西。添加更多内核对任何内核都无济于事,因为它们都在等待主内存中的数据。这就是为什么你的结果会有两个线程略有改进,但之后没有额外的改进。

让它运行得更快的唯一方法是加快记忆速度,但这是一个硬件问题。