我有一个非常特殊的问题。我需要为我的学校项目复习NASA并行基准,但我发现这是一项非常有问题的任务:-)起初,我试图使用IS(整数排序),但代码无法编译,我发现我需要重写make.def文件。所以我重写了mpi.h的变量并编译了它,但程序一直提醒我:
Fatal error in PMPI_Comm_rank: Invalid communicator, error stack:
PMPI_Comm_rank(108): MPI_Comm_rank(comm=0x0, rank=0x6084e8) failed
PMPI_Comm_rank(66).: Invalid communicator
老实说,我真的不知道,我应该知道吗。我甚至尝试过将旧的编译器,如cc更改为gcc等,但似乎没有任何效果。我尝试重写的最后一件事是变量CMPI_LB,但我不知道如何正确地执行它。
非常感谢您的回复;-)我很抱歉我的英语不好,我不是母语人士。
整个基准测试在这里下载(cca 600kB):uloz.to/xTSEzTX8/npb3-3-1-zip
文件是.c,我正试图编译并启动它:hostcode.sourceforge.net/view/2436
生成文件:hostcode.sourceforge.net/view/2437
文件make.common-负责编译具有特殊功能的文件等:hostcode.sourceforge.net/view/2438
我的make.def在这里:#veeylg84-46196-BASH-源代码
我的"基准文件夹"中的文件结构:http://www.sourcepod.com/sozaoh48-46200
PMPI_Comm_rank(108): MPI_Comm_rank(comm=0x0, rank=0x6084e8) failed
消息告诉很多。您的MPI_COMM_WORLD
常量是0
,而基于MPICH(从错误消息的格式中可以猜到)的实现则不是这样。它是MPICH(#define MPI_COMM_WORLD ((MPI_Comm)0x44000000)
)中的编译时常数,也是Open MPI中的运行时常数引用。此类错误的首要原因是混合了MPI实现,即包括来自一个实现的mpi.h
,并链接到另一个实现中的库。
从您的make.def
中可以明显看出,您包含了来自伪MPI实现的mpi.h
,并链接到真实的MPI库。这根本不起作用。由于mpicc
负责将正确的包含路径和库选项传递给后端编译器,因此不必显式设置CMPI_LIB
或CMPI_INC
,而应将它们保留为空。这些是为MPI实现不提供编译器包装器(mpicc
、mpif90
等)并且必须显式指定所有选项的情况保留的,例如MS-MPI就是这样。