Предполагая, что у вас есть один рабочий элемент на входной пиксель, каждый поток может загрузить один пиксель из глобальной памяти в локальную память.
int x = get_local_id(0);
int y = get_local_id(1);
img_buffer[x][y] = input[...];
barrier(CLK_LOCAL_MEM_FENCE);
// filter here or whatever computation you need to perform
Если ваши данные выровнены, вы можете сделать это быстрее, приведя к более крупным типам данных. См. эту ссылку для более подробной информации.
Редактировать: каждый поток захватывает 2 значения, пока не достигнет 132
. Конечно, некоторые рабочие элементы могут в конечном итоге ничего не делать в процессе
int x = get_local_id(0);
int y = get_local_id(1);
if (2*x < 132 && 2*y < 132) {
img_buffer[2*x][2*y] = input[...];
img_buffer[2*x][2*y + 1] = input[...];
img_buffer[2*x + 1][2*y] = input[...];
img_buffer[2*x + 1][2*y + 1] = input[...];
}
barrier(CLK_LOCAL_MEM_FENCE);
// filter here...