我是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