无法使用 OpenMPI 使用 OpenMP 编译 MPI 程序
Unable to compile MPI program with OpenMP with OpenMPI
我正在尝试将求解器与其中一个在 OpenMP 中并行化的求解器进行比较;使用 Fixed Form Fortran 77,求解器在 OpenMPI 下都是 运行 并行; mpif77 不允许我 link 使用 -fopenmp 开关的目标文件; Make 不会创建可执行文件。我尝试使用 gfortran 单独编译 OpenMP 源文件,然后尝试使用 mpif77
link 它们 - 不起作用;当我不使用开关时,它会抛出常见错误:
Undefined symbols for architecture x86_64:
"_GOMP_parallel", referenced from:
_parmatdiff_ in matdiff.o
ld: symbol(s) not found for architecture x86_64
collect2: error: ld returned 1 exit status
make: *** [solvercomp] Error
1
我的问题是 OpenMPI 是否支持 OpenMP,如果支持,我如何确保创建的 'make' links 对象文件在 OpenMP 库中起作用?
这是我的 makefile 的副本:
SOURCES = solvcomp.f matdiff.f seqjacobi.f seqconjgrad.f parsor.f
FCC = mpif77
MPIRUN = mpirun
OBJECTS = $(SOURCES:.f=.o)
TARGET = soln
FFLAGS = -o
CFLAGS = -c
NP = 4
all: $(TARGET) clean
$(TARGET): $(OBJECTS)
$(FCC) $(FFLAGS) $(TARGET) $(OBJECTS)
$(OBJECTS): $(SOURCES)
$(FCC) $(CFLAGS) $(SOURCES)
clean:
rm -rf *.o *.dSYM
OpenMPI 编译器 mpicc|mpic++|mpif70|...
基本上是一个程序,它使用您需要的适当标志调用后端编译器,以便将必要的 headers 和 link 包含在运行时库中。
如果您添加标志 -showme
,您将能够看到您使用的是哪个编译器。尽管 OpenMP 是一个标准,但编译器可能使用不同的标志来指示您的程序必须使用 OpenMP 运行时库解释 OMP 构造和 link。您可以将 -showme:link
添加到 link 命令,以查看哪些选项被传递给后端 Fortran 编译器。
MPI和OpenMP是两种经常一起使用的并行编程模型,所以在你的程序中这样做应该没有问题。
你的 link 命令是假的
mpif77 -o -fopenmp a.out foo.o
尝试
LDFLAGS='-fopenmp -o'
就我而言,-o
在你的 LDFLAGS
中看起来一开始就很乱。
我正在尝试将求解器与其中一个在 OpenMP 中并行化的求解器进行比较;使用 Fixed Form Fortran 77,求解器在 OpenMPI 下都是 运行 并行; mpif77 不允许我 link 使用 -fopenmp 开关的目标文件; Make 不会创建可执行文件。我尝试使用 gfortran 单独编译 OpenMP 源文件,然后尝试使用 mpif77
link 它们 - 不起作用;当我不使用开关时,它会抛出常见错误:
Undefined symbols for architecture x86_64:
"_GOMP_parallel", referenced from:
_parmatdiff_ in matdiff.o
ld: symbol(s) not found for architecture x86_64
collect2: error: ld returned 1 exit status
make: *** [solvercomp] Error
1
我的问题是 OpenMPI 是否支持 OpenMP,如果支持,我如何确保创建的 'make' links 对象文件在 OpenMP 库中起作用?
这是我的 makefile 的副本:
SOURCES = solvcomp.f matdiff.f seqjacobi.f seqconjgrad.f parsor.f
FCC = mpif77
MPIRUN = mpirun
OBJECTS = $(SOURCES:.f=.o)
TARGET = soln
FFLAGS = -o
CFLAGS = -c
NP = 4
all: $(TARGET) clean
$(TARGET): $(OBJECTS)
$(FCC) $(FFLAGS) $(TARGET) $(OBJECTS)
$(OBJECTS): $(SOURCES)
$(FCC) $(CFLAGS) $(SOURCES)
clean:
rm -rf *.o *.dSYM
OpenMPI 编译器 mpicc|mpic++|mpif70|...
基本上是一个程序,它使用您需要的适当标志调用后端编译器,以便将必要的 headers 和 link 包含在运行时库中。
如果您添加标志 -showme
,您将能够看到您使用的是哪个编译器。尽管 OpenMP 是一个标准,但编译器可能使用不同的标志来指示您的程序必须使用 OpenMP 运行时库解释 OMP 构造和 link。您可以将 -showme:link
添加到 link 命令,以查看哪些选项被传递给后端 Fortran 编译器。
MPI和OpenMP是两种经常一起使用的并行编程模型,所以在你的程序中这样做应该没有问题。
你的 link 命令是假的
mpif77 -o -fopenmp a.out foo.o
尝试
LDFLAGS='-fopenmp -o'
就我而言,-o
在你的 LDFLAGS
中看起来一开始就很乱。