Я использую модуль System.GPU.OpenCL
Луиса Кабелоса для управления ядром OpenCL.Все работает хорошо, но чтобы ускорить процесс, я пытаюсь кэшировать некоторую глобальную память в локальный буфер.Я только что заметил, что кажется невозможным передать локальный буфер, используя текущее определение clSetKernelArg
, но, возможно, кто-то может просветить меня?
Определение:
clSetKernelArg :: Storable a => CLKernel -> CLuint -> a -> IO ()
clSetKernelArg krn idx val = with val $ \pval -> do
whenSuccess (raw_clSetKernelArg krn idx (fromIntegral . sizeOf $ val) (castPtr pval))
$ return ()
где необработанная функция определяется как
foreign import CALLCONV "clSetKernelArg" raw_clSetKernelArg ::
CLKernel -> CLuint -> CSize -> Ptr () -> IO CLint
. Поэтому высокий уровень clSetKernelArg
удобно вычисляет размер памяти, а также извлекает указатель на нее.Это идеально подходит для глобальной памяти, но кажется, что способ использования clSetKernelArg
при запросе локальной памяти - указать размер требуемой памяти в CSize
и установить Ptr
в ноль.Конечно, размещение nullPtr
здесь не работает, так как я могу обойти эту проблему?Я бы позвонил raw_clSetKernelArg
напрямую, но, похоже, модуль не экспортируется.
Спасибо.