使用共享内存计算cuda中像素的大小

使用共享内存计算cuda中像素的大小,cuda,shared-memory,sift,Cuda,Shared Memory,Sift,我正在做一个学校项目,我们在cuda运行sift算法。在某一点上,我需要根据图像的相邻像素(a、B、C、D)的值来计算图像每个像素(X)的大小值: 我通过使用全局内存实现了它,因为我可以很容易地从输入数组中获得所需的值 但是现在我想先把输入数组放到共享内存中,但是我真的很难让线程把正确的像素放到共享内存中。我必须考虑图像边界上的填充 我知道我需要更多的共享内存,而不是我想放入其中的图像部分,以便包含填充,但我不知道我的线程块是否应该包含比共享内存空间更多或更少的线程,以及如何指定要读取的内容。

我正在做一个学校项目,我们在cuda运行sift算法。在某一点上,我需要根据图像的相邻像素(a、B、C、D)的值来计算图像每个像素(X)的大小值:

我通过使用全局内存实现了它,因为我可以很容易地从输入数组中获得所需的值

但是现在我想先把输入数组放到共享内存中,但是我真的很难让线程把正确的像素放到共享内存中。我必须考虑图像边界上的填充

我知道我需要更多的共享内存,而不是我想放入其中的图像部分,以便包含填充,但我不知道我的线程块是否应该包含比共享内存空间更多或更少的线程,以及如何指定要读取的内容。 如果有人能给我一个关于如何思考这个问题的总体想法,我可以从那里开始


谢谢

我提供了一个通过灰度图像并应用sobel过滤器的代码:(sobel是一个类似于您的邻居(a、B、C、D)函数的过滤器)

#定义QUANTUM_类型short
__全局无效sobel_gpu(量子型*img_输出,量子型*img_输入,整数宽度,整数高度){
int x,y;
x=blockDim.x*blockIdx.x+threadIdx.x;
y=blockDim.y*blockIdx.y+threadIdx.y;
量子型LUp、LCnt、LDw、RUp、RCnt、RDw;
整数像素;
如果(x=0)?img_in[(x-1)+(y-1)*宽度]:0;
LCnt=(x-1>=0)?img_in[(x-1)+y*宽度]:0;

LDw=(x-1>=0&&y+1我提供了一个代码,用于处理灰度图像并应用sobel过滤器:(sobel是一个类似于您的邻居(a、B、C、D)函数的过滤器)

#定义QUANTUM_类型short
__全局无效sobel_gpu(量子型*img_输出,量子型*img_输入,整数宽度,整数高度){
int x,y;
x=blockDim.x*blockIdx.x+threadIdx.x;
y=blockDim.y*blockIdx.y+threadIdx.y;
量子型LUp、LCnt、LDw、RUp、RCnt、RDw;
整数像素;
如果(x=0)?img_in[(x-1)+(y-1)*宽度]:0;
LCnt=(x-1>=0)?img_in[(x-1)+y*宽度]:0;

LDw=(x-1>=0&&y+1对于图像处理应用程序,共享内存的使用有点复杂。我建议您使用CUDA纹理。纹理读取是缓存的,边界情况的处理非常简单。纹理最适合邻域操作。您的图形设备具有哪种计算功能?对于图像处理应用程序,共享memory的使用有点复杂。我建议您使用CUDA纹理。纹理读取是缓存的,边界情况的处理非常简单。纹理最适合邻域操作。您的图形设备具有哪种计算功能?
   A
B  X  C
   D
#define QUANTUM_TYPE short
__global__ void sobel_gpu(QUANTUM_TYPE *img_out, QUANTUM_TYPE *img_in, int WIDTH, int HEIGHT){
    int x,y;
    x=blockDim.x*blockIdx.x+threadIdx.x;
    y=blockDim.y*blockIdx.y+threadIdx.y;
    QUANTUM_TYPE LUp,LCnt,LDw,RUp,RCnt,RDw;
    int pixel;

    if(x<WIDTH && y<HEIGHT){
        LUp = (x-1>=0 && y-1>=0)? img_in[(x-1)+(y-1)*WIDTH]:0;
        LCnt= (x-1>=0)? img_in[(x-1)+y*WIDTH]:0;
        LDw = (x-1>=0 && y+1<HEIGHT)? img_in[(x-1)+(y+1)*WIDTH]:0;
        RUp = (x+1<WIDTH && y-1>=0)? img_in[(x+1)+(y-1)*WIDTH]:0;
        RCnt= (x+1<WIDTH)? img_in[(x+1)+y*WIDTH]:0;
        RDw = (x+1<WIDTH && y+1<HEIGHT)? img_in[(x+1)+(y+1)*WIDTH]:0;
        pixel = -1*LUp  + 1*RUp +
                -2*LCnt + 2*RCnt +
                -1*LDw  + 1*RDw;
        pixel=(pixel<0)?0:pixel;
        pixel=(pixel>MAXRGB)?MAXRGB:pixel;
        img_out[x+y*WIDTH]=pixel;
    }
}