我想通过g ++-8在OpenACC代码中使用cuda库(cublas,cusparse cusolver)。
g ++-8是否可以使用PGI之类的cuda库?
我编写了以下代码,需要cublas或cublas_v2。
// #include<cublas.h>
#include<cublas_v2.h>
int main(){
//...allocate and initialize data...//
#pragma acc data copy(x[0:size], y[0:size])
{
#pragma acc host_data use_device(x,y)
{
//dot = cublasDdot(size, x, 1, y, 1);
cublasDdot(h, size, x, 1, y, 1, &dot);
}
}
}
编译命令在这里:(这些库存在。)
g++-8 -fopenacc -foffload=nvptx-none \
-foffload="-I/usr/local/cuda-10.1/targets/x86_64-linux/include/ \
-L/usr/local/cuda-10.1/targets/x86_64-linux/lib/ \
-L/usr/lib/x86_64-linux-gnu/ \
-lcuda -lcudart -lcublas" -O3 -std=c++11 acc_cublas.cpp -o acc_cublas.o
它导致编译错误。发生以下错误:
acc_cublas.cpp:(.text.startup+0x11f): undefined reference to `cublasCreate_v2'
acc_cublas.cpp:(.text.startup+0x1b4): undefined reference to `cublasDdot_v2'
此编译命令正确吗?为什么找不到功能?
我通过执行以下命令基于nvidia/cuda:10.1-devel
创建了我的环境:
apt install -y gcc-8-offload-nvptx nvptx-tools g++-8
apt install -y cuda-cublas-dev-10-0
apt install -y cuda-cudart-dev-10-0
在以下不使用cuda库的程序中我得到了正确的答案:
#pragma acc data copy(x[0:size], y[0:size])
{
#pragma acc kernels
{
#pragma acc loop reduction ( + : dot)
for(int i=0; i<size; i++){
dot += x[i] * y[i];
}
}
}
答案 0 :(得分:0)
当我重新创建容器时,看起来cublas库安装在/usr/local/cuda-10.0
中,而不是cuda-10.1。您可以尝试更新编译行以指向该目录吗?没有一个完全可编译的示例,很难为自己确认这可以解决您的问题。或者,您可以链接到/usr/lib/x86_64-linux-gnu/libcublas.so
,它似乎是cublas的10.2版本,并且似乎也有您需要的符号。