私はMPIを初めて使用しています。私は現在、ローカルのベオウルフクラスターでアレイ解析を行う必要があるプロジェクトに取り組んでいます。私のコードはCで書かれ、正しくコンパイルされます。 1つのプロセスだけを使用しているときは正しく動作しますが、複数のプロセスで実行しようとすると、ルート(ランク0)以外のすべてのプロセスがデータをブロードキャストしようとするときに消滅する傾向があります。私のコードは、この複数のプロセスを使用している場合、MPI Bcast付近のSegフォールト
//1. Initialize global variables
//2. Initialize MPI, get number of processes, get rank
//3. All processes create two dimensional arrays
array1 = (char **) malloc(sizeArray1 * sizeof(char *));
array1[0] = (char *) malloc(sizeArray1 * lineLength * sizeof(char));
for(i = 1; i < sizeArray1; i++)
{
array1[i] = array1[i - 1] + lineLength;
}
//4. Only server will populate it's arrays, then broadcast to all processes
if(rank == 0)
{
f = fopen("path..../testFile1.txt", "r");
if(NULL == f) {
perror("FAILED: ");
return -1;
}
numWords = 0;
while(err != EOF && numWords < sizeArray2)
{
err = fscanf(f, "%[^\n]\n", array2[numWords]);
numWords ++;
}
fclose(f);
}
//5. Broadcast each line from both arrays to all processes
MPI_Bcast(array1, sizeArrray1 * lineLength, MPI_CHAR, 0, MPI_COMM_WORLD);
//6. do further work on arrays
ようになり、他のノードは通常、一回放送のラインを印刷し、次に死ぬしようとしながら、ルートノードは、この完全に罰金のすべてを実現します。あなたは私のコードのいずれかの他の部分を見てする必要がある場合は、私が取得しています正確なエラーは
Signal: Segmentation fault (11)
Signal code: Address not mapped (1)
Failing at address: 0x37
malloc.c:2392: sysmalloc: Assertion `(old_top == initial_top (av) && old_size == 0) || ((unsigned long) (old_size) >= MINSIZE && prev_inuse (old_top) && ((unsigned long) old_end & (pagesize - 1)) == 0)' failed.
である私は
注知ってみましょう:私は他のユーザーからの提案に対応するために私のコードを編集したのが、エラーは依然として続きます
理想的に、あなたが建設する[、最小完全、かつ検証例](https://stackoverflow.com/help/mcve)。少なくとも、あなたが 'array1'と' array2'を割り当てるところのコードを表示してください。これらの配列は**すべての**タスクに割り当てられ、ルートタスク(ここではタスク '0')にのみ配置されます。 –
コードをその部分で更新します。全体のファイルはかなり長いです。あなたが言ったように、私はすべてのタスクに配列を割り当てていますが、1つだけに配置します。 – MrRempton
チャンスは(あなたが* minimal *であるが実用的な例があれば)あなた自身が答えを見つけるかもしれない。 – YePhIcK