hor*_*ann 5 cuda gpu gpu-programming
我有一个CUDA代码,其工作方式如下:
cpyDataGPU --> CPU
while(nsteps){
cudaKernel1<<<,>>>
function1();
cudaKernel2<<<,>>>
}
cpyDataGPU --> CPU
Run Code Online (Sandbox Code Playgroud)
而function1就像这样:
function1{
cudaKernel3<<<,>>>
cudaKernel4<<<,>>>
cpyNewNeedDataCPU --> GPU // Error line
cudaKernel5<<<,>>>
}
Run Code Online (Sandbox Code Playgroud)
根据cudaMemcpy文档,此函数可以产生4种不同的错误代码:“ cudaSuccess”,“ cudaErrorInvalidValue”,“ cudaErrorInvalidDevicePointer”和“ cudaErrorInvalidMemcpyDirection”。
但是,我收到以下错误:“ cudaErrorLaunchFailure”:“执行内核时设备上发生了异常。常见原因包括取消引用无效的设备指针和访问共享内存。在调用cudaThreadExit()之前,无法使用设备所有现有的设备内存分配都是无效的,如果程序要继续使用CUDA,则必须对其进行重新构造。”
有人对我为什么会收到此错误有任何想法吗?我究竟做错了什么?
在先前的内核调用¿之后复制数据CPU-> GPU是否有意义?问题是,我必须在每个步骤将数据复制到这里,因为它可能在每个“ while”步骤中都会更改。
提前解冻很多!!
您链接的文档还说:
请注意,此函数还可能返回先前异步启动的错误代码。
调用时cudaMemcpy(),程序将等待所有之前的GPU工作完成(请记住内核启动是异步的),然后检查状态并在一切正常的情况下执行memcpy。但是,在这种情况下,您的一个内核已失败。
此错误的最常见原因是越界访问,就像x86区域中的段错误一样。
cudaErrorLaunchFailure:执行内核时设备上发生了异常。常见原因包括取消引用无效的设备指针和超出范围共享内存。在调用cudaThreadExit()之前,无法使用该设备。所有现有的设备内存分配都是无效的,如果程序要继续使用CUDA,则必须对其进行重构。
调试此问题的最简单方法是使用cuda-memcheck。另外,您可以通过cudaDeviceSynchronize()在每次内核启动后调用并检查返回值来确定哪个内核失败。
| 归档时间: |
|
| 查看次数: |
8992 次 |
| 最近记录: |