0

私は初心者の MPI ユーザーであり、計算用の並列コードで間違いを犯した可能性があります。

大規模なデータセットで反復推定を計算する必要があり、C で MPI を使用して並列に計算したいと考えています。

入力パラメーター ('param_1',param_3,'table_1','table_2','table_3') に基づいて、出力データセット ('param_2') 内の要素を推定する標準 (ANSI) C 関数 ('myFunc') を作成しました。 ) と前の反復 ('param_2') の推定。新しい推定値 ('param_2') をチャンクに分割すると、計算を並列に実行できます。

コードのプロファイリングを行ったところ、計算は各ノード (スレッド) でほぼ同時に開始されましたが、計算は順次 (一定の時間間隔で) 次々と終了していることに気付きました。共有リソースなどを使用しているようです...スレッド間のすべての同時実行を排除しようとしましたが、MPI で問題を解決するのに十分な経験がありません。

すべての MPI スレッドには、宣言された変数の独自の「コピー」があり、それらを互いに独立して使用していると思っていたので、スレッドがパラメーターの独自のコピーを持っているときに、スレッドが計算を完了するのを待つ理由がわかりません.. .

コードの単純なフィールド バージョンは次のとおりです。

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

#include <mpi.h>

#define X 131
#define Y 131
#define Z 150

#define MASTER 0

float table_1[31][8];
float table_2[31][4];
float table_3[31][2];

int main(int argc, char* argv[]) {

    float *param_1;
    float *param_2;
    float param_3;
    float *chunk;

    int file_length = X*Y*Z;

    float myFunc(int i, float *param_1, float *param_2, float param_3);

    MPI_Init(&argc, &argv);

    MPI_Comm_rank(MPI_COMM_WORLD, &taskid);
    MPI_Comm_size(MPI_COMM_WORLD, &numtasks);

    chunk_size = ceil(file_length / numtasks);

    /*  Allocate memory for the input parameters    */
    param_1 = malloc(file_length*sizeof(float));
    param_2 = malloc(file_length*sizeof(float));

    if( taskid == MASTER) {
        /* Read parameters from file (table_1, table_2, table_3, param_1)   */
    }

    MPI_Bcast(table_1,31*8,MPI_FLOAT,MASTER,MPI_COMM_WORLD);
    MPI_Bcast(table_2,31*4,MPI_FLOAT,MASTER,MPI_COMM_WORLD);
    MPI_Bcast(table_3,31*2,MPI_FLOAT,MASTER,MPI_COMM_WORLD);
    MPI_Bcast(param_1,file_length,MPI_FLOAT,MASTER,MPI_COMM_WORLD);

    for(it = 0; it < 10; it++) {

        for(i = 0; i < chunk_size; i++) {
            chunk[i] = myFunc((taskid*chunk_size)+i, param_1, param_2, param_3);
        }

        MPI_Gather(chunk, chunk_size, MPI_FLOAT, param_2, chunk_size, MPI_FLOAT, MASTER, MPI_COMM_WORLD);

        MPI_Bcast(param_2, file_length, MPI_FLOAT, MASTER, MPI_COMM_WORLD);
    }

    MPI_Finalize();

    free(...);

    return 0;
} 

float myFunc(int i, float *param_1, float *param_2, float param_3) {
    /*  Using the global tables (table_1,table_2,table_3) and some localy declared variable */
    /*  No MPI function here, only Math functions   */
}  

解決策、アドバイス、またはコメントがあれば、親切に私と共有してください。感謝します、ありがとう!

4

0 に答える 0