求帮助!第一个CUDA程序执行不正确。

很不容易在Win7 64位+VS2008上搭起来CUDA的编程环境,而且SDK的示例程序都能编译、运行成功、结果正确。自己利用CUDAVSWIZARD很高兴地开始编自己的第一个CUDA程序,编译链接也都成功,但是结果总不对,让GPU做简单的加法,结果总是0,郁闷,希望高手指点迷津!谢谢。
我的程序代码:
#include <stdio.h>
#include <cuda_runtime.h>
#include <cutil_inline.h>

global void add(int a, int b, int *c){
*c=a+b;
}

int main(void){
int c;
int *dev_c;

cutilSafeCall(cudaMalloc((void**)&dev_c, sizeof(int)));

add<<<1,1>>>(2,7,dev_c);

cutilSafeCall(cudaMemcpy(&c,dev_c,sizeof(int), cudaMemcpyDeviceToHost));

printf(“2+7=%d\n”,c);

cutilSafeCall(cudaFree(dev_c));

system(“pause”);
return 0;
}

执行时输出是:
2+7=0
请按任意键继续. . .

????????为什么输出总是0呢????????

[ 本帖最后由 keith_269 于 2011-3-6 22:57 编辑 ]

我通过在kernel函数之后加上CUDAGETLASTERROR,返回的错误是invalid device function。该怎么解决呢?

global void add(int a, int b, int *c)函数中的a,b参数没在gpu上分配空间

kernel函数里面应该这样去写:

int i = threadIdx.x;
c[i] = a[i] + b[i];

你没有给GPU分配线程

基本上就没有写对……

[

代码看上去没有任何问题! 你应该得到2+7=9的结果。

但是你没有得到,而且你说提示“Invalid device function", 一般是你的卡不支持你所编译的目标代码。例如,你的卡是1.0的,你却为能力2.1编译。就会出现这种情况。

仔细看下你的编译规则,修改下,重新编译应该就好了。

我觉得他代码有问题,还是不知道他复制的时候错了~

至少要指定grid吧

[

看上去没啥问题啊?他都指定了(1,1,1), (1,1,1)了。

在那个add<<<1,1>>>(…)那行。。

我眼花了?……幻觉……

不用CUDAVSWIZARD试试。

1、建议将形参a b定义为指针类型并为其分配显存(global memory)空间。(标准操作)
2、通过cudaGetLastError(),看看两个cudamemcpy()和核函数是否正常调用?