私のアプリケーションでは、次のように、約 1,000 万個のアイテムを実行する 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 実装に切り替えることなく) もっと活用する方法はありますか?