Memory Cuda共享内存变量名的重用

Memory Cuda共享内存变量名的重用,memory,cuda,shared,Memory,Cuda,Shared,我有两个cuda内核,一个接一个地运行: __global__ void calculate_histo(const float* const d_logLuminance, unsigned int* d_histogram, float min_logLum, float lumRange, int numBins, int num_elements){ extern __shared__ float s

我有两个cuda内核,一个接一个地运行:

__global__
void calculate_histo(const float* const d_logLuminance,
        unsigned int* d_histogram,
        float min_logLum,
        float lumRange,
        int numBins,
        int num_elements){
    extern __shared__ float sdata[];
    int tid = threadIdx.x;
    int bid = blockIdx.x;
    int gid = tid * blockDim.x + bid;

    // load input into __shared__ memory
    if(gid < num_elements)
    {
        sdata[tid] = d_logLuminance[gid];
        __syncthreads();

        //compute bin value of input
        int bin = static_cast <int> (floor((d_logLuminance[gid]-min_logLum)/ lumRange * numBins));
        //increment histogram at bin value
        atomicAdd(&(d_histogram[bin]), 1);
    }
}

__global__
void blelloch_scan(unsigned int* const d_cdf, unsigned int* d_histogram, int numBins) {
    extern __shared__ unsigned int sdata[];// allocated on invocation
    int thid = threadIdx.x;
    //printf("%i \n", thid);
    //printf("%i \n", d_histogram[thid]);

    int offset = 1;


    sdata[2*thid] = d_histogram[2*thid]; // load input into shared memory
    sdata[2*thid+1] = d_histogram[2*thid+1];

    // build sum in place up the tree
    for (int d = numBins>>1; d > 0; d >>= 1) {
        __syncthreads();
        if (thid < d) {
            int ai = offset*(2*thid+1)-1;
            int bi = offset*(2*thid+2)-1;
            sdata[bi] += sdata[ai];
        }
        offset *= 2;
    }
    if (thid == 0) { sdata[numBins - 1] = 0; } // clear the last element
    // traverse down tree & build scan
    for (int d = 1; d < numBins; d *= 2) {
        offset >>= 1;
        __syncthreads();
        if (thid < d) {
            int ai = offset*(2*thid+1)-1;
            int bi = offset*(2*thid+2)-1;
            float t = sdata[ai];
            sdata[ai] = sdata[bi];
            sdata[bi] += t;
        }
        __syncthreads();
        d_cdf[2*thid] = sdata[2*thid]; // write results to device memory
        d_cdf[2*thid+1] = sdata[2*thid+1];
    }

}

如果我对每个内核使用不同的变量名,这似乎解决了问题。有人知道为什么我不能重用相同的变量名吗

CUDA只是遵循标准C语言的规则。引用Kernighan和Ritchie的《C编程语言》一书:

外部变量必须在任何函数外定义一次;这为它留出了存储空间。变量还必须在每个想要访问它的函数中声明;这说明了变量的类型。[…]定义是指创建或分配变量存储的位置;声明是指声明变量性质但未分配存储的位置

在你的程序中,你应该有

extern __shared__ unsigned int sdata[];
在该位置,您正在创建一个名为
sdata
的指针,指向
无符号int
。在
\uuuu global\uuuu
函数中,您正在声明
sdata
的类型,以便
\uuu global\uuu
函数可以知道它。在

kernel<<<blocks,threads,numbytes_for_shared>>>(...);
内核(…);

启动时,您正在分配由
sdata

指向的数组的空间,我怀疑实际情况是否如此,因为即使在两个单独的函数中没有sdata[],您也可能会遇到此问题;而且,sdata并不是一个真正具有全局定义的外部变量。你能举例说明你在说什么吗?@einpoklum你问题中的问题似乎与这个问题中的问题完全相同。CUDA以C++的方式处理<代码> ExtNe>代码>变量。
kernel<<<blocks,threads,numbytes_for_shared>>>(...);