包括带有用户定义宏的MPI头文件

包括带有用户定义宏的MPI头文件,mpi,Mpi,对于包括openmp在内的应用程序,这起到了作用: #ifdef _OPENMP #include <omp.h> #endif \ifdef\u OPENMP #包括 #恩迪夫 我也想用这种方式包括MPI;所以我写了这个: #ifdef MPI #include <mpi.h> #endif #ifdef MPI #包括 #恩迪夫 但这是行不通的。不能以相同的方式包括MPI吗?是,它将起作用。您需要告诉编译器MPI既是一个宏,也是一个已定义的。其简写为-D: g

对于包括openmp在内的应用程序,这起到了作用:

#ifdef _OPENMP
#include <omp.h>
#endif
\ifdef\u OPENMP
#包括
#恩迪夫
我也想用这种方式包括MPI;所以我写了这个:

#ifdef MPI
#include <mpi.h>
#endif
#ifdef MPI
#包括
#恩迪夫

但这是行不通的。不能以相同的方式包括MPI吗?

是,它将起作用。您需要告诉编译器MPI既是一个宏,也是一个已定义的。其简写为-D:

gcc-dmpi my.c

例如,test.c:

#include <stdio.h>

int main(){

#ifdef MPI
printf("Hello, MPI\n");
#endif

printf("Hello, world\n");
}

OpenMP是该语言的一个扩展(它通常需要一个额外的标志,如
-fopenmp
),因此编译器知道它并定义
\u OpenMP
宏等。MPI只是一个库,编译器不知道它,所以它不能定义一个临时宏。您可以通过破解MPI包装器(
mpicc
和friends)来实现这一点,但这是不可移植的。为什么要使用
printf(“您好,MPI\n”)?我需要做的是告诉编译器,无论您在哪里看到MPI函数,都要包含它的相应头文件,我在一般情况下演示了这一点,如果您使用-D MPI编译代码,那么包含在“#ifdef MPI”中的任何内容都将被执行。反之亦然。
jsmith@LOBSTER:~$ gcc test.c
jsmith@LOBSTER:~$ ./a.out
Hello, world
jsmith@LOBSTER:~$ gcc -D MPI test.c
jsmith@LOBSTER:~$ ./a.out
Hello, MPI
Hello, world