我使用Luis Cabellos的System.GPU.OpenCL
模塊來控制OpenCL內核。 所有運行良好,但加速了我試圖緩存一些全局內存到本地緩衝區。我剛剛注意到,使用當前的clSetKernelArg
定義傳遞本地緩衝區似乎是不可能的,但也許有人可以啓發我?如何使用clSetKernelArg在OpenCL Haskell程序中設置本地內存大小?
的定義是,
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
,但看起來它不是由模塊導出的。
謝謝。
看看OpenCL文檔看起來你是正確的,當對象是本地的指針應該是NULL。爲什麼不nullPtr工作? – vivian 2012-01-11 03:25:50
@vivian:因爲導出的'clSetKernelArg'接口不允許你指定你自己的指針。 – ehird 2012-01-11 07:20:55