戈朗打电话给库达图书馆
Golang calling CUDA library
我正在尝试从我的 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 ... }; }
相关文章:
- 个人图书馆,数字正数或负数
- 像 POCO 这样的C++图书馆如何访问网络?
- 与第三方公共图书馆/代码接口
- Abseil和CMake在图书馆
- 如何制作跨平台图书馆
- MinGW在Cygwin上.关于链接GNU科学图书馆的一些问题
- 与libc相比,Gnu科学图书馆的性能较差
- 预计在GMock打电话,工厂返回unique_ptr
- 图书馆时间.H与C++
- C++的"皮条客我的图书馆"
- 模板操作员&lt;未打电话
- c 击曲线在代表前打电话给COUT
- 我需要在SDL_DestroyWindow前打电话给SDL_GL_DeleteContext吗?
- 制作不认识我的图书馆
- 打电话给功能后,为什么我会陷入无限循环中
- 谷歌丁克图书馆大楼C++
- DLL文件中函数的预期行为在C中编写并从CPP文件打电话
- 将Thirt-Party共享图书馆与Python Ctypes集成
- 打电话时返回未知错误
- 戈朗打电话给库达图书馆