OpenACC nvlink 未定义引用 class
OpenACC nvlink undefined reference to class
我是 OpenACC 的新手,我正在从头开始编写一个新程序(我非常清楚以前处理类似问题时哪些循环的计算成本很高)。我从 nvlink 得到一个“未定义的引用”。根据我的研究,我发现这是因为没有为我创建的 class 生成设备代码。但是,我不明白为什么会发生这种情况以及如何解决它。
下面我从我的代码中发送了一个 MWE。
include/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'
这里的问题是您试图调用设备例程“Vec1::operator*”,它包含在主程序内核的共享对象中。 nvc++ 的 OpenACC 实现使用 CUDA 来定位 NVIDIA 设备。由于 CUDA 没有用于设备代码的动态 linker,至少现在还没有,因此不支持。
您需要静态地link,或者将“并行循环”移动到共享对象中。
请注意,“-ta”标志已被弃用。请考虑改用“-acc -gpu=cuda11.2”。
我是 OpenACC 的新手,我正在从头开始编写一个新程序(我非常清楚以前处理类似问题时哪些循环的计算成本很高)。我从 nvlink 得到一个“未定义的引用”。根据我的研究,我发现这是因为没有为我创建的 class 生成设备代码。但是,我不明白为什么会发生这种情况以及如何解决它。
下面我从我的代码中发送了一个 MWE。
include/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'
这里的问题是您试图调用设备例程“Vec1::operator*”,它包含在主程序内核的共享对象中。 nvc++ 的 OpenACC 实现使用 CUDA 来定位 NVIDIA 设备。由于 CUDA 没有用于设备代码的动态 linker,至少现在还没有,因此不支持。
您需要静态地link,或者将“并行循环”移动到共享对象中。
请注意,“-ta”标志已被弃用。请考虑改用“-acc -gpu=cuda11.2”。