Я пытаюсь реализовать алгоритм свертки в OpenCL (используя Vivado HLS). Я пытаюсь загрузить часть изображения в локальную память перед выполнением рабочей группы (например, если рабочая группа 128 * 128, а фильтр свертки 5 * 5, я бы загрузил 132 * 132 пикселей). Как мне написать ядро, чтобы локальная память загружалась только один раз при запуске рабочей группы?
Псевдокод:
#define WKGRP_W 128
#define WKGRP_H 128
#define FILTER_SIZE 5
#define BUFFER_W WKGRP_W+FILTER_SIZE-1
#define BUFFER_H WKGRP_H+FILTER_SIZE-1
__kernel void __attribute__ ((reqd_work_group_size(WKGRP_W, WKGRP_H, 1)))
convolve(
const __global data_t* input,
__global data_t* output,
__constant data_t* filter_params
){
__local data_t img_buffer[BUFFER_H][BUFFER_W];
__local data_t output_buffer[WKGRP_H][WKGRP_W];
/**
* if (the workgroup is starting) {
* load data from input into img_buffer
* }
*/
filter(img_buffer, filter_params, get_local_id(0), get_local_id(1), output_buffer);
/**
* if (the workgroup is finished) {
* load data from output_buffer into output
* }
*/
}