是否可以通过PGI编译器将包含CUDA内核的Fortran子例程编译为DLL,然后在由其他fortran编译器(Fortran Powerstation)编译的fortran程序中使用它们?
我无法在PGI上编译我的旧fortran程序,因为它需要Fortran Powerstation提供的MSFLIB,而PGI提供的DFLIB不能执行我需要的某些功能。
我试过了,但它不能像人们看到的那样工作。obj1.lib是使用PGI fortran编译器编译的,而在Fortran Powerstation上编译(尝试失败)的是proc.f。https://i.stack.imgur.com/YLIjx.png
发布于 2017-01-07 04:28:34
不是的。
Fortran是不可跨编译器调用的。
可以通过Fortran 2003+的C绑定功能公开您的PGI-CUDA-Fortran代码。但您不能以这种方式使用Fortran特定的调用约定(假定为形状数组、派生数据类型等)。
我没有使用PGI编译器,所以不能对此发表更多评论。
发布于 2017-01-07 07:45:52
我想说这可能是可能的,但并不容易。
我已经将PGI构建的OpenACC代码(尽管它是C代码)添加到一个DLL中,该DLL可以从其他编译器构建的二进制文件中调用。因此,使用CUDA Fortran也是可能的。关键是在不使用运行时动态编译(-Mcuda=nordc)的情况下进行编译,这需要使用pgfortran链接二进制文件。但是,如果没有RDC,您将无法使用在外部模块中声明的模块设备数据,也无法调用外部模块中的“设备”例程。换句话说,您的设备代码需要包含在单个模块中。
Pierre是正确的,一般来说,你不能混合不同Fortran编译器编译的对象。但是,如果您的接口使用F77或C调用约定,并且不在动态链接库中执行I/O,则可能会发生这种情况。
https://stackoverflow.com/questions/41511958
复制相似问题