首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何用Go语言的cgo编译Cuda源码?

如何用Go语言的cgo编译Cuda源码?
EN

Stack Overflow用户
提问于 2015-09-15 22:51:07
回答 1查看 966关注 0票数 3

我用cuda-c写了一个简单的程序,它在eclipse nsight上工作。这是源代码:

代码语言:javascript
复制
#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;
}

现在我正在尝试用Go语言和cgo一起使用这段代码!所以我写了这个新代码:

代码语言:javascript
复制
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)
}

但是它不起作用!!我读到了这个错误消息:

代码语言:javascript
复制
cgo_cudabyexample_1/main.go:34:8: error: expected expression before '<' token
add <<<1,1>>> (2,7,dev_c);
      ^

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

EN

回答 1

Stack Overflow用户

发布于 2015-11-30 00:40:31

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

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32589153

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档