使用nvcc

时间:2017-08-24 23:12:08

标签: c cuda linker nvcc

我想在常规旧C中编写一些主机辅助函数,将其包含在.cu文件中,该文件运行部分主机代码并定义和调用内核函数。我对makefile没有任何了解,对一般的多文件项目也没有好感,也无法理解为什么以下工作时使用.c扩展名但是使用.cu扩展名失败。

A.H

void sayhello();

A.C:

#include "A.h"
#include <stdio.h>
void sayhello() {
    printf("Hello from A\n");
}

B.c:

#include "A.h"
int main(int argc, char * argv) {
    sayhello();
    return 0;
}

B.cu

#include "A.h"
int main(int argc, char * argv[]) {
    sayhello();
    return 0;
}

当我编译A.c时一切正常:

$ nvcc -arch compute_30 -code sm_30 -o test B.c A.c  
$ ./test  
Hello from A

但是当尝试编译B.cu时,链接器找不到sayhello()

$ nvcc -o test B.cu A.c  
/tmp/tmpxft_000017bb_00000000-16_B.o: In function 'main':
tmpxft_000017bb_00000000-4_B.cudafe1.cpp:(.text+0x26): undefined reference to 'sayhello()'
collect2: error: ld returned 1 exit status

为什么不找到sayhello(),这些编译之间有什么区别,是否有编译此结构代码的解决方案?

2 个答案:

答案 0 :(得分:2)

CUDA使用C ++编译器编译.cu个文件。因此,除非另有明确说明,否则它期望.cu文件中引用的所有函数都具有C ++链接。在您的情况下,您必须以其他方式明确指示C ++编译器。

您应该发现修改代码如下:

extern "C" { 
#include "A.h"
}
int main(int argc, char * argv[]) {
    sayhello();
    return 0;
}

将解决问题,因为它将指示编译器期望C函数的C链接,而不是C ++链接。

答案 1 :(得分:-2)

您需要在sayhello函数上使用__host__ __device__装饰。

另外,在A.h

中包含cuda_runtime.h