Parallel.For Iterations の異なるスレッド アフィニティ
Parallel
APIが複数のスレッドを意味するという仮定に基づいているため、質問は誤解を招きます。Parallel
API は Data Parallel 処理を指しますがmultiple threads
、特に上記のコードでは、スレッドごとの作業がほとんどないため、 の呼び出しを保証するものではありません。
API の場合Parallel
、次のように最大並列度を設定できます。
ParallelOptions parallelOption = new ParallelOptions();
parallelOption.MaxDegreeOfParallelism = Environment.ProcessorCount;
Parallel.For(0, 20, parallelOption, i =>
ただし、並列処理に呼び出されるスレッドの数は保証されません。スレッドは から使用され、処理する作業の量に基づいて、処理に必要な数を超えるかどうかを実行時に決定するThreadPool
ためです。CLR
one thread
同じParallel
ループで次の print を試すことができますThread.Current.ManageThreadId
。これにより、ループで呼び出されるスレッドの数に関して明確なアイデアが得られParallel
ます。
スレッドを明示的に使用する必要がありますか? また、アフィニティは 1 回だけ設定する必要がありますか?
編集:スレッドバージョンを試しましたが、同じことが起こります。明示的な 2 つのスレッドでも、両方とも 255 をコンソールに書き込みます。現在、このコマンドはスレッドではなくプロセス用のようです。
複数のスレッドのコードを投稿できますか、このようなことを試すことができますか。
Thread[] threadArray = new Thread[2];
threadArray[0] = new Thread(<ThreadDelegate>);
threadArray[1] = new Thread(<ThreadDelegate>);
threadArray[0]. ProcessorAffinity = <Set Processor Affinity>
threadArray[1]. ProcessorAffinity = <Set Processor Affinity>
アフィニティを正しく割り当てたと仮定すると、それらを出力してさまざまな値を見つけることができます。次のProcessThread.ProcessorAffinityを確認してください。
上記のリンクでわかるように、hexadecimal
プロセッサのアフィニティに基づいて値を設定できますが、値が何を意味するかわからない場合254, 255
は、実際にその数のプロセッサを搭載したサーバーを持っているかどうかを確認してください。
編集:
プログラムに次の編集を試してみてください (2 つのスレッド ID が出力されているという事実に基づいて)、両方のスレッドが画像に含まれるまでに、両方とも同じ値の を取得します。閉鎖の問題を回避するためvariable i
に が必要です。local variable
Parallel.For(0,2,i=>{
int local = i;
if(local=0)
Process.GetCurrentProcess().ProcessorAffinity = (System.IntPtr)(255);
if(local==1)
Process.GetCurrentProcess().ProcessorAffinity = (System.IntPtr)(254);
Thread.Sleep(25);// to make sure both set their affinities
Console.WriteLine(Process.GetCurrentProcess().ProcessorAffinity);
});
EDIT 2:(実際のロジック実行前に、両方のスレッドがインクリメントする可能性があるため、ほとんど機能しません)
int local = -1;
Parallel.For(0,2,i=>{
Interlocked.Increment(ref local);
if(local=0)
Process.GetCurrentProcess().ProcessorAffinity = (System.IntPtr)(255);
if(local==1)
Process.GetCurrentProcess().ProcessorAffinity = (System.IntPtr)(254);
Thread.Sleep(25);// to make sure both set their affinities
Console.WriteLine(Process.GetCurrentProcess().ProcessorAffinity);
});