关于device to host 传值的错误

main函数的代码如下:
/****************** host to device*****************************/
cudaMemcpy(dev_np,np,2sizeof(int),cudaMemcpyHostToDevice);
//cudaMemcpy(rho,rhoh,ng
sizeof(float),cudaMemcpyHostToDevice);
cudaMemcpy2D(dev_x, width1sizeof(float), x, pitch, width1sizeof(float) , height, cudaMemcpyHostToDevice);
/kernel********/

setrho<<<100,1024>>>(dev_x,dev_np,rho,pitch,dev_count_e,dev_count_i);
printf(“%s\n”,cudaGetErrorString(cudaGetLastError()));
/**device to host/
cudaMemcpy(rhoh,rho,ng
sizeof(float),cudaMemcpyDeviceToHost);
printf(“%s\n”,cudaGetErrorString(cudaGetLastError()));

下面是cuda函数
global void setrho(floatdev_x,intdev_np,float rho,size_t pitch,intdev_count_e,int* dev_count_i)
{
……
for(int k=0;k<nc;k++)
while (tid<dev_count_e[k])
{
atomicAdd(&rho[i],(i+1.0-xe[tid])*qe/dx);
atomicAdd(&rho[i+1],(xe[tid]-1.0)*qe/dx);
tid++;
}
__syncthreads();

}
我的问题是:kernel运行检错结果是:no error 可是device to host 过程却是unknown error……
它不知道,我也不知道……哪位知道呀?求助各位大知者!

紧跟在kernel后面的查错可能无法得到kernel的报错信息,因为该信息不是立即可以得到的。所以,您可以在kernel后面,printf前面加上cudadeviceSynchronize();来确保之前的GPU代码全部执行完毕,然后再执行后面一行的printf。

从而进一步定位是kernel写挂了还是其他问题。

祝您编码愉快。

您好,我查过了是atomicAdd的问题,加上这两条语句返回值检查就是unknown error了,可是貌似我的atomicAdd也没有错误呀,我的编译器上显示-gencode=arch=compute_20,code="sm_21,compute_20"我的工程也是支持原子操作的呀,下面是我的头文件
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <cutil_inline.h>
#include <shrQATest.h>
#include <cuda.h>
请ice大侠帮我看看问题有可能出在什么地方了?

目测没发现明显的问题,原子操作的格式是正确的,建议看看原子操作有没有越界以及操作数有没有问题,在给出的部分代码中,xe似乎没有在kernel的参数列表里面,当然这个也可以是合理的。

祝您好运。

哈哈,找到错误啦,谢谢ice版主提醒!:victory:

哦?真是xe的问题么?不妨反馈一下。