こんにちは、私は長さ N の配列を持っています。これを「サイズ」のプロセッサ間でできる限り分割したいと考えています。N/サイズには余りがあります。たとえば、1000 個の配列要素を 7 プロセスで割ったもの、または 14 プロセスを 3 プロセスで割ったものです。
私は、MPI で作業を共有する方法が少なくともいくつかあることを認識しています。
for (i=rank; i<N;i+=size){ a[i] = DO_SOME_WORK }
ただし、これは配列を連続したチャンクに分割しません。これは、IO の理由でより高速であると信じているため、実行したいと考えています。
私が知っているもう1つは次のとおりです。
int count = N / size;
int start = rank * count;
int stop = start + count;
// now perform the loop
int nloops = 0;
for (int i=start; i<stop; ++i)
{
a[i] = DO_SOME_WORK;
}
ただし、この方法では、最初の例では 1000/7 = 142 = カウントが得られます。したがって、最後のランクは 852 で始まり、994 で終わります。最後の 6 行は無視されます。
このようなものを前のコードに追加するのが最善の解決策でしょうか?
int remainder = N%size;
int start = N-remainder;
if (rank == 0){
for (i=start;i<N;i++){
a[i] = DO_SOME_WORK;
}
これは面倒に思えますが、それが最善の解決策である場合、他の場所で見たことがないことに驚いています。
助けてくれてありがとう!