我是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代碼。顯而易見的問題是內核似乎不運行。我確定這個答案是基本的 - 非常非常基本。但我不知道發生了什麼 - 請幫忙嗎?
您應該確實檢查您所做的任何調用是否返回錯誤。 – Bart 2012-07-20 21:38:12
內核調用後進行同步會是我的猜測,但Bart在任何情況下都是正確的。 – ergosys 2012-07-21 02:36:17
@ergosys:cudaMemcpy調用被阻止並將導致同步。 – talonmies 2012-07-21 05:59:12