所以我有这个代码,假设以不同的方式计算矩阵的点积(其中一个是在c ++中使用blas),但是当我尝试使用nvcc编译代码时,它不会工作,它说我有一个未定义的ddot引用。这很奇怪,因为我很确定我正在使用这里引用的呼号:cub http://www.sdsc.edu/us/training/assets/docs/NVIDIA-03-Toolkit.pdf
任何人都可以帮助我吗?这是我遇到问题的一段代码:
#include <cublas.h> //just some included files here. No problems with these
#include <fstream>
#include <string>
#include <sstream>
using namespace std;
extern "C" //This is where I mention the cublas functions are external.
//I think this is necessary since I also have cuda pieces of code
{
double cublasDDOT_(int *n, double *A, int *incA, double *B, int *incB);
void cublasDAXPY_(int *n, double *a, double *A, int *incA, double *B, int *incB);
}
//Stuff happens here
C[i][t]=cublasDDOT_(&n, partA, &incA, partB, &incB); //This is a piece of my function and where the compiler chokes up
这对我来说很奇怪。我也试过删除“_”而没有运气。
这是我使用的编译命令:nvcc program
在编译过程中我是否需要提及cublas库?我安装了cuda工具包,但除了
之外我不知道如何引用库 #include <cublas.h>
新更新
事实证明,无论是否包含cublas.h标头,我都得到相同的输出
无论是否键入-lcublas,我也会获得相同的输出
这是输出,它是所有编译的垃圾(有/没有cublas.h&amp;有/没有-lcublas)
nvcc project4.cu -lcublas
/tmp/tmpxft_000051cb_00000000-14_project4.o: In function `ddot(int&, int&, int&, double**&, double**&, double**&, double*&, double*&, int&, int&, double&, double&, double*)':
tmpxft_000051cb_00000000-3_project4.cudafe1.cpp:(.text+0xda1): undefined reference to `cublasDDOT'
/tmp/tmpxft_000051cb_00000000-14_project4.o: In function `daxpy(int&, int&, int&, double**&, double**&, double**&, double**&, double*&, double*&, int&, int&, double&, double&, double*)':
tmpxft_000051cb_00000000-3_project4.cudafe1.cpp:(.text+0xff3): undefined reference to `cublasDAXPY'
collect2: ld returned 1 exit status
答案 0 :(得分:1)
即使使用nvcc进行编译,您仍需要指定-lcublas
链接开关。
看起来你正在错误地调用函数名称:
cublasDDOT_()
应该是:
cublasDdot()
和
cublasDAXPY_()
应该是:
cublasDaxpy()
命名区分大小写。
如果您不确定正确的命名方式,请参阅cublas documentation并查看sample codes
中的用法是的,删除下划线。我不明白为什么你这样调用函数名。如果你破坏了一个名字,那么链接器就无法知道你打算将它链接到什么。
我也不确定任何“外部C”的东西是必要的。这取决于你的项目中还有什么,但我不认为你应该使用“extern C”包含你打算与cublas库链接的函数,如果你正在使用nvcc编译/链接