如何在openCL中将图像从全局内存复制到本地内存

如何在openCL中将图像从全局内存复制到本地内存,opencl,c++,c,gpu,Opencl,C++,C,Gpu,我有两个输入图像,我将它们从主机传递到内核。 我的图像的尺寸是370x427 我想让自己熟悉本地内存,因此我也将本地映像传递给内核,并尝试将全局映像复制到本地 我正在以1D数组的形式发送图像。当我尝试显示结果时,它不起作用。我的全局工作大小是{width*height},我将null传递给本地大小ClenqueEndRangeKernel,假设我会为本地内存选择合适的大小 下面是我的内核代码 如果有人能给我一个提示,请告诉我 __kernel void computeSSD(__glo

我有两个输入图像,我将它们从主机传递到内核。 我的图像的尺寸是370x427

我想让自己熟悉本地内存,因此我也将本地映像传递给内核,并尝试将全局映像复制到本地

我正在以1D数组的形式发送图像。当我尝试显示结果时,它不起作用。我的全局工作大小是
{width*height}
,我将
null
传递给本地大小
ClenqueEndRangeKernel
,假设我会为本地内存选择合适的大小

下面是我的内核代码

如果有人能给我一个提示,请告诉我

     __kernel void computeSSD(__global unsigned char *imgL,__global unsigned char *imgR,__global unsigned char *result,__global unsigned char *diff,int width,int MAX_DISP,int WIN_SIZE,__local unsigned char *localLeft,__local unsigned char *localRight )
        {

            int xCord=get_global_id(0); 
            int yCord=get_local_id(0);

            // copy both images to local memory

            localRight[yCord]=  imgR[yCord];  
            localLeft[yCord] = imgL[yCord];

            barrier(CLK_LOCAL_MEM_FENCE);
// do operation on local images
                  result[xCord]=localRight[yCord];
//

         }

如果使用3x3过滤器过滤图像。每个工作组的每侧都需要工作组像素+1边距

因此,您的内核可以是:

__kernel filter(...){
    int x_start = get_group_id(0)*get_local_size(0)-1;
    int y_start = get_group_id(1)*get_local_size(1)-1;
    int x_end = (get_group_id(0)+1)*get_local_size(0)+1;
    int y_end = (get_group_id(1)+1)*get_local_size(1)+1;

    __local mytype l[18][18]; //just an example for work sizes 16x16!

    //Fetch
    //Normally a direct operation per work item is preferred, since it is simpler and the driver will pack all the memory accesses together.
    //So just follow coalesced access
    //Using CL async workgroup copy has a complex sintax
    for(int j=y_start+get_local_id(1); j<y_end; j+=get_local_size(1) ){
        for(int i=x_start+get_local_id(0); i<x_end; i+=get_local_size(0) ){
            l[j-y_start][i-x_start] = global[j][i];
        }
    }
    barrier(CLK_GLOBAL_MEM);

    //Use the memory for your filtering! (remember to substract y_start & x_start from your original indexes)
    //....
 }
\uuuu内核过滤器(…){
int x_start=get_group_id(0)*get_local_size(0)-1;
int y_start=get_group_id(1)*get_local_size(1)-1;
int x_end=(获取组id(0)+1)*获取局部大小(0)+1;
int y_end=(获取组id(1)+1)*获取局部大小(1)+1;
__本地mytype l[18][18];//这只是工作尺寸16x16的一个示例!
//取回
//通常,每个工作项的直接操作是首选的,因为它更简单,并且驱动程序将所有内存访问打包在一起。
//所以只需遵循联合访问
//使用CL异步工作组复制有一个复杂的sintax

对于(int j=y_start+get_local_id(1)),我的映像的JD维度正好是370x427。此外,大多数设备甚至没有足够的本地内存来存储这么小的映像(370x427)。