Это относительно просто, вы можете передавать локальные массивы в качестве аргументов вашему ядру:
kernel void myKernel(const int length, const int height, local float* LP,
local float* LT, a bunch of other parameters)
Затем вы устанавливаете аргумент ядра с value
из NULL
и size
, равным размеру, который вы хотите выделить для аргумента (в байтах). Поэтому должно быть:
clSetKernelArg(kernel, 2, length * sizeof(cl_float), NULL);
clSetKernelArg(kernel, 2, height* sizeof(cl_float), NULL);
локальная память всегда разделяется рабочей группой (в отличие от частной), поэтому я думаю, что bool
и int
должны быть в порядке, но если нет, вы всегда можете передать их в качестве аргументов.
На самом деле не связано с вашей проблемой (и не обязательно актуально, поскольку я не знаю, на каком оборудовании вы планируете запускать это), но по крайней мере gpus не особенно похож на рабочие размеры, которые не кратны определенной степени два (я думаю, что это было 32 для nvidia, 64 для amd), что означает, что, вероятно, будут созданы рабочие группы из 128 элементов, из которых последние 28 в основном потрачены впустую. Так что, если вы запускаете opencl в gpu, это может повысить производительность, если вы напрямую используете рабочие группы размером 128 (и соответствующим образом меняете глобальный размер работы)
В качестве примечания: я никогда не понимал, почему все используют вариант подчеркивания для kernel, local and global
, мне это кажется намного более уродливым.