这个cuda内核中的局部变量?

时间:2016-07-06 21:33:26

标签: cuda

我最近一直在尝试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错误。谁能告诉我这个内核有什么问题?

1 个答案:

答案 0 :(得分:1)

你真的应该展示一个完整的代码,包括实际的设备内存分配以及你启动这个内核的方式(块,线程等)。但很有可能你发布了足够多的线程来覆盖工作大小(即矢量长度)。这是一个相当普遍的CUDA练习。

当你这样做时,习惯上在你的内核中包含一个线程检查:

if (i < nsize){

确保实际用于索引的i值有效(即在向量长度内)。

但是,通过在外部线程检查(即外部 if语句的主体),您已经破坏了事情:

float k = c[i]; 

现在,对于内核中的任何计算i,将尝试索引该位置的c向量,甚至,如果i大于nsize,大概是c向量的长度。

因此,此语句最有可能为c向量分配的索引超出范围。您可以通过更多调试来确认这一点,可能使用的方法如here所述。