Как создать __local память переменного размера в pyopencl?

в моем коде C OpenCL я использую clSetKernelArg для создания памяти "переменного размера" __local для использования в моих ядрах, которая недоступна в OpenCL как таковом. Смотрите мой пример:

clSetKernelArg(clKernel, ArgCounter++, sizeof(cl_mem), (void *)&d_B);
...
clSetKernelArg(clKernel, ArgCounter++, sizeof(float)*block_size*block_size, NULL);
...
kernel="    
    matrixMul(__global float* C,
                   ...
              __local float* A_temp,
                  ...
             )"
{...

Теперь мой вопрос: как сделать то же самое в pyopencl?

Я просмотрел примеры, которые поставляются с pyopencl, но единственное, что я смог найти, это подход с использованием шаблонов, который, как я понял, кажется мне излишеством. См. пример.

kernel = """
        __kernel void matrixMul(__global float* C,...){
                     ... 
            __local float A_temp[ %(mem_size) ];
                     ...
        }

Что ты порекомендуешь?


person Framester    schedule 06.05.2011    source источник


Ответы (2)


Он похож на C. Вы передаете ему массив фиксированного размера как локальный. Вот пример сортировки по основанию Enja. Обратите внимание, что последний аргумент — это локальный массив памяти.

 def naive_scan(self, num):
    nhist = num/2/self.cta_size*16
    global_size = (nhist,)
    local_size = (nhist,)
    extra_space = nhist / 16 #NUM_BANKS defined as 16 in RadixSort.cpp
    shared_mem_size = self.uintsz * (nhist + extra_space)
    scan_args = (   self.mCountersSum,
                    self.mCounters,
                    np.uint32(nhist),
                    cl.LocalMemory(2*shared_mem_size)
                )
    self.radix_prg.scanNaive(self.queue, global_size, local_size, *(scan_args)).wait()
person Chad Brewbaker    schedule 06.05.2011

Я не знаком с Python и его реализацией OpenCL, но локальная память также может быть создана в ядре с фиксированным размером (аналогично тому, что вы сделали):

__kernel void matrixMul(...) {

    __local float A_templ[1024];

}

Вместо 1024 можно использовать определенный символ препроцессора, который можно установить во время компиляции для изменения размера:

#define SIZE 1024    
__kernel void matrixMul(...) {

        __local float A_templ[SIZE];

    }

SIZE может быть определен в том же источнике, как параметр компилятора для cLBuildProgram или как дополнительный источник для clCreateProgramWithSource.

РЕДАКТИРОВАТЬ: кое-что нашел в Google ;-): http://www.google.com/url?sa=t&source=web&cd=4&ved=0CC8QFjAD&url=http%3A%2F%2Flinksceem.eu%2Fjoomla%2Ffiles%2FPRACE_Winter_School%2FLinkSCEMM_pyOpenCL.pdf&rct=j&q=Pyopencl%20__local%20memory&ei=BTbETbWhOsvBswadp62ODw&usg=AFQjCNG6rXEEkDpE1304pmQDu3GFdRA0BQ&sig2=vHOGOqwA1HHUl10c6HO8WQ&cad=rja

person Rick-Rainer Ludwig    schedule 06.05.2011
comment
Привет, RR, я принял ответ Чеда, потому что это именно то, что я искал. Тем не менее, ответ можно найти в pdf-файле, на который вы ссылаетесь на странице 21. - person Framester; 09.05.2011