Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
调用多线程(openmp)c++;Fortran例程中的例程 我有一个C++例程标准的CPP和一个包装器,它在Fortran StalalOnf.F90中封装StalalOn.C.CPP。standalone_c.cpp使用openmp pragma进行多线程处理。我能够编译standalone_c.cpp和包装器standalone_f.f90。但是,当我尝试将这两个链接起来时,会出现一些错误,比如未定义对omp\u get\u thread\u num的引用,未定义对omp\u get\u num\u procs的引用。有谁有经验从Fortran例程调用多线程C或C++代码吗?有人能猜出这是为什么吗_C++_Fortran_Openmp - Fatal编程技术网

调用多线程(openmp)c++;Fortran例程中的例程 我有一个C++例程标准的CPP和一个包装器,它在Fortran StalalOnf.F90中封装StalalOn.C.CPP。standalone_c.cpp使用openmp pragma进行多线程处理。我能够编译standalone_c.cpp和包装器standalone_f.f90。但是,当我尝试将这两个链接起来时,会出现一些错误,比如未定义对omp\u get\u thread\u num的引用,未定义对omp\u get\u num\u procs的引用。有谁有经验从Fortran例程调用多线程C或C++代码吗?有人能猜出这是为什么吗

调用多线程(openmp)c++;Fortran例程中的例程 我有一个C++例程标准的CPP和一个包装器,它在Fortran StalalOnf.F90中封装StalalOn.C.CPP。standalone_c.cpp使用openmp pragma进行多线程处理。我能够编译standalone_c.cpp和包装器standalone_f.f90。但是,当我尝试将这两个链接起来时,会出现一些错误,比如未定义对omp\u get\u thread\u num的引用,未定义对omp\u get\u num\u procs的引用。有谁有经验从Fortran例程调用多线程C或C++代码吗?有人能猜出这是为什么吗,c++,fortran,openmp,C++,Fortran,Openmp,如果有足够的兴趣,我可以发布一些伪代码 编辑:编译命令: 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 IFLAG用于我需要的一些库,LFLAG是这些库的链接器标志 ifort

如果有足够的兴趣,我可以发布一些伪代码

编辑:编译命令:

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

IFLAG用于我需要的一些库,LFLAG是这些库的链接器标志

ifort上的-openmp标志不仅仅是打开openmp指令处理。它还链接到适当的库中。假设您已经处理了子例程命名问题中的下划线,那么如果向IfFult链接步骤添加OpenMP,则将处理OpenMP库,并且添加-LSTDC++将处理C++引用(如,αGxxPuxalIdIVIV0)。 或者您可以使用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
$>类别a.f90
程序a
打印,“调用C++程序”
呼叫b()
结束程序a
$>类别b.cpp
#包括
#包括
外部“C”{
void b_uu(void);}
无效b_u2;(无效){
int i;
#pragma-omp并行
对于(i=0;i<10;i++)
printf(“t#::%i:%i\n”,omp_get_thread_num(),i);
}
$>g++-fopenmp-c-ob.ob.cpp
$>ifort-g-O0-c-o a.o a.f90
$>ifort-openmp-cxxlib-openmp lib compat b.o a.o
$>导出OMP\u NUM\u线程=4
$>a.out
调用C++程序
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

您必须告诉iFoT使用OpenMP(-OpenMP),与GNUOpenMP运行库LIGBGOMP(-OpenMP LIB COMPAT)兼容,并使用G++(-CXXILB)提供的C++运行库来链接。

< P>对于GNU编译器,命令行选项允许OpenMP为-FOpenMP,而不是-OpenMP,如您的例子。 其次,当使用-fopenmp选项时,编译器生成对GNU OpenMP支持库(libgomp)的调用。在使用ifort而不是gfortran执行最后的链接步骤时,需要显式链接到该库


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

您用来编译和链接的命令将非常有用。谢谢!非常清楚的回答,我缺少了-openmp lib compat标志。谢谢,出于其他原因,我不得不使用ifort,在这种情况下,标志是-openmp而不是-fopenmp(-fopenmp未被ifort识别为有效标志)。他在评论您对g++的调用时,应该显示-fopenmp而不是-openmp(由ifort使用)。