【问题标题】:A mix of c++ and cublas code isn't compilingc++ 和 cublas 代码的混合没有编译
【发布时间】:2013-05-13 16:47:38
【问题描述】:

所以我有这段代码假设以不同的方式计算矩阵的点积(其中一种是在 c++ 中使用 blas),但是当我尝试使用 nvcc 编译代码时,它不会工作,它说我对 ddot 有一个未定义的引用。这很奇怪,因为我很确定我正在使用此处为 cublas 引用的调用符号: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 工具包,但除了 with 之外我不知道如何引用该库

#include &lt;cublas.h&gt;

新更新

事实证明,无论我是否包含 cublas.h 标头,我都会得到相同的输出

无论我是否输入 -lcublas,我都会得到相同的输出

这是所有编译的垃圾输出(带/不带 cublas.h 和带/不带 -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

【问题讨论】:

  • 你必须在“extern C”之外将cublasDDOT作为“C”吗?
  • @huseyin tugrul buyukisik 你是什么意思?我不明白。不过,我确实在我的 c 代码中使用了 cublasDDOT。
  • 也许将只读参数之一声明为 const 可能会有所帮助。也许不吧。也许 restrict 有帮助。
  • 什么是限制
  • 关于内存空间中参数不重叠的问题。顺便问一下,你的 CUDA 设备是什么?

标签: c++ cuda nvcc cublas


【解决方案1】:

即使使用 nvcc 编译,您仍然需要指定 -lcublas 链接开关。

您似乎错误地调用了函数名称:

cublasDDOT_()

应该是:

cublasDdot()

和:

cublasDAXPY_()

应该是:

cublasDaxpy()

命名区分大小写。

如果您不确定正确的命名方式,请参考 cublas documentation 并查看 sample codes 中的用法

是的,删除下划线。我不明白你为什么这样调用函数名。如果您破坏了一个名称,链接器就无法知道您打算将其链接到什么。

我也不确定是否需要任何“外部 C”内容。这取决于您的项目中还发生了什么,但如果您使用 nvcc 进行编译/链接,我认为您不应该使用“extern C”包裹您打算与 cublas 库链接的函数

【讨论】:

  • 我不能做链接的事情,因为它在一个奇怪的服务器上,路径未知。我认为它是正确的,因为 -lcublas 被接受了,对吧?
  • 哦,这很有趣,无论我是否使用 -lcublas,我都会得到相同的输出
  • 是的,我也错过了你似乎使用了不正确的函数名称,我在上面编辑了我的答案。
  • 哈哈!做得好!我刚刚想通了这一点,当我看到你的帖子时,我正要发布答案。感谢您的帮助。
  • 你能在 nvcc 编译器中使用 new 而不是 malloc 吗?我问的原因是因为它现在可以编译,但是我的代码被破坏并为矩阵 mult 返回 0。之前,当使用 g++ 编译时,它工作得很好。我知道这是一个奇怪的问题,因为我认为 nvcc 使用 g++,但我认为值得一问。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-29
  • 2016-06-21
  • 1970-01-01
  • 2011-01-13
  • 2015-10-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多