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

时间:2015-09-15 14:51:07

标签: 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;
}

现在我尝试将此代码与go语言一起用于cgo! 所以我写了这个新代码:

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环境变量吗? 最好的问候

1 个答案:

答案 0 :(得分:2)

我终于想出了如何做到这一点。最大的问题是$conn = new COM("ADODB.Connection") or die("Oops!"); $conn->Open("DRIVER={Microsoft Access Driver (*.mdb)};DBQ=C:\Users\admin.mdb","","password"); $data = $conn->Execute("SELECT * FROM TFTemp17"); echo "<TABLE border='1'>"; echo "<tr>"; $num_columns = $data->Fields->Count(); while (!$data->EOF) { for ($i=0; $i < $num_columns; $i++) { echo "<td>".$data->Fields($i)->value."</td>"; } $data->MoveNext(); } echo "</tr>"; echo "</TABLE>"; $data->Close(); $conn->Close(); $data = null; $conn = null; 不遵循nvcc标准标志,与gcc不同,它不会默默地忽略它们。 clang通过添加一组未由用户明确指定的标志来触发问题。

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