NPP中的nppiMean_32f_C1R函数那里用错了?

以下是我调用 nppiMean_32f_C1R的例子,环境是WIN7 64bit + VS2010 + CUDA5.5:

float pF = new float[20003000];
float dF = NULL;
cudaMalloc((void
*)&dF, 20003000sizeof(float));
srand(time(NULL));
for(int i = 0; i < 20003000;i++)
pF[i] = rand()%100;
cudaMemcpy( dF, pF, 2000
3000 * sizeof(float), cudaMemcpyHostToDevice );

int n=0;
NppiSize size={2000,3000};
nppiMeanGetBufferHostSize_32f_C1R(size, &n);
Npp8u aa=NULL;
cudaMalloc((void
*)&aa, n);
Npp64f dMean;
nppiMean_32f_C1R(dF, 2000sizeof(float), size, aa, &dMean);
cudaDeviceSynchronize();
printf(“%f\n”, dMean);
cudaFree(dF);
double d=0;
for(int j=0;j<2000
3000;j++)
d+=pF[j];
printf(“%f\n”, d/(2000*3000));
delete pF;

GPU和CPU得出的结果不一样,不知道哪里用错了?请高手指点下,谢谢!

[/i]

自己结贴了,nppiMean_32f_C1R 最后一个参数必须在device上,不能是host。

我在测试的时候发现nppiMean_32f_C1R 的 第四个参数,那个pDeviceBuffer,指针必须是对齐的,否则,会出现结果错误NPP_CUDA_KERNEL_EXECUTION_ERROR = -1000, 。使用cudaMalloc得到的指针是没问题的,不知道谁遇到过这样的问题?

这个是所有的CUDA代码都会遇到的问题,
float这种4B类型需要对其到4B,
double这种8B类型需要对其到8B,
正常的。

也许下一般的新硬件(CC4.0?)可以取消这种对齐要求,不妨期待一下。

以及稍微补充一下:

根据手册,“nppiMean_32f_C1R”的第四个参数是Nppi64f*类型的,而Nppi64f根据手册就是将double重定义成的,因而也必须满足double的对齐要求。

您可以参阅programming guide以得到各内建类型的对齐要求。