Cuda 仅分配了共享内存阵列的一半

Cuda 仅分配了共享内存阵列的一半,cuda,shared-memory,nsight,Cuda,Shared Memory,Nsight,当我在s_f[sidx]=5之后使用Nsight stepped时,我看到只有一半的共享内存数组被分配 __global__ void BackProjectPixel(double* val, double* projection, double* focalPtPos, d

当我在
s_f[sidx]=5之后使用Nsight stepped时,我看到只有一半的共享内存数组被分配

__global__ void BackProjectPixel(double* val,   
                                    double* projection,
                                    double* focalPtPos,
                                    double* pxlPos,
                                    double* pxlGrid,
                                    double* detPos, 
                                    double *detGridPos,
                                    unsigned int nN,
                                    unsigned int nS,
                                    double perModDetAngle,
                                    double perModSpaceAngle,
                                    double perModAngle)                 
{
    const double fx = focalPtPos[0];
    const double fy = focalPtPos[1];

    //extern __shared__ double s_f[64]; // 

    __shared__ double s_f[64]; // 

    unsigned int i = (blockIdx.x * blockDim.x) + threadIdx.x;
    unsigned int j = (blockIdx.y * blockDim.y) + threadIdx.y;
    unsigned int idx = j*nN + i;

    unsigned int sidx = threadIdx.y * blockDim.x + threadIdx.x;

    unsigned int threadsPerSharedMem = 64;

    if (sidx < threadsPerSharedMem)
    {
        s_f[sidx] = 5;
    }

    __syncthreads();

    //double * angle;
    //

    if (sidx < threadsPerSharedMem)
    {

        s_f[idx] = TriPointAngle(detGridPos[0], detGridPos[1],fx, fy, pxlPos[idx*2], pxlPos[idx*2+1], nN);
    }



}
\uuuuu全局\uuuuu无效反向投影像素(双*val,
双*投影,
双焦点,
双*PXLPO,
双*pxlGrid,
双*detPos,
双*detGridPos,
无符号整数nN,
无符号整数nS,
双坡莫德角,
双永久空间角,
双坡角)
{
const double fx=focalPtPos[0];
const double fy=focalPtPos[1];
//外部共享双s\U f[64];//
__共享双s_f[64];//
无符号整数i=(blockIdx.x*blockDim.x)+threadIdx.x;
无符号int j=(blockIdx.y*blockDim.y)+threadIdx.y;
无符号整数idx=j*nN+i;
无符号int-sidx=threadIdx.y*blockDim.x+threadIdx.x;
无符号int-threadspersharedem=64;
if(sidx
这是我观察到的


我想知道为什么只有32个5?
suf
中不应该有六十四个5吗?谢谢。

线程以线程组(通常为32个)的形式执行,这些线程也称为warp。扭曲按顺序将螺纹分组。在您的情况下,一个扭曲将得到线程0-31,其他32-63。在调试上下文中,您可能只看到包含线程0-31的扭曲的结果。

线程以线程组(通常为32)执行,这些线程组也称为扭曲。扭曲按顺序将螺纹分组。在您的情况下,一个扭曲将得到线程0-31,其他32-63。在调试上下文中,您可能只看到包含线程0-31的扭曲的结果。

线程以线程组(通常为32)执行,这些线程组也称为扭曲。扭曲按顺序将螺纹分组。在您的情况下,一个扭曲将得到线程0-31,其他32-63。在调试上下文中,您可能只看到包含线程0-31的扭曲的结果。

线程以线程组(通常为32)执行,这些线程组也称为扭曲。扭曲按顺序将螺纹分组。在您的情况下,一个扭曲将得到线程0-31,其他32-63。在调试上下文中,您可能只看到包含线程0-31的扭曲的结果

我想知道为什么只有32个5

有32个5,因为正如mete所说,内核只能由大小为32的线程组同时执行,在CUDA术语中称为扭曲

s_f不是应该有64个5吗

在同步屏障之后将有64个5,即
\uu syncthreads()
。因此,如果您将断点放在
\uu syncthreads()
调用之后的第一条指令上,您将看到所有五个。这是因为到那时,来自一个块的所有扭曲将在
\uuu syncthreads()
之前完成所有代码的执行


如何使用Nsight查看所有扭曲

通过将其放入watchfield,您可以轻松查看所有线程的值:

s_f[sidx]
尽管由于优化,
sidx
值可能会变得未定义,因此我最好注意以下值:

s_f[((blockIdx.y * blockDim.y) + threadIdx.y) * nN + (blockIdx.x * blockDim.x) + threadIdx.x]
事实上,如果您想调查特定扭曲的值,那么正如Robert Crovella指出的,您应该使用条件断点。如果您想在第二个扭曲内断裂,那么在二维块的二维网格(我假定您正在使用)的情况下,应该可以使用类似的方法:

因为32是第二个经纱中第一条线的索引。有关块标注和轴网标注的其他组合,请参见

我想知道为什么只有32个5

有32个5,因为正如mete所说,内核只能由大小为32的线程组同时执行,在CUDA术语中称为扭曲

s_f不是应该有64个5吗

在同步屏障之后将有64个5,即
\uu syncthreads()
。因此,如果您将断点放在
\uu syncthreads()
调用之后的第一条指令上,您将看到所有五个。这是因为到那时,来自一个块的所有扭曲将在
\uuu syncthreads()
之前完成所有代码的执行


如何使用Nsight查看所有扭曲

通过将其放入watchfield,您可以轻松查看所有线程的值:

s_f[sidx]
尽管由于优化,
sidx
值可能会变得未定义,因此我最好注意以下值:

s_f[((blockIdx.y * blockDim.y) + threadIdx.y) * nN + (blockIdx.x * blockDim.x) + threadIdx.x]
事实上,如果您想调查特定扭曲的值,那么正如Robert Crovella指出的,您应该使用条件断点。如果您想在第二个扭曲内断裂,那么在二维块的二维网格(我假定您正在使用)的情况下,应该可以使用类似的方法:

因为32是第二个经纱中第一条线的索引。有关块标注和轴网标注的其他组合,请参见

我想知道为什么只有32个5

有32个5,因为正如mete所说,内核只能由大小为32的线程组同时执行,在CUDA术语中称为扭曲

s_f不是应该有64个5吗

在同步屏障之后将有64个5,即
\uu syncthreads()
。因此,如果将断点放在
__