Memory management 在OpenCL内核中创建本地动态数组

Memory management 在OpenCL内核中创建本地动态数组,memory-management,opencl,gpgpu,pyopencl,Memory Management,Opencl,Gpgpu,Pyopencl,我有一个OpenCL内核,它需要将一个数组作为多个数组进行处理,其中每个子数组和都保存在本地缓存数组中 例如,想象一下fowling数组: [[1, 2, 3, 4], [10, 30, 1, 23]] 每个工作组得到一个数组(在示例中,我们有两个工作组) 每个工作项处理两个数组索引(例如,将值索引乘以本地_id),其中工作项结果保存在工作组共享数组中 __kernel void test(__global int **values, __global int *result, const

我有一个OpenCL内核,它需要将一个数组作为多个数组进行处理,其中每个子数组和都保存在本地缓存数组中

例如,想象一下fowling数组:

[[1, 2, 3, 4], [10, 30, 1, 23]]
  • 每个工作组得到一个数组(在示例中,我们有两个工作组)
  • 每个工作项处理两个数组索引(例如,将值索引乘以本地_id),其中工作项结果保存在工作组共享数组中

    __kernel void test(__global int **values, __global int *result, const int array_size){
        __local int cache[array_size];
    
        // initialise
        if (get_local_id(0) == 0){
            for (int i = 0; i < array_size; i++)
                cache[i] = 0;
        }
    
        barrier (CLK_LOCAL_MEM_FENCE);
    
        if(get_global_id(0) < 4){
            for (int i = 0; i<2; i++)
                cache[get_local_id(0)] += values[get_group_id(0)][i] * 
                                                             get_local_id(0);
        }
    
        barrier (CLK_LOCAL_MEM_FENCE);
    
        if(get_local_id(0) == 0){
            for (int i = 0; i<array_size; i++)
                result[get_group_id(0)] += cache[i];
        }
    }
    
    \uuuuu内核无效测试(\uuuu全局int**值,\uuuu全局int*结果,常量int数组大小){
    __本地整数缓存[数组大小];
    //初始化
    如果(获取本地id(0)=0){
    for(int i=0;i对于(int i=0;i这可以通过添加
    \u local
    数组作为内核参数来实现:

    __kernel void test(__global int **values, __global int *result, 
        const int array_size, __local int * cache)
    
    clSetKernelArg(kernel, 3, array_size*sizeof(int), NULL);
    
    以及提供所需的内核参数大小:

    __kernel void test(__global int **values, __global int *result, 
        const int array_size, __local int * cache)
    
    clSetKernelArg(kernel, 3, array_size*sizeof(int), NULL);
    
    本地内存将在内核调用时分配。请注意,可能需要额外的检查以确保所需的本地内存大小不超过设备限制