Я понимаю, в чем разница между глобальной и локальной памятью в целом. Но у меня проблемы с локальной памятью.OpenCL - Локальная память
1) Что нужно учитывать, преобразуя переменные глобальной памяти в переменные локальной памяти?
2) Как использовать локальные барьеры?
Возможно, кто-то может помочь мне с небольшим примером.
Я попытался выполнить вычисление jacobi с помощью локальной памяти, но я получаю только 0. Может, кто-то может дать мне совет.
Рабочий раствор:
#define IDX(_M,_i,_j) (_M)[(_i) * N + (_j)]
#define U(_i, _j) IDX(uL, _i, _j)
__kernel void jacobi(__global VALUE* u, __global VALUE* f, __global VALUE* tmp, VALUE factor) {
int i = get_global_id(0);
int j = get_global_id(1);
int iL = get_local_id(0);
int jL = get_local_id(1);
__local VALUE uL[(N+2)*(N+2)];
__local VALUE fL[(N+2)*(N+2)];
IDX(uL, iL, jL) = IDX(u, i, j);
IDX(fL, iL, jL) = IDX(f, i, j);
barrier(CLK_LOCAL_MEM_FENCE);
IDX(tmp, i, j) = (VALUE)0.25 * (U(iL-1, jL) + U(iL, jL-1) + U(iL, jL+1) + U(iL+1, jL) - factor * IDX(fL, iL, jL));
}
Спасибо.
необходимо выделить для локальных массивов. таких как __local VALUE uL [128]. Тогда вы можете получить указатель от этого, если вам нужно. Размер должен быть известен во время компиляции (по крайней мере, для opencl 1.2) –
еще раз спасибо. какой размер должен иметь __local VALUE uL [?] и __local VALUE fL [?], когда мои матрицы u, f и tmp имеют размер, например 10x10? – SteveOhio
Они стремятся к 1-м ближайшим соседям, поэтому, если рабочая группа работает в области 16x16, тогда локальная память должна иметь 1-мерную линию безопасности вне 18x18. Если 10x10 вы сказали о каждой области рабочей группы, тогда он должен иметь 12x12, поэтому доступ ближайших соседей не переполняет его, а также ему нужно получить доступ к внутреннему пространству локального массива, так что x = 0, y = 0 для глобального доступа к x = 1, y = 1 для локальных и 9,9 глобальных должны получить доступ к 10,10 локальных, поэтому его ближайший сосед 11,11 будет по-прежнему находиться в границах массива и не будет переполняться. Таким образом, вам нужно больше ячейки, чем номер потока на рабочую группу, для которой требуется второй загрузчик –