近期在建構一個并行程式時,踩了好幾個坑,現在記錄下來,用于以後查閱,如有錯誤的地方,請指正。
由于需要建構在windows下運作的程式,是以使用mingw進行編譯。
在make過程中,報出以下錯誤:
function 'int_ptr kind' in initialization expression at (1) must be an instrinsic function
經查閱資料,發現是msmpi的問題,需要對其檔案進行修改:
首先從msmpi安裝目錄拷貝mpifptr.h、mpi.f90到臨時建立的檔案夾中,然後再從系統目錄System64檔案夾中拷貝msmpi.dll到該檔案夾中(如果電腦是32位的,則從System32中拷貝),拷貝完成後,将mpi.f90重命名為mpi.F90,在該檔案夾下打開cmd.exe,按順序輸入以下指令:
gfortran -c -D INT_PTR_KIND()=8 -fno-range-check mpi.F90
gendef msmppi.dll
dlltool -d msmpi.def -l libmsmpi.a -D msmpi.dll
執行完畢後,會在該檔案夾下發現生成了libmsmpi.a檔案,将該檔案拷貝到msmpi的Lib/x64目錄下
上述操作完成後,進入msmpi安裝目錄的include目錄下,修改mpi.h檔案:
找到 typedef __int64 MPI_Aint,在這句之前添加#include <stdint.h>
接着修改mpif.h檔案,找到 INT_PTR_KIND(),将其替換為 z'8c00008',注意,這裡是我個人找出的辦法,由于項目采用cmake進行配置,我在GFORTRAN_COMPILE_FLAG添加-D INT_PTR_KIND()=8沒有效果,故直接修改該檔案,請慎用
在這些配置弄完後,編譯仍然會報錯:無法将integer(16)轉換為integer(4),
這個錯誤可以通過添加 指令: -fno-range-check屏蔽這個錯誤。
引用文章:
windows下利用Mingw和msmpi編譯運作mpi并行程式
TUTORIAL: Adapting MS-MPI for MinGW64
mpi + gcc + gfortran on windows