我想让下面的代码并行化:
for(int c=0; c<n; ++c) {
Work(someArray, c);
}
我是这样做的:
#include <thread>
#include <vector>
auto iterationsPerCore = n/numCPU;
std::vector<std::future<void>> futures;
for(auto th = 0; th < numCPU; ++th) {
for(auto n = th * iterationsPerCore; n < (th+1) * iterationsPerCore; ++n) {
auto ftr = std::async( std::launch::deferred | std::launch::async,
[n, iterationsPerCore, someArray]()
{
for(auto m = n; m < n + iterationsPerCore; ++m)
Work(someArray, m);
}
);
futures.push_back(std::move(ftr));
}
for(auto& ftr : futures)
ftr.wait();
}
// rest of iterations: n%iterationsPerCore
for(auto r = numCPU * iterationsPerCore; r < n; ++r)
Work(someArray, r);
问题是它在 Intel CPU 上的运行速度仅快50% ,而在 AMD 上则快300%。我在三个 Intel CPU(Nehalem 2core+HT、Sandy Bridge 2core+HT、Ivy Brigde 4core+HT)上运行它。AMD 处理器是 4 核解锁的 Phenom II x2。在 2 核 Intel 处理器上,4 线程运行速度提高 50%。在 4 核上,它在 4 个线程上的运行速度也提高了 50%。我正在使用 VS2012、Windows 7 进行测试。
当我尝试使用 8 个线程时,它比 Intel 上的串行循环慢 8 倍。我想这是由HT引起的。
你怎么看待这件事?这种行为的原因是什么?也许代码不正确?