OpenACC nvlink 未定义类的引用

Posted

技术标签:

【中文标题】OpenACC nvlink 未定义类的引用【英文标题】:OpenACC nvlink undefined reference to class 【发布时间】:2021-07-31 04:00:07 【问题描述】:

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

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

包括/vec1.h

#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

src/vec1.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;

vec1_test_gpu.cpp

#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

错误消息出现在最后一条命令之后,内容为nvlink error : Undefined reference to '_ZN4Vec1mlEd' in '/tmp/nvc++jOtCBiT_m38d.o'

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

静态链接确实解决了这个问题。非常感谢。对于那些面临类似问题的人,我按以下方式编译:nvc++ src/vec1.cpp -c -I./include -O3 -march=native -acc -gpu=cuda11.2nvc++ vec1_test_gpu.cpp -c -I./include -O3 -march=native -acc -gpu=cuda11.2ar rcs libvec1.a vec1.onvc++ vec1_test_gpu.o -L./ -lvec1 -march=native -acc -gpu=cuda11.2 -o test.exe

以上是关于OpenACC nvlink 未定义类的引用的主要内容,如果未能解决你的问题,请参考以下文章

c ++继承编译问题未定义对派生类的引用[重复]

Android OpenCV 未定义对本机类的引用

C++ 类和继承错误:未定义对派生类的引用

Vue 基于类的组件警告:属性未在实例上定义,但在渲染期间引用

使用类标头对函数的未定义引用[重复]

Vue属性或方法未在实例上定义但在渲染期间引用?