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()
。因此,如果将断点放在__