0

ペアごとに処理する必要があるデータのセットがあるとします (ペア要素の順序は重要ではないため、これらは組み合わせであり、順列ではありません)。そのために複数のスレッドを利用したいとします。ただし、各データを一度に 1 つのスレッドで処理できるという制約があります。任意のサイズのデータ​​セットに対して、可能な組み合わせの全空間を一度にカバーしながら、データのペアをスレッドに割り当てることができる、優れたパーティショニング戦略を提供するアルゴリズムを探しています。可能な各ペアの処理時間は等しいと仮定します。

たとえば、D0、D1、D2、D3、D4、D5 の 6 つのデータがあるとします。

これらを最適に処理するには、次のようにします。

               Thread 1    Thread 2    Thread 3
Time Slot 1     (D0,D5)     (D1,D4)     (D2,D3)
Time Slot 2     (D0,D4)     (D1,D3)     (D2,D5)
Time Slot 3     (D0,D3)     (D1,D2)     (D4,D5)
Time Slot 4     (D0,D2)     (D1,D5)     (D3,D4)
Time Slot 5     (D0,D1)     (D2,D4)     (D3,D5)

同様に、8個のデータ: D0、D1、D2、D3、D4、D5、D6、D7

               Thread 1    Thread 2    Thread 3    Thread 4
Time Slot 1     (D0,D7)     (D1,D6)     (D2,D5)     (D3,D4)
Time Slot 2     (D0,D6)     (D1,D5)     (D2,D4)     (D3,D7)
Time Slot 3     (D0,D5)     (D1,D4)     (D2,D3)     (D6,D7)
Time Slot 4     (D0,D4)     (D1,D3)     (D2,D7)     (D5,D6)
Time Slot 5     (D0,D3)     (D1,D2)     (D4,D6)     (D5,D7)
Time Slot 6     (D0,D2)     (D1,D7)     (D3,D6)     (D4,D5)
Time Slot 7     (D0,D1)     (D2,D6)     (D3,D5)     (D4,D7)

私は上記を自分の手で考え出しましたが、使用しなければならなかったプロセスはそれぞれでわずかに異なっていたため、より大きなデータ セットに対してこれらを生成するコードに変換するのは難しいようです。これらのペアを適切かつ効率的に生成するアルゴリズムのアイデアはありますか? 解決策を検索しようとしましたが、探している結果を得るために問題をより適切に表現する方法が正確にはわかりません。

4

2 に答える 2

0

これらのペアを適切かつ効率的に生成するアルゴリズムのアイデアはありますか?

簡単な解決策は、各データに対応する使用中のブール配列を作成することです。データの処理中は true になり、処理が完了すると false に戻ります。また、[d0, d1]、[d0, d2]、[d0, d3]、.... というデータの組み合わせのすべての to-be-done キューを作成します。

to-be-done キューを通過し、両方のデータが現在使用されていないデータ ペアを見つける単一のスケジューラ スレッドを用意します。両方のデータ ピースの使用中の配列をチェックし、両方のデータ項目の使用中の配列を true に設定し、スレッドによって処理されるようにペアをワーク キューに入れます。1 つ (または両方) が使用されているペアを見つけると、それを to-be-done キューの最後に追加します。結果が返されると、使用中ステータスが false に戻されます。to-be-done キューが空になり、in-use がすべて false になるまで繰り返します。

この単一のスケジューラ スレッドは、衝突を検出すると少しスピンしますが、スピンの数は、処理に比べて CPU の割合が比較的小さいはずです。

したがって、次のようになります。

  • [d0、d1]を確認してください。どちらも使用していません。d0 は現在使用中です。d1 は現在使用中です。スケジュール。
  • [d0、d2]を確認してください。d0 は使用中です。
  • [d0、d3]を確認してください。d0 は使用中です。...
  • [d1、d2]を確認してください。d1 が使用されています。...
  • [d2、d3]を確認してください。どちらも使用していません。d2 は現在使用中です。d3は現在使用中です。スケジュール。...

最初は多くの処理が行われますが、ブール配列に対するチェックはわずかな量の作業です。これを改善するための 1 つの方法は、To-be-Done キューを時々シャッフルすることです。

于 2013-09-05T22:16:21.307 に答える