Memory management 在OpenCL内核中创建本地动态数组
我有一个OpenCL内核,它需要将一个数组作为多个数组进行处理,其中每个子数组和都保存在本地缓存数组中 例如,想象一下fowling数组: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
[[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);