2012-07-20 36 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);