2011-06-30 1 views
0

私はparallel_for fnc呼び出しに変換したいforループを持っています。私のコードはこの変換が成功するためのすべての基準(Parallel_Programming_with_Microsoft_Visual_C_plus_plus、p.7で説明されています)を満たしていますが、実装が難しいと感じています。ここに私の例があります:ループをparallel_for fncの呼び出しに変換することはできますか?

numbers_from_file_からの数字の各ペアが掛け合わされ、results_に格納されるというシナリオです。それを動作させるためには、変数iを2つ増分しなければならない(別の対にスキップする)。残念ながら、この本の例では、forループのbodyをparallel_for fncの呼び出しに変換する方法を示しています。
ループをparallel_for fncの呼び出しに変換することはできますか?

+2

本当にあなたのコードですか、それとも単なる例ですか?それがあなたのコードなら、スレッディングはあなたのパフォーマンスを傷つけるでしょう。助けてはいけません。スレッドを生成するオーバーヘッドがあります。一般的には、スレッド化が勝つためには、オーバーヘッドのコストよりも多くの作業をスレッドで行う必要があります。そして、バッファに格納されている数を一緒に乗算するのはそれではありません。それらの数値が 'Big_Int'クラスであっても、それらを乗算するのにかかる時間は無視できます。これを数のグループに分割し、一緒に積み重ねることで、各スレッドが多数の乗算を行うようにする必要があります。 –

+0

@smallB - これはあなたがこの質問のために考え出すのに最適なタイトルですか? – razlebe

+0

@ニコルあなたが言っていることは事実かもしれません。おそらくこの例では本当です。実際には、私はそれらのことについて学びたいと思っています。そして、私はperfについてはあまり気にしません。あなたの入力をありがとう。 – smallB

答えて

1

MSDNには、stepというパラメータがあります。これを使って。

0

あなたのコードは

for (unsigned j = 0; j < numbers_from_file_.size()/2; ++j) 
{ 
    results_.push_back(numbers_from_file_[2*j] * numbers_from_file_[2*j + 1]); 
} 
+0

それはあなたが作り出したものと同じであるように見えるかもしれませんが、分割もそれほど多くの乗算もしません;) – smallB

+0

@smallB:それらは無料です。ハードウェアレベルでは、 'sizeof(numbers_from_file :: value_type)'の乗算が必要です。そしてその部門は一度のビットシフトです。 – MSalters

+0

これはあなたがビットシフトについて言っていることに当てはまりますが、実際には無料ではありません(ビットシフトのコストはいくらかあります)。第二の問題は、あなたのコードは、私が持っているものにはっきりとはっきりしていないことです(しかし、議論の余地があり、議論したくありません)。それは私をVSに結び付けるという単純な事実のために、私はそれを受け入れる準備をしていないだけです。他のオプションがありますので、なぜそれらを使用しないのですか?しかし、あなたの答えに感謝します。 – smallB

0

と同じように見えるはい、できます。結果を最初にサイズ変更してから追加する必要があります。

results_.resize(numbers_from_file.size()/2); 
parallel_for(static_cast<std::size_t>(0), numbers_from_file_.size(), static_cast<std::size_t>(2), [&](std::size_t i) { 
    results_[i/2] = numbers_from_file_[i] * numbers_from_file_[i + 1]); 
}); 

これはもちろん簡単ですが、保証はありませんが、かなり直接的に置き換え可能である必要があります。

関連する問題