2015-02-07 43 views
0

對於CUDA編程,我是初學者,但這種情況看起來並不複雜,但它不起作用。內核看起來不會執行

#include <cuda.h> 
#include <cuda_runtime.h> 

#include <iostream> 

__global__ void add(int *t) 
{ 
    t[2] = t[0] + t[1]; 
} 

int main(int argc, char **argv) 
{ 
    int sum_cpu[3], *sum_gpu; 

    sum_cpu[0] = 1; 
    sum_cpu[1] = 2; 
    sum_cpu[2] = 0; 

    cudaMalloc((void**)&sum_gpu, 3 * sizeof(int)); 

    cudaMemcpy(sum_gpu, sum_cpu, 3 * sizeof(int), cudaMemcpyHostToDevice); 

    add<<<1, 1>>>(sum_gpu); 

    cudaMemcpy(sum_cpu, sum_gpu, 3 * sizeof(int), cudaMemcpyDeviceToHost); 

    std::cout << sum_cpu[2]; 

    cudaFree(sum_gpu); 

    return 0; 
} 

我編譯它像這樣

nvcc main.cu 

它編譯,但返回的值是0。我試圖從內核中進行打印,也不會打印,所以我認爲我沒有按」執行。你能解釋爲什麼嗎?

+3

添加[適當的cuda錯誤檢查](http://stackoverflow.com/questions/14038589/what-is-the-canonical-way-to-check-for-errors-using-the-cuda-runtime-api )到您的代碼。你也可以嘗試用'cuda-memcheck'運行你的代碼。 – 2015-02-07 17:23:02

+0

謝謝你的提示。在第一個cudaMalloc上檢查報告「未知錯誤」時出錯。 'cuda-memcheck'檢測到0個錯誤。 – wiktus239 2015-02-07 17:34:57

+2

您有機器配置問題。 CUDA在該機器上無法正常工作,因爲它沒有正確安裝,或者因爲其他機器問題。您可能要仔細按照[適用於您的操作系統的入門指南](http://docs.nvidia.com/cuda/index.html#getting-started-guides)中的說明進行操作,包括驗證步驟。 – 2015-02-07 17:42:41

回答

0

我檢查了你的代碼,一切都很好。在我看來,你編譯錯了(假設你正確安裝了CUDA SDK)。也許你錯過了一些標誌......在我看來,這有點複雜。只要檢查你的GPU有哪些計算能力。

作爲最佳實踐,我爲每個CUDA項目都使用了Makefile。當您第一次正確設置您的路徑時,它非常容易使用。一個簡化的版本是這樣的:

NAME=base 
# Compilers 
NVCC = nvcc 
CC = gcc 
LINK = nvcc 
CUDA_INCLUDE=/opt/cuda 
CUDA_LIBS= -lcuda -lcudart 
SDK_INCLUDE=/opt/cuda/include 
# Flags 
COMMONFLAGS =-O2 -m64 
NVCCFLAGS =-gencode arch=compute_20,code=sm_20 -m64 -O2 
CXXFLAGS = 
CFLAGS = 
INCLUDES = -I$(CUDA_INCLUDE) 
LIBS = $(CUDA_LIBS) 
ALL_CCFLAGS := 
ALL_CCFLAGS += $(NVCCFLAGS) 
ALL_CCFLAGS += $(addprefix -Xcompiler ,$(COMMONFLAGS)) 
OBJS = cuda_base.o 
# Build rules 
.DEFAULT: all 

all: $(OBJS) 
    $(LINK) -o $(NAME) $(LIBS) $(OBJS) 
%.o: %.cu 
    $(NVCC) -c $(ALL_CCFLAGS) $(INCLUDES) $< 
%.o: %.c 
    $(NVCC) -ccbin $(CC) -c $(ALL_CCFLAGS) $(INCLUDES) $< 
%.o: %.cpp 
    $(NVCC) -ccbin $(CXX) -c $(ALL_CCFLAGS) $(INCLUDES) $< 
clean: 
    rm $(OBJS) $(NAME) 

說明

我使用的Arch Linux的x64

  • 的代碼存儲在一個名爲cuda_base.cu
  • 的路徑,我的CUDA SDK是/opt/cuda(也許你有不同的路徑)
  • 最重要的是:你的卡有哪些計算能力?我的GTX 580具有最高的計算能力2.0。所以,我必須設置爲NVCC標誌arch=compute_20,code=sm_20,代表計算能力2.0

Makefile文件需要存儲之外cuda_base.cu。我只是複製粘貼&你的代碼到這個文件,然後在外殼

$ make 
nvcc -c -gencode arch=compute_20,code=sm_20 -m64 -O2 -Xcompiler -O2 -Xcompiler -m64 -I/opt/cuda cuda_base.cu 
nvcc -o base -lcuda -lcudart cuda_base.o 
$ ./base 
3 

類型,並得到你的結果。

我和我的一個朋友創建了一個用於編寫CUDA代碼的基本模板。 You can find it here if you like.

希望這有助於;-)

+0

這聽起來會很好,人們爲什麼會低估我的答案。我真的專注於這個問題,檢查了代碼,在我的機器上執行了它,發現在某些情況下爲nvcc設置正確的標誌是非常重要的。 由於我使用Linux,所以使用Makefile編譯它很方便。這是編寫CUDA代碼並在終端上編譯的乾淨解決方案。 – n2o 2015-02-16 10:09:04

-1

我有完全相同的問題。我嘗試了'CUDA by example'的矢量和示例,Sanders & Kandrot。我輸入了代碼,將這些向量加在一起,出來了零。

CUDA不會向控制檯輸出錯誤消息,而只會從CUDAMalloc和CUDAMemcpy等函數返回錯誤代碼。在我想要得到一個工作示例的願望中,我沒有檢查錯誤代碼。一個基本的錯誤。所以,當我運行加載的版本,當我在Visual Studio中啓動一個新的CUDA項目時,它會執行錯誤檢查,賓果!一個錯誤。錯誤消息是'無效的設備功能'。

檢查出我的卡的計算能力,在書或等同的使用程序,表明它是...

...等待...

1.1

所以,我改變了編譯選項。在Visual Studio 13中,項目 - >屬性 - >配置屬性 - > CUDA C/C++ - >設備 - >代碼生成。

我將項目從compute_20,sm_20更改爲compute_11,sm_11。這表明計算能力是1.1而不是假設的2.0。

現在,重建的代碼按預期工作。

我希望這很有用。