プログラム
#include
#include
/* ベクトルに行列をかける。行列は、対角要素の一つ上と一つ下に0.5がある。 */
int MLTPLY(double *vec, double *vecout, int Nlocal, int topsID, int bottomsID, MPI_Comm communicator) {
int ierr = 0, tag_down = 0, tag_up = 1, Idim;
MPI_Status status[4]; /* 送受信が完了したかどうかを知るための変数 */
MPI_Request request[4]; /* 送信や受信につける番号 */
/* 受信要請 */
/* topsID という CPU から tag_down という名札のついた倍精度実数1個を受け取り vec[0] に格納したい。*/
ierr = MPI_Irecv(&vec[0], 1, MPI_DOUBLE, topsID, tag_down, communicator, &request[0]);
/* bottomsID という CPU から tag_up という名札のついた倍精度実数1個を受け取り vec[Nlocal+1] に格納したい。*/
ierr = MPI_Irecv(&vec[Nlocal+1], 1, MPI_DOUBLE, bottomsID,tag_up, communicator, &request[1]);
/* 送信開始 */
/* bottomsID という CPU へ tag_down という名札をつけて倍精度実数1個 vec[Nlocal] を送信する。*/
ierr = MPI_Isend(&vec[Nlocal], 1, MPI_DOUBLE, bottomsID,tag_down, communicator, &request[2]);
/* topsID という CPU へ tag_up という名札をつけて倍精度実数1個 vec[1] を送信する。*/
ierr = MPI_Isend(&vec[1], 1, MPI_DOUBLE, topsID, tag_up, communicator, &request[3]);
/* 送受信完了まで待機 */
ierr = MPI_Waitall(4, request, status);
/* 行列の掛け算 */
for(Idim=1; Idim <= Nlocal; Idim++) {
vecout[Idim] = 0.5 * (vec[Idim-1] + vec[Idim+1]);
}
return ierr;
}
前のスライド | 次のスライド | 最初のスライドに戻る | グラフィックスの表示 |