如何在OpenCL Haskell程序中使用clSetKernelArg设置本地内存大小?

时间:2012-01-11 01:55:48

标签: haskell opencl ffi

我正在使用Luis Cabellos的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 ()

其中raw函数定义为,

foreign import CALLCONV "clSetKernelArg" raw_clSetKernelArg ::
  CLKernel -> CLuint -> CSize -> Ptr () -> IO CLint

因此,高级clSetKernelArg可以方便地计算出内存的大小,并提取指向它的指针。这非常适合全局内存,但似乎在请求本地内存时使用clSetKernelArg的方法是在CSize中指定所需内存的大小,并将Ptr设置为零。当然,将nullPtr置于此处不起作用,那么我该如何规避这个问题呢?我会直接调用raw_clSetKernelArg,但它似乎不会被模块导出。

感谢。

1 个答案:

答案 0 :(得分:1)

我认为没有任何方法可以解决攻击,以便pval最终成为nullPtr

这似乎是包装API的一个相当简单的遗漏;我建议简单地reporting it而不是试图破解它:)