首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OpenACC nvlink未定义的类引用

OpenACC nvlink未定义的类引用
EN

Stack Overflow用户
提问于 2021-05-09 14:19:34
回答 1查看 349关注 0票数 0

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

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

包含/vec1.h

代码语言:javascript
复制
#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

代码语言:javascript
复制
#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

代码语言:javascript
复制
#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;
}

我按以下方式编译它们

代码语言:javascript
复制
$ 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'

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-05-10 15:52:00

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

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

请注意,"-ta“标志已被废弃。请考虑使用"-acc -gpu=cuda11.2“代替。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67458745

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档