5

MPIプログラミング初心者です!実際に、プロセッサからプロセッサまでのポイント ツー ポイント通信帯域幅を測定してみました。しかし、今ではセグメンテーション違反が発生しています! なぜこれが起こるのかわかりません。ubuntuでvalgrindも試しましたが、わかりません。だから多分誰かが私を助けることができます:D

迅速な対応に感謝しますが、これで問題は変わりません:(エラーを更新しました!

ここにソースコード

#include "mpi.h"
#include <stdio.h>
#include <stdlib.h>

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

 int myrank, size;
 MPI_Init(&argc, &argv);
 MPI_Comm_rank(MPI_COMM_WORLD, &myrank);
 MPI_Comm_size(MPI_COMM_WORLD, &size);

 int *arraySend = (int *)malloc(25000*sizeof(int));
 int *arrayRecv = (int *)malloc(25000*sizeof(int));
 double startTime = 0.0, endTime = 0.0;
 MPI_Status status,statusSend, statusRecv;
 MPI_Request requestSend, requestRecv;

 if(size != 2){
   if(myrank == 0){
       printf("only two processors!\n");
       MPI_Finalize();  
       return 0;
    }
 }

 if(myrank == 0){
     startTime = MPI_Wtime();
     MPI_Send(&arraySend, 25000, MPI_INT, 1, 0,MPI_COMM_WORLD);
 }else{
     MPI_Recv(&arrayRecv, 25000, MPI_INT, 0, 0, MPI_COMM_WORLD, &status);
 } 

 if(myrank == 0){
   endTime = MPI_Wtime();
   printf("100k Bytes blocking: %f Mb/s\n", 0.1/(endTime-startTime));
   startTime = MPI_Wtime();
   MPI_Isend(&arraySend, 25000, MPI_INT, 1, 0, MPI_COMM_WORLD, &requestSend);
   MPI_Wait(&requestSend, &statusSend);
  }else{
   MPI_Irecv(&arrayRecv,25000,MPI_INT,0,0,MPI_COMM_WORLD, &requestRecv);
   MPI_Wait(&requestRecv, &statusRecv);
  }

 if(myrank == 0){
    endTime = MPI_Wtime();
    printf("100k Bytes non-blocking: %f Mb/s\n", 0.1/(endTime-startTime));
 }
 free(arraySend);
 free(arrayRecv);
 MPI_Finalize();
 return 0;
}

ここでエラーが更新されました!

$ mpirun -np 2 nr2
[P90:05046] *** Process received signal ***
[P90:05046] Signal: Segmentation fault (11)
[P90:05046] Signal code: Address not mapped (1)
[P90:05046] Failing at address: 0x7fff54fd8000
[P90:05046] [ 0] /lib/x86_64-linux-gnu/libpthread.so.0(+0x10060) [0x7f8474777060]
[P90:05046] [ 1] /lib/x86_64-linux-gnu/libc.so.6(+0x131b99) [0x7f84744f7b99]
[P90:05046] [ 2] /usr/lib/libmpi.so.0(ompi_convertor_pack+0x14d) [0x7f84749c75dd]
[P90:05046] [ 3] /usr/lib/openmpi/lib/openmpi/mca_btl_sm.so(+0x1de8) [0x7f846fe14de8]
[P90:05046] [ 4] /usr/lib/openmpi/lib/openmpi/mca_pml_ob1.so(+0xd97e) [0x7f8470c6c97e]
[P90:05046] [ 5] /usr/lib/openmpi/lib/openmpi/mca_pml_ob1.so(+0x8900) [0x7f8470c67900]
[P90:05046] [ 6] /usr/lib/openmpi/lib/openmpi/mca_btl_sm.so(+0x4188) [0x7f846fe17188]
[P90:05046] [ 7] /usr/lib/libopen-pal.so.0(opal_progress+0x5b) [0x7f8473f330db]
[P90:05046] [ 8] /usr/lib/openmpi/lib/openmpi/mca_pml_ob1.so(+0x6fd5) [0x7f8470c65fd5]
[P90:05046] [ 9] /usr/lib/libmpi.so.0(PMPI_Send+0x195) [0x7f84749e1805]
[P90:05046] [10] nr2(main+0xe1) [0x400c55]
[P90:05046] [11] /lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xed) [0x7f84743e730d]
[P90:05046] [12] nr2() [0x400ab9]
[P90:05046] *** End of error message ***
--------------------------------------------------------------------------
mpirun noticed that process rank 0 with PID 5046 on node P90 exited on signal 11 
(Segmentation fault).
4

2 に答える 2

5

渡された配列のサイズが間違っています。

sizeof(arraySend)25000データ型 (ここでは MPI_INT) を定義すると、MPI は自動的にサイズを差し引くため、単純にする必要があります。sizeof()コードで通常必要なビット配列がある場合のみ。

たとえば、次の代わりに、ヒープではなくスタックにメモリを割り当ててみてください。

 int *arraySend = (int *)malloc(25000*sizeof(int));

使用する:

int arraySend[25000];

次に、mpi 呼び出しarraySendの代わりに使用します。&arraySend

C++ を使用できる場合は、渡されたデータからサイズが自動的に計算されるナイスなブースト mpi ヘッダーを使用することもできます。

于 2012-06-18T20:28:21.147 に答える
0

まともな mpi 実装を使用している場合は、ここmpirun -gdbで詳細なドキュメントを使用できます

于 2012-06-19T23:00:29.953 に答える