我最近一直在尝试cuda,我遇到了以下cuda内核的问题。
__global__ void addKernel(float *c, const float *a, const float *b, int nsize)
{
int blockID = blockIdx.x + blockIdx.y*gridDim.x;
int i = blockID*blockDim.x+threadIdx.x;
if (i < nsize){
c[i] = a[i] + b[i];
}
float k = c[i];
}`
此内核用于执行简单的向量添加。没有最后一个语句float k = c[i];
,它会正常工作。但在我添加此语句后,运行代码时将收到unspecified launch failure
错误。谁能告诉我这个内核有什么问题?
答案 0 :(得分:1)
你真的应该展示一个完整的代码,包括实际的设备内存分配以及你启动这个内核的方式(块,线程等)。但很有可能你发布了足够多的线程来覆盖工作大小(即矢量长度)。这是一个相当普遍的CUDA练习。
当你这样做时,习惯上在你的内核中包含一个线程检查:
if (i < nsize){
确保实际用于索引的i
值有效(即在向量长度内)。
但是,通过在外部线程检查(即外部 if语句的主体),您已经破坏了事情:
float k = c[i];
现在,对于内核中的任何计算i
,将尝试索引该位置的c
向量,甚至,如果i
大于nsize
,大概是c
向量的长度。
因此,此语句最有可能为c
向量分配的索引超出范围。您可以通过更多调试来确认这一点,可能使用的方法如here所述。