以下のようなループを含むアプリケーションの 1 つで、並列 for を使用しています。私の理解では、parallel_for ループは範囲全体を反復しますが、必ずしも順番どおりではありませんが、それでも範囲全体を反復しますが、単純なカウントでは一貫性のない結果が得られます。
using namespace concurrency;
using namespace std;
#include <ppl.h>
#include <Windows.h>
#include <array>
#include <stdio.h>
int main()
{
combinable<DWORD64> count[10];
int b, c;
for (c = 0; c < 10; c++)
{
parallel_for(0, 52, [&](int a)
{
//printf("%d,", a);
for (b = a + 1; b < 52; b++)
{
count[c].local()++;
}
});
printf("\n%llu\n", count[c].combine(plus<DWORD64>()));
}
getchar();
}
a
0 から 51 までb
反復し、51 まで反復することを考慮するとa + 1
、count[c] の値は毎回 1326 [(n*n+1)/2 (n = 51)] である必要がありますか? しかし、そうではありません。実際、ランダムカウントを取得するたびに...しかし、最初のprintfステートメントのコメントをprintf("%d,", a);
魔法のように外すと、出力は修正されますか? これを修正するにはどうすればよいですか? これには私が解決していない同期の問題があり、printfステートメントは任意の待機時間を導入することで何らかの形で解決していると思われます。
parallel_for ループを処理/使用する正しい方法は何ですか?
解決済み
2 番目の反復ループ変数は main でスコープされていましたが、各スレッドでローカルにスコープされている必要があるため、2 番目のループで変数を宣言すると問題が解決しますが、それにもかかわらず問題を修正b
したループに printf を追加する理由は説明されていませんスコープが正しくなく、競合状態が発生しているa
b
以下のコードを修正
名前空間の同時実行を使用します。名前空間 std を使用します。
#include <ppl.h>
#include <Windows.h>
#include <array>
#include <stdio.h>
int main()
{
combinable<DWORD64> count[10];
int c;
for (c = 0; c < 10; c++)
{
parallel_for(0, 52, [&](int a)
{
//printf("%d,", a);
for (int b = a + 1; b < 52; b++)
{
count[c].local()++;
}
});
printf("\n%llu\n", count[c].combine(plus<DWORD64>()));
}
getchar();
}