go - Go语言的cgo如何编译Cuda源码?

标签 go cuda environment nvcc cgo

我用 cuda-c 编写了一个简单的程序,它可以在 eclipse nsight 上运行。这是源代码:

#include <iostream>
#include <stdio.h>


__global__ void add( int a,int b, int *c){
*c = a + b;
}

int main(void){

int c;
int *dev_c;

cudaMalloc((void**)&dev_c, sizeof(int));

add <<<1,1>>>(2,7,dev_c);

cudaMemcpy(&c, dev_c, sizeof(int),cudaMemcpyDeviceToHost);

printf("\n2+7= %d\n",c);
cudaFree(dev_c);

return 0;
}

现在我正在尝试将此代码与带有 cgo 的 Go 语言一起使用!!! 所以我写了这段新代码:

package main

//#include "/usr/local/cuda-7.0/include/cuda.h"
//#include "/usr/local/cuda-7.0/include/cuda_runtime.h"
//#cgo LDFLAGS: -lcuda
//#cgo LDFLAGS: -lcurand
////default location:
//#cgo LDFLAGS: -L/usr/local/cuda-7.0/lib64 -L/usr/local/cuda-7.0/lib
//#cgo CFLAGS: -I/usr/local/cuda-7.0/include/
//
//
//
//
//
//
//
//
//
//
/*

#include <stdio.h>

__global__ void add( int a,int b, int *c){
    *c = a + b;
}

int esegui_somma(void){

    int c;
    int *dev_c;

    cudaMalloc((void**)&dev_c, sizeof(int));
    add <<<1,1>>> (2,7,dev_c);
    cudaMemcpy(&c, dev_c, sizeof(int),cudaMemcpyDeviceToHost);

    cudaFree(dev_c);
    return c;
}
*/
import "C"
import "fmt"

func main(){
    fmt.Printf("il risultato è %d",C.esegui_somma)
}

但是没用!! 我读到了这条错误信息:

cgo_cudabyexample_1/main.go:34:8: error: expected expression before '<' token
add <<<1,1>>> (2,7,dev_c);
      ^

我认为我必须为 cgo 而不是 gcc 设置 nvcc cuda 编译器。 我该怎么做?我可以更改 CC 环境变量吗? 最好的问候

最佳答案

我终于想出了如何做到这一点。最大的问题是 nvcc 不遵循 gcc 标准标志,并且与 clang 不同,它不会默默地忽略它们。 cgo 通过添加一堆用户未明确指定的标志来触发问题。

要使其全部正常工作,您需要将设备代码和直接调用它的函数分离到单独的文件中,并使用 nvcc 直接将它们编译/打包到共享库 (.所以)。然后,您将使用 cgo 使用您系统上的任何默认链接器链接此共享库。您唯一需要添加的是 -lcudart 到您的 LDFLAGS(链接器标志)以链接 CUDA 运行时。

关于go - Go语言的cgo如何编译Cuda源码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32589153/

相关文章:

CUDA:单个设备上有多少个默认流?

ASP.NET 如何在发布应用程序期间在 web.config 中设置变量

testing - 有没有反向 "De-crapify"类型的软件

php - mysqli_fetch_assoc()需要参数/调用成员函数bind_param()错误。如何获取并修复实际的mysql错误?

go - 如何正确实现并发 goroutines(和/或限制它们)以产生一致的结果?

go - 无法检测到 Kubernetes 中的 tcp 服务没有带有 golang 应用程序的 pod

json - Golang 解码以数组开头的 json

go - Golang修复jpeg错误的EOF格式

c++ - 如何有效地将 vector 重复到cuda中的矩阵?

cuda - CUDA 是否会自动为您进行负载平衡?