2011-12-08 1 views
1

私は並列アルゴリズム、より具体的には行列の乗算で時間測定(ベンチマーク)を行ってきました。私は、正方行列のために、それは長方形のもののためよりも時間がかかった、ということに気づいMPI通信遅延 - メッセージのサイズは重要ですか?

if(taskid==MASTER) { 
    averow = NRA/numworkers; 
    extra = NRA%numworkers; 
    offset = 0; 
    mtype = FROM_MASTER; 
    for (dest=1; dest<=numworkers; dest++) 
    { 
    rows = (dest <= extra) ? averow+1 : averow;  
    MPI_Send(&offset, 1, MPI_INT, dest, mtype, MPI_COMM_WORLD); 
    MPI_Send(&rows, 1, MPI_INT, dest, mtype, MPI_COMM_WORLD); 
    MPI_Send(&a[offset][0], rows*NCA, MPI_DOUBLE, dest, mtype,MPI_COMM_WORLD); 
    MPI_Send(&b, NCA*NCB, MPI_DOUBLE, dest, mtype, MPI_COMM_WORLD); 
    offset = offset + rows; 
    } 
    mtype = FROM_WORKER; 
    for (i=1; i<=numworkers; i++) 
    { 
    source = i; 
    MPI_Recv(&offset, 1, MPI_INT, source, mtype, MPI_COMM_WORLD, &status); 
    MPI_Recv(&rows, 1, MPI_INT, source, mtype, MPI_COMM_WORLD, &status); 
    MPI_Recv(&c[offset][0], rows*NCB, MPI_DOUBLE, source, mtype, 
       MPI_COMM_WORLD, &status); 
    printf("Resultados recebidos do processo %d\n",source); 
    } 
} 

else { 
    mtype = FROM_MASTER; 
    MPI_Recv(&offset, 1, MPI_INT, MASTER, mtype, MPI_COMM_WORLD, &status); 
    MPI_Recv(&rows, 1, MPI_INT, MASTER, mtype, MPI_COMM_WORLD, &status); 
    MPI_Recv(&a, rows*NCA, MPI_DOUBLE, MASTER, mtype, MPI_COMM_WORLD, &status); 
    MPI_Recv(&b, NCA*NCB, MPI_DOUBLE, MASTER, mtype, MPI_COMM_WORLD, &status); 

    for (k=0; k<NCB; k++) 
    for (i=0; i<rows; i++) 
    { 
     c[i][k] = 0.0; 
     for (j=0; j<NCA; j++) 
      c[i][k] = c[i][k] + a[i][j] * b[j][k]; 
    } 
    mtype = FROM_WORKER; 
    MPI_Send(&offset, 1, MPI_INT, MASTER, mtype, MPI_COMM_WORLD); 
    MPI_Send(&rows, 1, MPI_INT, MASTER, mtype, MPI_COMM_WORLD); 
    MPI_Send(&c, rows*NCB, MPI_DOUBLE, MASTER, mtype, MPI_COMM_WORLD); 
} 

:私は、次のアルゴリズムを使用しています。 例:4ノード(1つはマスター)を使用し、Aは500x500、Bは500x500の場合、ノードあたりの反復回数は4150万になり、Aが2400000x6、Bが6x6の場合、ノードあたり2880万回。 2番目のケースでは反復回数は少なくなりますが、最初のケースでは約0.46秒しかかかりませんでしたが、約1.00秒かかりました。

論理的には、ノードあたりの反復回数が少ないため、2番目の方が高速です。 いくつかの計算をすると、MPIは最初のケースでは1メッセージにつき83,000個の要素を送信し、2番目のケースでは4,800,000個の要素を送受信することに気付きました。

メッセージのサイズによって遅延が正当化されますか?

答えて

1

MPIで送信されるメッセージのサイズは、コードのパフォーマンス に影響します。一般的なMPI 実装のWebページの1つに掲載されたTHESEグラフを見てください。

最初のグラフからわかるように、通信の待ち時間はメッセージサイズで になります。この傾向は、このグラフに示されているInfiniBand だけでなく、どのネットワークにも適用できます。

関連する問題