从Fortran例程调用多线程(OpenMP)C++例程

3
我有一个单独的c++例程standalone_c.cpp,以及一个包装器standalone_f.f90,它将standalone_c.cpp包装起来。 standalone_c.cpp使用openmp pragma进行多线程处理。我能够编译standalone_c.cpp和wrapper standalone_f.f90。但是,当我尝试链接这两个文件时,会出现错误,如undefined reference to omp_get_thread_num、undefined reference to omp_get_num_procs等。有人有从fortran例程调用多线程c或c++代码的经验吗?有人能猜到为什么会发生这种情况吗?
如果有足够的兴趣,我可以发布一些伪代码。
编辑:编译命令:
gcc-4.3.3/bin/g++ -O -openmp $(IFLAGS) -c standalone_c.cpp 
fce/10.1.015/bin/ifort -g -O0 standalone_f.f90
fce/10.1.015/bin/ifort $(LFLAGS) standalone_c.o standalone_f.o -o standalone

IFLAGS是我需要的一些库的标记,LFLAGS是这些库的链接器标记。


编译和链接所使用的命令会很有帮助。 - suszterpatt
2个回答

3
< p >ifort 上的 -openmp 标志不仅仅是打开 OpenMP 指令处理。它还链接了适当的库。假设您已经解决了子例程命名问题中的下划线,那么如果在 ifort 链接步骤中添加 -openmp,那将处理 OpenMP 库,并添加 -lstdc++ 将处理 C++ 引用(如 __gxx_personality_v0)。

或者您可以使用 ifort 提供的选项。简单示例:

$> cat a.f90
program a
  print *, "calling C++ program"
  call b()
end program a

$> cat b.cpp
#include <omp.h>
#include <stdio.h> 

extern "C" {
void b_(void); }

void b_(void) {
  int i;

  #pragma omp parallel for
  for (i = 0; i < 10; i++)
    printf("t#: %i  i: %i\n", omp_get_thread_num(), i);

}

$> g++ -fopenmp -c -o b.o b.cpp
$> ifort -g -O0 -c -o a.o a.f90
$> ifort -openmp -cxxlib -openmp-lib compat b.o a.o
$> export OMP_NUM_THREADS=4
$> a.out
 calling C++ program
t#: 2  i: 6
t#: 2  i: 7
t#: 2  i: 8
t#: 3  i: 9
t#: 0  i: 0
t#: 0  i: 1
t#: 0  i: 2
t#: 1  i: 3
t#: 1  i: 4
t#: 1  i: 5

您需要告诉ifort使用OpenMP(-openmp),与GNU OpenMP运行库libgomp兼容(-openmp-lib compat),并使用由g++提供的C++运行时库进行链接(-cxxlib)。


谢谢!非常清晰的答案,我漏掉了-openmp-lib compat标志。 - Anu

0

对于GNU编译器,启用OpenMP的命令行选项是-fopenmp,而不是您示例中的-openmp。

其次,在使用-fopenmp选项时,编译器会生成对GNU OpenMP支持库(libgomp)的调用。由于您使用ifort而不是gfortran进行最终链接步骤,因此需要显式链接到该库。

即便如此,如果-fopenmp向主程序添加了一些设置调用,可能会出现问题。首先,我会检查是否可以使用GNU Fortran编译器(gfortran)而不是ifort运行程序。请记住,即使Fortran代码本身不使用OpenMP,也要将-fopenmp添加到gfortran标志中。


谢谢,由于其他原因,我必须使用ifort编译器,在这种情况下,标志是-openmp而不是-fopenmp(ifort无法将 -fopenmp 识别为有效的标志)。 - Anu
1
他在评论你的g++调用,应该显示-fopenmp而不是-openmp(ifort使用)。 - ejd

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接