2012-07-20 82 views
0

我是CUDA &的新手,試圖獲得在設備上運行的基本內核。我已編譯示例&然後運行,所以我知道設備驅動程序工作/ CUDA可以成功運行。我的目標是讓我的C++代碼調用CADU來極大地加速任務。我一直在閱讀關於如何做到這一點的一些不同的帖子。具體來說,[這裏]:Can I call CUDA runtime function from C++ code not compiled by nvcc?基本CUDA - 讓內核在使用C++的設備上運行

當我編譯&時,我的問題非常簡單(擁抱如此)運行我的代碼(發佈如下)我沒有得到任何錯誤,但內核似乎不運行。這應該是微不足道的解決,但6個小時後,我無所適從。我會在NVIDIA論壇上發佈這個消息,但他們仍然處於關閉狀態:/。我相信答案是非常基本的 - 有什麼幫助?下面是:我的代碼,我怎麼編譯它,&端子輸出我看到:

的main.cpp

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
extern void kernel_wrapper(int *a, int *b); 

int main(int argc, char *argv[]){ 
int a = 2; 
int b = 3; 

printf("Input: a = %d, b = %d\n",a,b); 
kernel_wrapper(&a, &b); 
printf("Ran: a = %d, b = %d\n",a,b); 
return 0; 
} 

kernel.cu

#include "cuPrintf.cu" 
#include <stdio.h> 
__global__ void kernel(int *a, int *b){ 
int tx = threadIdx.x; 
cuPrintf("tx = %d\n", tx); 
switch(tx){ 
    case 0: 
    *a = *a + 10; 
    break; 
    case 1: 
    *b = *b + 3; 
    break; 
    default: 
    break; 
    } 
} 

void kernel_wrapper(int *a, int *b){ 
    cudaPrintfInit(); 
    //cuPrintf("Anything...?"); 
    printf("Anything...?\n"); 
    int *d_1, *d_2; 
    dim3 threads(2, 1); 
    dim3 blocks(1, 1); 

    cudaMalloc((void **)&d_1, sizeof(int)); 
    cudaMalloc((void **)&d_2, sizeof(int)); 

    cudaMemcpy(d_1, a, sizeof(int), cudaMemcpyHostToDevice); 
    cudaMemcpy(d_2, b, sizeof(int), cudaMemcpyHostToDevice); 

    kernel<<< blocks, threads >>>(a, b); 
    cudaMemcpy(a, d_1, sizeof(int), cudaMemcpyDeviceToHost); 
    cudaMemcpy(b, d_2, sizeof(int), cudaMemcpyDeviceToHost); 
    printf("Output: a = %d\n", a[0]); 
    cudaFree(d_1); 
    cudaFree(d_2); 

    cudaPrintfDisplay(stdout, true); 
    cudaPrintfEnd(); 
} 

我編譯上面的代碼從終端使用命令:

​​

當我運行代碼時,我得到下面的終端放:

$./main 
Input: a = 2, b = 3 
Anything...? 
Output: a = 2 
Ran: a = 2, b = 3 

很顯然,在main.cpp中被編譯正確&調用kernel.cu代碼。顯而易見的問題是內核似乎不運行。我確定這個答案是基本的 - 非常非常基本。但我不知道發生了什麼 - 請幫忙嗎?

+2

您應該確實檢查您所做的任何調用是否返回錯誤。 – Bart 2012-07-20 21:38:12

+0

內核調用後進行同步會是我的猜測,但Bart在任何情況下都是正確的。 – ergosys 2012-07-21 02:36:17

+1

@ergosys:cudaMemcpy調用被阻止並將導致同步。 – talonmies 2012-07-21 05:59:12

回答

2

裏面kernel_wrapper您有以下電話:

kernel<<< blocks, threads >>>(a, b); 

什麼,你正在做的是要傳遞給它的引用到生活在主機上的變量。 GPU無法對它們進行操作。傳遞的值必須存在於GPU上。基本上通過d_1和d_2將解決問題,結果將是a = 12和b = 6。

kernel<<< blocks, threads >>>(d_1, d_2);