cuda - 从 CUDA 文件调用 Fortran OpenACC。如何使用PGI进行编译?

标签 cuda nvcc openacc pgi

我有一个 CUDA 代码,我想在其中包含由带有 OpenACC 内核的 Fortran 组成的外部代码。我有两个文件,其中的以下内容受到 NVIDIA 网站上的讨论的启发。文件 main.cu 如下:

#include <cstdio>

extern "C" void saxpy(int*, float*, float*, float*);

int main(int argc, char **argv)
{
    float* x;
    float* y;
    float* dx;
    float* dy;

    int n = 1<<20;

    x = (float*) malloc(n*sizeof(float));
    y = (float*) malloc(n*sizeof(float));

    for (int i=0; i<n; ++i)
    {
        x[i] = 1.f;
        y[i] = 0.f;
    }

    cudaMalloc((void**) &dx, (size_t) n*sizeof(float));
    cudaMalloc((void**) &dy, (size_t) n*sizeof(float));

    cudaMemcpy(dx, x, (size_t) n*sizeof(float), cudaMemcpyHostToDevice);
    cudaMemcpy(dy, y, (size_t) n*sizeof(float), cudaMemcpyHostToDevice);

    float factor = 2.f;
    saxpy(&n, &factor, dx, dy);

    cudaMemcpy(y, dy, (size_t) n*sizeof(float), cudaMemcpyDeviceToHost);
    printf("%f, %f\n", y[0], y[n-1]);

    return 0;
}

第二个文件saxpy.f90是:

subroutine saxpy(n, a, x, y) bind(c, name="saxpy")
    use iso_c_binding, only: c_int, c_float

    integer(kind=c_int), intent(in) :: n
    real(kind=c_float), intent(in) :: a
    real(kind=c_float), dimension(n), intent(in) :: x(n)
    real(kind=c_float), dimension(n), intent(inout) :: y(n)

    !$acc parallel deviceptr(x, y)
    do i = 1, n
        y(i) = y(i) + a*x(i)
    end do
    !$acc end parallel
end subroutine

如何使用 nvcc 和 PGI 编译器组合来编译它?我尝试了许多不同的选择,但总是以 Unresolved external 问题告终。

我尝试的是:pgf90 -ta=tesla:cc35 -acc saxpy.f90 -c Fortran 文件并且编译良好。下一步是我被困住的地方。这个: nvcc -arch=sm_35 -ccbin pgc++ main.cu saxpy.o 产生未解析的外部,我不确定如何解决它。如何找出要包含哪些外部库?

最佳答案

这些符号很可能丢失,因为您没有将 OpenACC 或 Fortran 运行时库添加到链接中。另外,当不使用PGI驱动程序链接时,您需要添加“nordc”标志。例如:

% pgfortran -c -ta=tesla:cc70,nordc saxpy.f90                                       
% nvcc -arch=sm_70 -ccbin pgc++ -Xcompiler "-ta=tesla:cc70 -pgf90libs" main.cu saxpy.o
% a.out
2.000000, 2.000000

不过,我建议使用 pgfortran 进行链接,这样您就可以使用 RDC 并且不需要添加 Fortran 运行时库:

% nvcc -arch=sm_70 -ccbin pgc++ -c main.cu
% pgfortran -Mcuda -ta=tesla:cc70 -Mnomain saxpy.f90 main.o
saxpy.f90:
% a.out
2.000000, 2.000000

关于cuda - 从 CUDA 文件调用 Fortran OpenACC。如何使用PGI进行编译?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60929456/

相关文章:

c++11 - 在CUDA程序中包含<chrono>时,即使--std = c++ 11也会出现编译器错误

c++ - 如何防止 C++ 猜测第二个模板参数?

c++ - 调试 "Invalid address space"错误

cuda - Pascal CUDA8 1080Ti统一内存的速度

c++ - 将二维数组从 C++ 类传递给 CUDA 函数

c++ - 推力数组的动态内存分配

输入矩阵也可以用于存储 CUBLAS 的输出矩阵吗?

c++ - CUDA - 没有 block ,只有未定义维度的线程

cuda - cuda 8.0 中的 nvcc 警告

c++ - 使用 OpenACC 生成可移植随机数