OpenCLカーネルを制御するのにLuis CabellosのSystem.GPU.OpenCL
モジュールを使用しています。 すべてうまくいっていますが、速度を上げるために、グローバルメモリをローカルバッファにキャッシュしようとしています。私はちょうどそれが現在の定義clSetKernelArg
の定義を使用してローカルバッファを渡すことは不可能であるように思われましたが、誰かが私を啓発することができますか?OpenCL HaskellプログラムでclSetKernelArgを使用してローカルメモリサイズを設定するにはどうすればよいですか?
foreign import CALLCONV "clSetKernelArg" raw_clSetKernelArg ::
CLKernel -> CLuint -> CSize -> Ptr() -> IO CLint
したがってハイレベル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()
、
定義は、 。これはグローバルメモリには最適ですが、ローカルメモリが要求されたときにclSetKernelArg
を使用する方法は、CSize
に目的のメモリのサイズを指定し、Ptr
をゼロに設定することです。もちろん、ここにnullPtr
を入れることはできません。どうすればこの問題を回避できますか?私はraw_clSetKernelArg
と直接呼びますが、それはモジュールによってエクスポートされていないようです。
ありがとうございました。
OpenCLのドキュメントを見ると、ポインタがNULLでなければならないオブジェクトがローカルの場合は正しいと思われます。 nullPtrが機能しないのはなぜですか? – vivian
@vivian:エクスポートされた 'clSetKernelArg'インターフェースはあなた自身のポインタを指定できないためです。 – ehird