2015-12-30 85 views
3

我正在嘗試使用cuda創建我的第一個程序。 所以我把這個簡單的HelloWorld與各種網頁的指導。一個簡單的C++ Hello World與cuda

#include <cstdlib> 
#include <cstdio> 
#include <cuda.h> 

using namespace std; 

__global__ void mykernel(void) { 
} 

int main(void) { 
mykernel<<<1,1>>>(); 
printf("CPU Hello World!\n"); 
return 0; 
} 

但我得到這樣的輸出:

"/usr/bin/make" -f nbproject/Makefile-Debug.mk QMAKE= SUBPROJECTS= .build-conf 
make[1]: Entering directory `/home/sebastian/Dropbox/Universidad/Trabajo_de_Grado_pregrado/Codigos/HelloWordCuda' 
"/usr/bin/make" -f nbproject/Makefile-Debug.mk dist/Debug/GNU-Linux-x86/hellowordcuda 
make[2]: Entering directory `/home/sebastian/Dropbox/Universidad/Trabajo_de_Grado_pregrado/Codigos/HelloWordCuda' 
mkdir -p build/Debug/GNU-Linux-x86 
rm -f "build/Debug/GNU-Linux-x86/hellowordcuda.o.d" 
g++ -c -g -I/usr/local/cuda-7.5/include -MMD -MP -MF "build/Debug/GNU-Linux-x86/hellowordcuda.o.d" -o build/Debug/GNU-Linux-x86/hellowordcuda.o hellowordcuda.cpp 
hellowordcuda.cpp:19:1: error: ‘__global__’ does not name a type 
__global__ void mykernel(void) { 
^ 
hellowordcuda.cpp: In function ‘int main()’: 
hellowordcuda.cpp:24:1: error: ‘mykernel’ was not declared in this scope 
mykernel<<<1,1>>>(); 
^ 
hellowordcuda.cpp:24:11: error: expected primary-expression before ‘<’ token 
mykernel<<<1,1>>>(); 
     ^
hellowordcuda.cpp:24:17: error: expected primary-expression before ‘>’ token 
mykernel<<<1,1>>>(); 
       ^
hellowordcuda.cpp:24:19: error: expected primary-expression before ‘)’ token 
mykernel<<<1,1>>>(); 
       ^
make[2]: *** [build/Debug/GNU-Linux-x86/hellowordcuda.o] Error 1 
make[2]: Leaving directory `/home/sebastian/Dropbox/Universidad/Trabajo_de_Grado_pregrado/Codigos/HelloWordCuda' 
make[1]: *** [.build-conf] Error 2 
make[1]: Leaving directory `/home/sebastian/Dropbox/Universidad/Trabajo_de_Grado_pregrado/Codigos/HelloWordCuda' 
make: *** [.build-impl] Error 2 

我製作一個問題這麼簡單抱歉,但我就是沒有找到這方面的任何答覆。

非常感謝,任何幫助將不勝感激!

+0

我只在大學使用C++,所以如果這是一個愚蠢的問題,請原諒我。那是什麼__global__關鍵字?只是說void mykernel()也會讓你的方法成爲全局的。 __global__看起來像是python的東西 – NSNoob

+1

@NSNoob它是CUDA的一部分。 – Angew

+0

哦,好吧謝謝Angew! – NSNoob

回答

7

有你需要做的,使這項工作兩件事情:

  1. 使用CUDA編譯器驅動程序nvcc來引導代碼的編譯
  2. 重命名hellowordcuda.cpphellowordcuda.cu代碼傳遞給nvcc

第二點是必要的,因爲nvcc使用文件擴展名來引導編譯,如果你的代碼有一個.cc.cpp文件擴展名,它只會將代碼傳遞給主機編譯器,並將導致相同的編譯錯誤

4

看來你是用g ++直接構建的。您需要使用NVidia的編譯器(nvcc)來使用CUDA,並確保它知道將該文件處理爲CUDA C.可以通過將擴展名更改爲.cu,或者通過編譯選項指定文件&處理來實現類型。我建議前者。

+4

使用nvcc將顯示相同的行爲。文件擴展名也需要改變。 – talonmies

+0

@talonmies謝謝,合併。 – Angew

3

在指南還低於行提到,

$ nvcc hello.cu 
$ a.out 
Hello World! 

請在Makefile改變g++nvcc

+2

此處同樣的文件擴展名問題適用於此。 – talonmies