テキストファイルに保存されている2つの行列AとBを乗算するプログラムを作成していますが、どちらのサイズも変化する可能性があるため、プログラムは行列AとBのサイズを識別し、それらを乗算できるかどうかを判断する必要があります。
それは問題ではありません。実際の問題は、マスタープロセスからスレーブプロセスにデータを渡すときです。私のプログラムでは、マスターからスレーブに行を渡します。行の数は、マトリックスの行の数とプロセス。
行列Aは行ごとに格納されますが、行列Bは列ごとに格納されます。
matrixA [0] ----------------
matrixA [1] ----------------
matrixA [2] ----------------
matrixB [0] matrixB [1] matrixB[2]........。
| | | | | | | | | | | |
ここにテキストファイルがあります(入力用):matrixAmatrixB 。
80年代のスタイルのデバッグ(デバッガーではないことを意味します)を数日行った後、問題(出力として取得するセグメンテーション違反)は次のコード行(スレーブ関数から)にあると思います。
void slave( int id, int slaves, double **matrixA, double **matrixB, double **matrixC )
{
int type, columnsA, columnsB, rowsA, rowsB, Btype, offset, rows, averageRows, extraRows;
MPI_Status status;
/* Recieves columns of A and B from master. */
type = 3;
MPI_Recv( &columnsA, 1, MPI_INT, 0, type, MPI_COMM_WORLD, &status );
MPI_Recv( &rowsA, 1, MPI_INT, 0, type, MPI_COMM_WORLD, &status );
MPI_Recv( &columnsB, 1, MPI_INT, 0, type, MPI_COMM_WORLD, &status );
MPI_Recv( &rowsB, 1, MPI_INT, 0, type, MPI_COMM_WORLD, &status );
printf( "%d slave recieved ColumnA = %d, RowsA = %d, ColumnB = %d, RowsB = %d.\n", id, columnsA, rowsA, columnsB, rowsB );
/* Recieve from master. */
type = 0;
MPI_Recv( &offset, 1, MPI_INT, 0, type, MPI_COMM_WORLD, &status );
MPI_Recv( &rows, 1, MPI_INT, 0, type, MPI_COMM_WORLD, &status );
matrixAllocate( &matrixA, columnsA, rows );
matrixAllocate( &matrixB, rowsB, columnsB );
matrixAllocate( &matrixC, columnsB, rows );
printf( "Correctly allocated.\n" );
/* This part is only to see if the mem was correctly allocated.*/
for( int i = 0; i < rows; i++ ){
for( int j = 0; j < columnsA; j++)
matrixA[ i ][ j ] = i + j;
}
for( int i = 0; i < columnsB; i++ ){
for( int j = 0; j < rowsB; j++)
matrixB[ i ][ j ] = i * j;
}
if ( id == 1 ){
matrixPrinter( "matrixA", matrixA, rows, columnsA );
matrixBPrinter( "matrixB", matrixB, rowsB, columnsB );
matrixPrinter( "matrixC", matrixC, rows, columnsB );
}
MPI_Recv( &matrixA, ( rows * columnsA ) , MPI_DOUBLE, 0, type, MPI_COMM_WORLD, &status );
MPI_Recv( &matrixB, ( rowsB * columnsB ), MPI_DOUBLE, 0, type, MPI_COMM_WORLD, &status );
printf( "Correctly recieved.\n" );
matrixPrinter( "matrixA", matrixA, rows, columnsA );
matrixBPrinter( "matrixB", matrixB, rowsB, columnsB );
matrixPrinter( "matrixC", matrixC, rows, columnsB );
if ( id == 1 ){
printf( "My id is %d.\n", id );
for ( int i = 0; i < rows; i++ ){
for( int j = 0; j < columnsA; j++ ){
printf( "%lf ", matrixA[ i ][ j ] );
}
printf( "\n" );
}
}
コード全体はここにあります。CのMPI行列乗数。
端末の出力は次のとおりです。