在我的应用程序中,我有一个运行大约一千万个项目的 for 循环,如下所示:
int main(int argc, char* argv [])
{
unsigned int nNodes = 10000000;
Node** nodeList = new Node* [nNodes];
initialiseNodes(nodeList); // nodes are initialised here
for (unsigned int ii = 0l ii < nNodes; ++ii)
nodeList[ii]->update();
showOutput(nodeList) // show the output in some way
}
我不会详细说明节点是如何被初始化或显示的。重要的是该Node::update()
方法是一个小方法,独立于其他节点。因此,并行执行这个 for 循环将是非常有利的。因为这只是一件小事,所以这次我想远离 OpenCL/CUDA/OpenMP,所以我改用了 C++ Concurrency::parallel_for
。那么代码如下所示:
#include <ppl.h>
int main(int argc, char* argv [])
{
unsigned int nNodes = 10000000;
Node** nodeList = new Node* [nNodes];
initialiseNodes(nodeList); // nodes are initialised here
Concurrency::parallel_for(unsigned int(0), nNodes, [&](unsigned int ii) {
nodeList[ii]->update();
});
showOutput(nodeList) // show the output in some way
}
这确实加快了程序一点点,但我发现通常只有 20% 左右。坦率地说,我期待更多。有人可以告诉我这是否是使用时的典型加速因素parallel_for
吗?或者有没有办法从中获得更多收益(无需切换到 GPU 实现)?