MPI学习存在的一些问题
生活随笔
收集整理的這篇文章主要介紹了
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学习存在的一些问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 乐高无限无法连接到服务器,乐高无限近期热
- 下一篇: python魔术方法abstract_p