我正在尝试使用多个线程来组装一个大向量。每个线程都在读取自己的线程向量,并写入大向量的特定部分(索引是连续的)。
条目总数为固定数目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线程后,我得到了以下加速:
线程数,时间,加快单线程速度
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
该计算机是具有超线程(24个线程)的12个内核。看起来加速比很差,算法不涉及任何比赛或锁定。
有人知道这个问题吗?
最佳答案
由于线程任务非常占用内存,因此将数据从一个内存块复制到另一个内存块,因此性能受到内存的限制。这不是一个很好的扩展。添加更多内核无济于事,因为它们都在等待主内存中的数据。这就是为什么您的结果在使用两个线程的情况下会有所改善,但在此之后没有其他改善的原因。
使它运行更快的唯一方法是加速内存,但这是硬件问题。