我正在使用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
,但它似乎不会被模块导出。
感谢。
答案 0 :(得分:1)
我认为没有任何方法可以解决攻击,以便pval
最终成为nullPtr
。
这似乎是包装API的一个相当简单的遗漏;我建议简单地reporting it而不是试图破解它:)