Это моя OpenCL функция ядраJOCL синтаксис локального доступа к памяти
private static String programSource =
"__kernel void "+
"sampleKernel(__local float *a,"+
" __local float *b,"+
" __global float *c,"+
" __global float *d)"+
"{"+
" int gid=get_local_id(0);"+
" c[gid]=a[gid]+b[gid];"+
" d[gid]=a[gid]-1;"+
"}";
clSetKernelArg(kernel, 0, Sizeof.cl_mem, Pointer.to(memObjects[0]));
clSetKernelArg(kernel, 1, Sizeof.cl_mem, Pointer.to(memObjects[1]));
clSetKernelArg(kernel, 2, Sizeof.cl_mem, Pointer.to(memObjects[2]));
clSetKernelArg(kernel, 3, Sizeof.cl_mem, Pointer.to(memObjects[3]));
Я использовал глобальную память для хранения данных. Теперь я попытался преобразовать место хранения в локальную память. Так что мой код выглядит следующим образом:
private static String programSource =
"__kernel void "+
"sampleKernel(__local float *a,"+
" __local float *b,"+
" __global float *c,"+
" __global float *d)"+
"{"+
" int gid=get_local_id(0);"+
" c[gid]=a[gid]+b[gid];"+
" d[gid]=a[gid]-1;"+
"}";
clSetKernelArg(kernel, 0, Sizeof.cl_mem, NULL);
clSetKernelArg(kernel, 1, Sizeof.cl_mem, NULL);
clSetKernelArg(kernel, 2, Sizeof.cl_mem, Pointer.to(memObjects[2]));
clSetKernelArg(kernel, 3, Sizeof.cl_mem, Pointer.to(memObjects[3]));
Когда я выполняю приведенный выше код я получаю следующую ошибку синтаксиса:
NULL cannot be resolved to a variable.
Можно ли определить свою ошибку?
Заранее благодарен!
Да, сработал null. Я использовал строчные буквы. Основываясь на вашем комментарии, я понял, что хост передает a, b в глобальную память. Затем, используя ядро, я должен перенести данные из глобальной в локальную память. Это правильно? Если да, то каков был бы правильный способ хранения массивов a & b в локальной памяти? Какие изменения следует внести в функции clSetKernelArg и ядра? Что касается распределения памяти в clSetKernelArg, он хорошо работает для глобальных массивов c и d. Я выделяю только 4 байта. Почему этого недостаточно для массивов a, b тоже? –
@SadhanaRayan Я добавил несколько заметок о том, почему параметр размера в 'clSetKernelArg' отличается для локальной памяти, чем для глобального. Для вашего ядра примера ваши массивы 'a' и' b' должны находиться в глобальной памяти, иначе они не могут быть инициализированы хостом. Вы можете скопировать их в локальную память вручную (например, 'local_a [i] = global_a [i]'), если хотите. Это просто сделает ядро медленнее, но ваше ядерное ядро действительно не имеет смысла для локальной памяти. – jprice
У меня есть большой код для работы в GPU. На данный момент я просто занимаюсь доступом к различным воспоминаниям. Я прочитал статью по этой ссылке: http://www.openclblog.com/2011/03/is-your-local-memory-really-local.html По его словам, у меня есть CL_GLOBAL. Значит ли это, что улучшения не произойдет, даже если я храню массивы в локальной памяти? –