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
.