我正在尝试从我的 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 ... }; }- 1 回答
- 0 关注
- 369 浏览
添加回答
举报
0/150
提交
取消
