Как я могу использовать clSetKernelArg для установки размера локальной памяти в программе OpenCL Haskell? - PullRequest
4 голосов
/ 11 января 2012

Я использую модуль 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 напрямую, но, похоже, модуль не экспортируется.

Спасибо.

1 Ответ

1 голос
/ 11 января 2012

Я не думаю, что есть какой-то способ подстроить взлом, чтобы pval в итоге стал nullPtr.

Это выглядит как довольно простое упущение в упакованном API;Я бы посоветовал просто сообщить об этом , а не пытаться взломать:)

...