为了账号安全,请及时绑定邮箱和手机立即绑定

Golang 调用 CUDA 库

Golang 调用 CUDA 库

Go
catspeake 2021-12-20 10:58:15
我正在尝试从我的 Go 代码中调用 CUDA 函数。我有以下三个文件。测试.h:int test_add(void);测试.cu:__global__ void add(int *a, int *b, int *c){       *c = *a + *b;}int test_add(void) {       int a, b, c; // host copies of a, b, c       int *d_a, *d_b, *d_c; // device copies of a, b, c       int size = sizeof(int);       // Allocate space for device copies of a, b, c       cudaMalloc((void **)&d_a, size);       cudaMalloc((void **)&d_b, size);       cudaMalloc((void **)&d_c, size);      // Setup input values      a = 2;      b = 7;      // Copy inputs to device      cudaMemcpy(d_a, &a, size, cudaMemcpyHostToDevice);      cudaMemcpy(d_b, &b, size, cudaMemcpyHostToDevice);      // Launch add() kernel on GPU     add<<<1,1>>>(d_a, d_b, d_c);     // Copy result back to host     cudaMemcpy(&c, d_c, size, cudaMemcpyDeviceToHost);     // Cleanup     cudaFree(d_a); cudaFree(d_b); cudaFree(d_c);    return 0;}测试去:package mainimport "fmt"//#cgo CFLAGS: -I.//#cgo LDFLAGS: -L. -ltest//#cgo LDFLAGS: -lcudart//#include <test.h>import "C"func main() {     fmt.Printf("Invoking cuda library...\n")     fmt.Println("Done ", C.test_add())}我正在编译 CUDA 代码:nvcc -m64 -arch=sm_20 -o libtest.so --shared -Xcompiler -fPIC test.cu所有三个文件 - test.h、test.cu 和 test.go 都在同一目录中。当我尝试使用 go 构建时遇到的错误是“对‘test_add’的未定义引用”。我对 C/C++ 的经验很少,而且我是 CUDA 的新手。我已经尝试解决我的问题两天了,非常感谢您提供任何意见。
查看完整描述

1 回答

?
守着一只汪

TA贡献1872条经验 获得超4个赞

看来,至少在这种情况下, go 导入C期望该函数提供 C 风格的链接

CUDA(即nvcc)主要遵循C++模式,默认提供C++风格的链接(包括函数名修改等)

可以使用 C 强制外部提供一段代码,而不是使用extern "C" {...code...}. 这是 C++ 语言功能,并非特定于 CUDA 或 nvcc。

因此,似乎可以通过对 test.cu 进行以下修改来解决问题:

extern "C" { int test_add(void) { ... code ... }; }


查看完整回答
反对 回复 2021-12-20
  • 1 回答
  • 0 关注
  • 369 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号