MPIを使用して並列に変換しようとしているこのシリアルコードがあります。MPI_Scatter()
ただし、クラッシュせずに機能を正しく動作させることはできないようです。この関数は、呼び出された配列をループしcells
、値の一部を変更します。
以下はオリジナルのシリアルコードです。
int accelerate_flow(const t_param params, t_speed* cells, int* obstacles)
{
register int ii,jj; /* generic counters */
register float w1,w2; /* weighting factors */
/* compute weighting factors */
w1 = params.density * params.accel * oneover9;
w2 = params.density * params.accel * oneover36;
int i;
/* modify the first column of the grid */
jj=0;
for(ii=0;ii<params.ny;ii++)
{
if( !obstacles[ii*params.nx] && (cells[ii*params.nx].speeds[3] > w1 &&
cells[ii*params.nx].speeds[6] > w2 && cells[ii*params.nx].speeds[7] > w2))
{
/* increase 'east-side' densities */
cells[ii*params.nx].speeds[1] += w1;
cells[ii*params.nx].speeds[5] += w2;
cells[ii*params.nx].speeds[8] += w2;
/* decrease 'west-side' densities */
cells[ii*params.nx].speeds[3] -= w1;
cells[ii*params.nx].speeds[6] -= w2;
cells[ii*params.nx].speeds[7] -= w2;
}
}
return EXIT_SUCCESS;
}
そして、これがMPIを使用する私の試みです:
int accelerate_flow(const t_param params, t_speed* cells, int* obstacles, int myrank, int ntasks)
{
register int ii,jj = 0;; /* generic counters */
register float w1,w2; /* weighting factors */
int recvSize;
int cellsSendTag = 123, cellsRecvTag = 321;
int size = params.ny / ntasks, i;
MPI_Request* cellsSend, *cellsRecieve;
MPI_Status *status;
/* compute weighting factors */
w1 = params.density * params.accel * oneover9;
w2 = params.density * params.accel * oneover36;
t_speed* recvCells = (t_speed*)malloc(size*sizeof(t_speed)*params.nx);
MPI_Scatter(cells, sizeof(t_speed)*params.nx*params.ny, MPI_BYTE, recvCells,
size*sizeof(t_speed)*params.nx, MPI_BYTE, 0, MPI_COMM_WORLD);
for(ii= 0;ii < size;ii++)
{
if( !obstacles[ii*params.nx] && (recvCells[ii*params.nx].speeds[3] > w1 &&
recvCells[ii*params.nx].speeds[6] > w2 && recvCells[ii*params.nx].speeds[7] > w2))
{
/* increase 'east-side' densities */
recvCells[ii*params.nx].speeds[1] += w1;
recvCells[ii*params.nx].speeds[5] += w2;
recvCells[ii*params.nx].speeds[8] += w2;
/* decrease 'west-side' densities */
recvCells[ii*params.nx].speeds[3] -= w1;
recvCells[ii*params.nx].speeds[6] -= w2;
recvCells[ii*params.nx].speeds[7] -= w2;
}
}
MPI_Gather(recvCells, size*sizeof(t_speed)*params.nx, MPI_BYTE, cells, params.ny*sizeof(t_speed)*params.nx, MPI_BYTE, 0, MPI_COMM_WORLD);
return EXIT_SUCCESS;
}
そして、ここにt_speed
構造があります:
typedef struct {
float speeds[NSPEEDS];
} t_speed;
params.nx = 300
、params.ny = 200
どんな助けでも大歓迎です。ありがとう。