大家好,
我想向大家请教一个利用FORTRAN写的并行程序的问题。
我的程序有两个文件,一个是主程序(main.f90),用于分配各个数据和调用各种子程序;另一个是附属程序(cal.f90),用于存储各种子程序。我把我的程序传到附件中了。
我想请教的是我在主程序(main.f90第279行)中打开了一个文件(fermi_Surface.dat),然后将km(2)个数组分配给各个CPU做计算,每个数组都分别是一个有km(1)行,3列的二维数组。每个CPU利用附属程序(cal.f90中292行)中的程序去做判断,如果该CPU接收到的维数组中的某一个元素对应的本征值(evg(i,j))符合条件(fermi-wfe ≤evg(i,j)≤fermi+wfe),就将这个元素写入fermi_Surface.dat文件中(cal.f90中295行);否则就不写。这样一来,会出现两个问题。
第一,因为每个CPU接收到的数组中符合条件的元素个数未必相同,进而每个CPU写入fermi_Surface.dat文件的元素个数也不一定相同
第二,因为每个CPU分别各自都在fermi_Surface.dat文件里写入数据,所以后写数据到这个文件里的CPU会把之前所有其它CPU写到这个文件里的数据抹除掉。而我想把所有的CPU写入到这个文件里的数据都保留下来。
这两个问题,我不知道要如何解决。我有查到MPI_GATHERV命令可以从不同进程接收不同长度的数据,如果能用这个命令的话,可以把每个CPU判断后,符合条件的数据都收集到跟进程里,好像可以解决问题;但这个命令要求告知每个CPU会分别传递多少个数据到跟进程里。这个信息我事先是不知道的。所以不知道要如何使用这个命令。
我想麻烦大家给些建议,要如何解决这个问题呢?多谢大家啦。
|