2012-01-11 9 views
4

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と直接呼びますが、それはモジュールによってエクスポートされていないようです。

ありがとうございました。

+0

OpenCLのドキュメントを見ると、ポインタがNULLでなければならないオブジェクトがローカルの場合は正しいと思われます。 nullPtrが機能しないのはなぜですか? – vivian

+0

@vivian:エクスポートされた 'clSetKernelArg'インターフェースはあなた自身のポインタを指定できないためです。 – ehird

答えて

1

pvalnullPtrになるようにハックアップする方法はありません。

これは、ラップされたAPIからかなり簡単な省略のようです。私は単純にそれをハックしようとするよりreporting itをお勧めします:)

+0

ああ、それはいいアイデアだと思うよ、ありがとう。 – Steve

+0

'clSetKernelArg :: Storable a => CLKernel - > CLuint - >たぶんa - > IO()'がこのトリックを行います。 – vivian

+0

@vivian:機能が既に追加されているようです(https://github.com/zhensydow/opencl/issues/22):) – ehird

関連する問題