戈朗打电话给库达图书馆

Golang calling CUDA library

本文关键字:图书馆 打电话      更新时间:2023-10-16

我正在尝试从我的 Go 代码调用 CUDA 函数。我有以下三个文件。

测试.h:

int test_add(void);

test.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;
}

test.go:

package main
import "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 的新手。

我已经尝试解决我的问题两天了,并且会非常感谢任何投入。

谢谢。

至少在这种情况下

C的go导入似乎期望为函数提供C样式链接。

CUDA(即 nvcc)主要遵循C++模式,默认提供C++样式链接(包括函数名称重整等)

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

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

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