私は初心者の 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 */
}
解決策、アドバイス、またはコメントがあれば、親切に私と共有してください。感謝します、ありがとう!