微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

OpenACC nvlink 对类的未定义引用

如何解决OpenACC nvlink 对类的未定义引用

我是 OpenACC 的新手,我正在从头开始编写一个新程序(我非常清楚在以前处理类似问题时哪些循环的计算成本很高)。我从 nvlink 收到“未定义的引用”。从我的研究中,我发现这是因为没有为我创建的类生成设备代码。但是,我不明白为什么会发生这种情况以及如何解决

下面我从我的代码发送了一个 MWE。

include/vec1.h

Original filename

src/vec1.cpp

#ifndef VEC1_H
#define VEC1_H

class Vec1{
    
public:
    double data[1];

    #pragma acc routine seq
    Vec1();
    #pragma acc routine seq
    Vec1(double x);
    
    #pragma acc routine seq
    Vec1 operator* (double x);

};

#endif

vec1_test_gpu.cpp

#include "vec1.h"

Vec1::Vec1(){
    data[0] = .0;
}

Vec1::Vec1(double x){
    data[0] = x;
}


Vec1 Vec1::operator*(double c){
    Vec1 r = Vec1(0.);
    r.data[0] = c*data[0];
    return r;
}

我按照以下方式编译它们

#include "vec1.h"

#define NUM_VECTORS 1000000

int main(){
    
    Vec1 vec1_array[NUM_VECTORS];
    for(int iv=0; iv<NUM_VECTORS; ++iv){
        vec1_array[iv] = Vec1(iv);
    }
    #pragma acc data copyin(vec1_array)
    
    #pragma acc parallel loop
    for(int iv=0; iv<NUM_VECTORS; ++iv){
        vec1_array[iv] = vec1_array[iv]*2;
    }
    return 0;
}

错误消息出现在最后一个命令之后,内容$ nvc++ src/vec1.cpp -c -I./include -O3 -march=native -ta=nvidia:cuda11.2 -fPIC $ nvc++ -shared -o libvec1.so vec1.o $ nvc++ vec1_test_gpu.cpp -I./include -O3 -march=native -ta=nvidia:cuda11.2 -L./ -lvec1

解决方法

这里的问题是你试图调用一个设备例程,“Vec1::operator*”,它包含在主程序内核的共享对象中。 nvc++ 的 OpenACC 实现使用 CUDA 来定位 NVIDIA 设备。由于 CUDA 没有用于设备代码的动态链接器,至少目前没有,因此不受支持。

您需要静态链接它,或者将“并行循环”移动到共享对象中。

请注意,“-ta”标志已被弃用。请考虑改用“-acc -gpu=cuda11.2”。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。