2012-01-11 19 views
4

我使用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,但看起來它不是由模塊導出的。

謝謝。

+0

看看OpenCL文檔看起來你是正確的,當對象是本地的指針應該是NULL。爲什麼不nullPtr工作? – vivian 2012-01-11 03:25:50

+0

@vivian:因爲導出的'clSetKernelArg'接口不允許你指定你自己的指針。 – ehird 2012-01-11 07:20:55

回答

1

我不認爲有任何方法來裝備黑客,所以pval最終成爲nullPtr

這似乎是一個相當簡單的從包裝的API中省略;我建議只是reporting it而不是試圖繞過它:)

+0

啊,好吧,我想這是個好主意,謝謝。 – Steve 2012-01-11 16:14:07

+0

'clSetKernelArg :: Stored a => CLKernel - > CLuint - >也許一個 - > IO()'可以做到這一點。 – vivian 2012-01-12 08:16:45

+0

@vivian:看起來功能已[已添加](https://github.com/zhensydow/opencl/issues/22):) – ehird 2012-01-12 08:22:03

相關問題