Создавайте массивы в разделяемой памяти без шаблонов, как в PyOpenCL - PullRequest
0 голосов
/ 24 июня 2011

Как создать массив в разделяемой памяти без изменения ядра с помощью шаблонов, как видно из официальных примеров . Или использование шаблонов официальным способом?

В PyOpenCL я могу создать массив в локальной памяти с установкой аргумента ядра

kernel.set_arg(1,numpy.uint32(a_width))

... 
KERNEL_CODE = """
__kernel void matrixMul(__local float* A_temp,...)
    { ...} """

Ответы [ 2 ]

3 голосов
/ 27 июня 2011

CUDA поддерживает динамическое распределение разделяемой памяти во время выполнения ядра, но механизм немного отличается от OpenCL.В API времени выполнения CUDA ядро, использующее динамически распределенную / размерную разделяемую память и запускающий для ее измерения размер, использует следующий синтаксис:

__global__ void kernel(...)
{
    extern __shared__ typename buffer[];

    ....
}
....
kernel <<< griddim, blockdim, sharedmem, streamID >>> (...)

, где sharedmem - общее количество байтов на блок, которое будетбыть выделенным для буфера.

В PyCUDA тот же механизм работает примерно так:

mod = SourceModule("""
    __global__ void kernel(...)
    {
        extern __shared__ typename buffer[];

        ....
    }
  """)

func = mod.get_function("kernel")
func.prepare(..., shared=sharedmem)
func.prepared_call(griddim,blockdim,...)

с размером выделения общей памяти, переданным методу prepare.

0 голосов
/ 24 июня 2011

Я не понимаю вопроса полностью.Я не работаю с Python, но знаю OpenCL достаточно хорошо.

В OpenCL у вас есть две возможности для создания буферов общей / локальной памяти:

1) Вы добавляете параметр ядра, как он естьв твоем вопросе.2) Определите буфер статически внутри самого ядра, например:

__local buffer[1024];

Нет других шансов сделать это с OpenCL.Как вы создаете строку кода ядра для передачи ее в OpenCL - это другой вопрос, связанный с Python.Я не эксперт в этом.

...