日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

MPI学习存在的一些问题

發布時間:2025/3/15 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MPI学习存在的一些问题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

最近修改MPI程序,遇到了一些細節問題,在此標記一下,不知是MPI自身缺陷還是我不是很精通MPI, 有些問題還是不太理解,敬請各位專家批評指正

1、MPI_Reduce各進程的數據操作問題

比如說,對復數的操作,看下面程序

if (rank == 0) {MPI_Reduce(MPI_IN_PLACE, imgcir[0][0], cub->amx.n*cub->amy.n*cub->az.n, MPI_FLOAT, MPI_SUM, 0, MPI_COMM_WORLD); //(1)MPI_Reduce(MPI_IN_PLACE, imgcii[0][0], cub->amx.n*cub->amy.n*cub->az.n, MPI_FLOAT, MPI_SUM, 0, MPI_COMM_WORLD); //(2)#ifdef _OPENMP #pragma omp parallel for schedule(dynamic) \private(iz,imy,imx) #endifYOOP(cip->ci[iz][imy][imx]=sf_cmplx(imgcir[iz][imy][imx],imgcii[iz][imy][imx]););sf_complexwrite(cip->ci[0][0],cub->amx.n*cub->amy.n*cub->az.n,imag);} else {MPI_Reduce(imgcir[0][0], imgcir[0][0], cub->amx.n*cub->amy.n*cub->az.n, MPI_FLOAT, MPI_SUM, 0, MPI_COMM_WORLD);MPI_Reduce(imgcii[0][0], imgcii[0][0], cub->amx.n*cub->amy.n*cub->az.n, MPI_FLOAT, MPI_SUM, 0, MPI_COMM_WORLD);}// else rank

其中imgcir、imgcii分別是復數的實部、虛部,將實部虛部分別進行加和,非主進程將數據加和并發送到非主進程,如果將主進程中的兩個加和位置互換,則最終求和結果就是錯誤的,不是很明白MPI內部是怎么進行計算的。

2、在intel openmp線程級循環中調用MPI_Send\Recv函數出現錯誤(堵塞)

看如下程序

for (ie=0; ie<(int)ceilf((float)(cub->ae.n)/(float)(size)); ie++) { // .... // .... // .... // .... #ifdef _OPENMP #pragma omp parallel for schedule(static) \private(ompith,iw,w,imx,imy,iz) #endiffor (iw=0; iw<cub->aw.n; iw++) { // .... // .... // .... // ....if (rank == 0) { for (iw=0; iw<cub->aw.n; iw++) {sf_seek(bws, sizeof(sf_complex)*cub->amx.n*cub->amy.n*cub->az.n*(ie*cub->aw.n+iw), SEEK_SET);sf_complexread(wtr[0][0], cub->amx.n*cub->amy.n*cub->az.n, bws);sf_seek(wflr, sizeof(sf_complex)*cub->amx.n*cub->amy.n*cub->az.n*(ie*size*cub->aw.n+iw), SEEK_SET);sf_complexwrite(wtr[0][0],cub->amx.n*cub->amy.n*cub->az.n, wflr);}for (irank=1; irank<size; irank++) {for (iw=0; iw<cub->aw.n; iw++) { if (ie*size+irank < cub->ae.n) {sf_seek(wflr, sizeof(sf_complex)*cub->amx.n*cub->amy.n*cub->az.n*((ie*size+irank)*cub->aw.n+iw), SEEK_SET);MPI_Recv(wtr[0][0], cub->amx.n*cub->amy.n*cub->az.n, MPI_FLOAT_COMPLEX,irank, (ie*size+irank)*cub->aw.n+iw, MPI_COMM_WORLD, &status);sf_complexwrite(wtr[0][0],cub->amx.n*cub->amy.n*cub->az.n, wflr);}}//for}//for} else {if (ie*size+rank < cub->ae.n) { for (iw=0; iw<cub->aw.n; iw++) { sf_seek(bws, sizeof(sf_complex)*cub->amx.n*cub->amy.n*cub->az.n*(ie*cub->aw.n+iw), SEEK_SET);sf_complexread(wtr[0][0], cub->amx.n*cub->amy.n*cub->az.n, bws);MPI_Send(wtr[0][0], cub->amx.n*cub->amy.n*cub->az.n, MPI_FLOAT_COMPLEX,0, (ie*size+rank)*cub->aw.n+iw, MPI_COMM_WORLD); }//for }//if}}//for}

理論上,將openmp循環中每個線程生成的數據利用MPI_Send進行發送應該是沒有問題的,即openmp和MPI的聯合并行不是搭配的完美。查看了MPI的函數,他是完美支持Pthread的,對于openmp,MPI的兼容性可能還有些問題。

有了解的朋友麻煩解答一下

總結

以上是生活随笔為你收集整理的MPI学习存在的一些问题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。