如何编译同时包含 MPI 和 OPENMP 的程序

计算科学 并行计算 正则 编译 mpi
2021-12-21 10:25:27

我有一个 fortran 90 代码,它使用 MPI 将计算块(来自矩阵)分配到集群中的多个节点,但在每个节点中,for 循环使用 openmp 并行执行。我尝试使用以下命令:

mpif90 mycode.f

产生以下输出:

mycode.f(49): (col. 3) remark: LOOP WAS VECTORIZED.
mycode.f(68): (col. 4) remark: PARTIAL LOOP WAS VECTORIZED.
mycode.f(83): (col. 2) remark: LOOP WAS VECTORIZED.
mycode.f(92): (col. 2) remark: LOOP WAS VECTORIZED.
mycode.f(105): (col. 2) remark: LOOP WAS VECTORIZED.
mycode.f(114): (col. 2) remark: LOOP WAS VECTORIZED.
/tmp/ifortAPx6mR.o: In function `MAIN__':
mycode.f:(.text+0x1f2): undefined reference to `omp_set_num_threads_'

我假设问题是我需要在omp_set_num_threads_某处设置一个调用的参数,但我不确定在哪里。任何帮助将不胜感激。谢谢。

2个回答

mpif90 只是底层 fortran 编译器的包装器,它为查找必要的库和/或包含文件/模块添加了必要的选项。

您只需要添加使用 OpenMP 编译/链接所需的选项;那将是 -fopenmp(用于 gnu 编译器套件)或 -openmp(用于 intel);不确定其他人。"remark: LOOP WAS VECTORIZED" 在我看来就像英特尔编译器,所以我建议只是尝试

mpif90 mycode.f -openmp

完全正常,在编译器中启用 OpenMP 并且您包含/链接 MPI 头文件/库。然后,当您使用 mpiexec(或等效)开始您的工作时,使用 MPI 编写的代码部分将作为 MPI 运行,标有 OpenMP pragma(自动或不自动)的部分将作为 OpenMP 运行。编译没什么特别的,问题是写出高效的代码。