【发布时间】:2012-12-12 19:49:36
【问题描述】:
我想让下面的代码并行化:
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 引起的。
你怎么看?这种行为的原因是什么?也许代码不正确?
【问题讨论】:
-
超线程使某些工作负载在开启时运行速度变慢。这可能是其中之一。在关闭 HT 的情况下进行测试,这样您就可以只使用实际内核。
-
你在哪个平台上使用了哪个编译器?
-
@Donnie 在 2 核 Intel 处理器上,它在 4 个线程下运行速度提高了 50%。在 4 核上,它在 4 个线程上的运行速度也提高了 50%。当我尝试使用 8 个线程时,它比串行循环慢 8 倍。明天我将关闭 HT 并检查结果。目前我无法使用 Intel CPU 的计算机。
-
@bamboon VS2012,Windows 7。
-
有关平台的具体信息(具体使用了哪些处理器、什么编译器、您生成的工作项数量以及每个平台上的计算时间可能对回答问题有很大帮助,所以您真的应该将这些信息编辑到您的问题中
标签: c++ multithreading concurrency c++11