亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

通過MPI發送和接收2D陣列

通過MPI發送和接收2D陣列

C++
江戶川亂折騰 2019-10-31 13:06:13
我要解決的問題如下:我擁有的C ++串行代碼跨一個大型2D矩陣進行計算。為了優化此過程,我希望拆分這個大型2D矩陣并使用MPI在4個節點(例如)上運行。節點之間發生的唯一通信是在每個時間步結束時共享邊值。每個節點與其鄰居共享邊緣陣列數據A [i] [j]?;趯PI的了解,我可以實現以下方案。if (myrank == 0){ for (i= 0 to x) for (y= 0 to y) {  C++ CODE IMPLEMENTATION   ....   MPI_SEND(A[x][0], A[x][1], A[x][2], Destination= 1.....)  MPI_RECEIVE(B[0][0], B[0][1]......Sender = 1.....)  MPI_BARRIER}if (myrank == 1){for (i = x+1 to xx)for (y = 0 to y){ C++ CODE IMPLEMENTATION .... MPI_SEND(B[x][0], B[x][1], B[x][2], Destination= 0.....) MPI_RECEIVE(A[0][0], A[0][1]......Sender = 1.....) MPI BARRIER}我想知道我的方法是否正確,并且也希望對其他MPI功能的任何指導也尋求實施。
查看完整描述

3 回答

?
慕運維8079593

TA貢獻1876條經驗 獲得超5個贊

只是為了擴大Joel的觀點:


如果分配數組以使它們連續(這樣的話,C的“多維數組”不會自動給您:),則這樣做會容易得多。


int **alloc_2d_int(int rows, int cols) {

    int *data = (int *)malloc(rows*cols*sizeof(int));

    int **array= (int **)malloc(rows*sizeof(int*));

    for (int i=0; i<rows; i++)

        array[i] = &(data[cols*i]);


    return array;

}


/*...*/

int **A;

/*...*/

A = alloc_2d_init(N,M);

然后,您可以使用以下命令發送和接收整個NxM陣列


MPI_Send(&(A[0][0]), N*M, MPI_INT, destination, tag, MPI_COMM_WORLD);

完成后,釋放內存


free(A[0]);

free(A);

另外,MPI_Recv是阻止接收,并且MPI_Send可以是阻止發送。根據Joel的觀點,一件事意味著您絕對不需要障礙。此外,這意味著,如果您具有上述的發送/接收模式,則可能陷入僵局-每個人都在發送,沒有人在接收。更安全的是:


if (myrank == 0) {

   MPI_Send(&(A[0][0]), N*M, MPI_INT, 1, tagA, MPI_COMM_WORLD);

   MPI_Recv(&(B[0][0]), N*M, MPI_INT, 1, tagB, MPI_COMM_WORLD, &status);

} else if (myrank == 1) {

   MPI_Recv(&(A[0][0]), N*M, MPI_INT, 0, tagA, MPI_COMM_WORLD, &status);

   MPI_Send(&(B[0][0]), N*M, MPI_INT, 0, tagB, MPI_COMM_WORLD);

}

另一種更通用的方法是使用MPI_Sendrecv:


int *sendptr, *recvptr;

int neigh = MPI_PROC_NULL;


if (myrank == 0) {

   sendptr = &(A[0][0]);

   recvptr = &(B[0][0]);

   neigh = 1;

} else {

   sendptr = &(B[0][0]);

   recvptr = &(A[0][0]);

   neigh = 0;

}

MPI_Sendrecv(sendptr, N*M, MPI_INT, neigh, tagA, recvptr, N*M, MPI_INT, neigh, tagB, MPI_COMM_WORLD, &status);

或非阻塞發送和/或接收。


查看完整回答
反對 回復 2019-10-31
?
至尊寶的傳說

TA貢獻1789條經驗 獲得超10個贊

首先,您不需要那么多的障礙。其次,您應該真正將數據作為單個塊發送,因為多次發送/接收阻止它們會導致性能下降。


查看完整回答
反對 回復 2019-10-31
?
千萬里不及你

TA貢獻1784條經驗 獲得超9個贊

C的多維數組是一個連續的內存塊;如果您分配double d[50][50];,那是一個連續的內存塊。處理動態分配的“偽2D”數組的一種方法是分配一個指針塊和一組單獨的(通常是不連續的)存儲塊,每行一個。

查看完整回答
反對 回復 2019-10-31
  • 3 回答
  • 0 關注
  • 635 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號