Wednesday, August 17, 2011

clSetKernelArgでのポインター渡しミスによる失敗メモ

あんまり活動内容書きたくないのだけれど,忘れるほうが嫌なので公開メモ.

実験用のプログラムを書いている中でメモリアクセスの問題が起こりました.
OpenCLでカーネルの実行関数のひとつclEnqueueNDRangeKernelを呼んだ後,メモリアクセスのエラーが出ていました.
原因は,clSetKernelArgで引数を設定するときに,最後の引数で該データをポインターで渡していなかったこと.具体的には&を付け忘れていたことでした.
受け取り側はvoid*なので,なんでも入ります.ですから,データがポインターの形していればエラーを吐きません.ポインターの形をしていれば,CL_SUCCESSが出てきます.でも,&を付け忘れることで,関数は該データの内容を見るので,別の関数を呼んだ時にアクセスエラーを吐きだします.

私の場合,テスト用プログラムでは成功していたため,本体に移す時に何かを書き忘れたとことはわかっていたのですが,気が付きにくい問題だったので,時間がかかりました.
いろいろ調べて時間がかかりましたが,メッセージボードを漁ってよかったです.
助けてくれたメッセージは以下のURI.

http://www.khronos.org/message_boards/viewtopic.php?f=37&t=3257

No comments: