私は C++ で高性能の動的プログラムを作成しており、その結果は M × N テーブル (およそ 2000 行 × 30000 列) に配置されています。
各エントリ ( r、c ) は、テーブル内の他のいくつかの列のいくつかの行に依存します。
行rの計算をP個のプロセッサ間で並列化する最も明白な方法は、データを静的に分割することです。つまり、プロセッサpにすべての有効なkのエントリ (r, p + k P ) を計算させます。
ただし、異なる列のエントリは計算に多少異なる時間がかかります (たとえば、一方のエントリは他方のエントリの 5 倍の時間がかかる場合があります) 。早く終了する CPU は、代わりにまだ追いついている CPU から作業を盗みます。
これにアプローチする 1 つの方法は、既に計算された列の数を指定するアトミック グローバル カウンターを保持し、CPU がより多くの作業を必要とするたびにそれを増やすことです。ただし、これにより、テーブル内のすべてのエントリを計算した後、すべての CPU が同じグローバル カウンタ
にアクセスするように強制されます。つまり、プログラムがある程度シリアライズされます。各エントリの計算は多かれ少なかれ迅速なプロセスであるため、これはやや望ましくありません。
ですから、私の質問は次のとおり
です。この動的パーティショニングをよりスケーラブルな方法で実行する方法はありますか (つまり、すべてのエントリを計算した後に単一のグローバル カウンターにアクセスする必要はありません)。