0

あるプロセスが列に対して何らかの計算を行い、その列を一時的な配列に保存し、MPI_Bcast を使用して他のすべてのプロセスにブロードキャストするという問題を解決していますが、常に受信側の配列のすべてのゼロを取得することになります終わり。

以下は私が使用している私のコードです:

//nProc = no of processors;
//helperA = 2D Array i.e. helperA[size][size]
// colK = 1D Array i.e. colK[size]

for (int k = 0; k < size; ++k) {
    if (k % nProc == rank) {
                    // One of the process will do this calculation
        int temp = 0;
        for (int j = k + 1; j < size; ++j) {
            helperA[j][k] = helperA[j][k]/helperA[k][k];
            colK[temp++] = helperA[j][k];
        }
    }

    MPI_Bcast(colK, size - k - 1, MPI_DOUBLE, rank, MPI_COMM_WORLD);    
    // After this other process should get the colK updated with the calculation

    for (int i = k + 1; i < size; ++i) {
        if (i % nProc == rank) {
            int temp = 0;
            for (int j = k + 1; j < size; ++j) {
                                    // Here colK is always zero
                printf("%d %f \n", rank, colK[temp]);
                helperA[j][i] = helperA[j][i] - (colK[temp++] * helperA[k][i]);
            }
        }
    }
}

ここで何が間違っているのかわかりません。ヘルプ/提案をお願いします。

4

1 に答える 1

1

colK(私はテキスト ボックスを介してコードをデバッグするのが本当に好きではないので、送信する前に実際にデータが存在し、それsize-k-1がすべてのランクで正しい値であることを確認するための基本的なチェックを既に行っていると仮定します。)

呼び出しに渡すランク値MPI_BCASTは、「ルート」プロセスのランクである必要があります。つまり、ブロードキャストするすべてのデータを持つプロセスです。この引数は、すべての呼び出しプロセスで同じでなければなりません。あなたのコードは各呼び出しプロセスのランクを渡すように見えるので、誰もが異なるルート プロセスと通信しようとします。

于 2013-10-08T12:45:50.943 に答える