4

NVIDIAハードウェアを使用してUbuntu12.04でコードをテストしています。

実際のOpenCL処理は行われません。しかし、私の初期化コードはまだ実行中です。このコードはclGetPlatformIDsを呼び出します。ただし、Valgrindはメモリリークを報告しています。

==2718== 8 bytes in 1 blocks are definitely lost in loss record 4 of 74
==2718==    at 0x4C2B6CD: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==2718==    by 0x509ECB6: ??? (in /usr/lib/nvidia-current/libOpenCL.so.1.0.0)
==2718==    by 0x50A04E1: ??? (in /usr/lib/nvidia-current/libOpenCL.so.1.0.0)
==2718==    by 0x509FE9F: clGetPlatformIDs (in /usr/lib/nvidia-current/libOpenCL.so.1.0.0)

私はこれが可能でさえあることに気づいていませんでした。これは修正できますか?現在、特別な初期化解除は行われていないことに注意してください。この後、何かを呼び出す必要がありますか?ドキュメントには、割り当てを解除する必要があることについては何も記載されていません。

4

1 に答える 1

3

に関して:「これをチェックしてください:devgurus.amd.com/thread/136242。valgrindは、OpenCLが使用している可能性が高いカスタムメモリアロケータを設計上処理できません。」

与えられたリンクから引用すると、「出口でプールを解放しないという動作は、ライブラリのバグと呼ばれる可能性があります。」

メモリのプールを作成してそこから割り当てる場合は、先に進んでください。ただし、それでも適切に割り当てを解除する必要があります。全体としてのメモリプールの複雑さは、通常のメモリ参照の複雑さよりも複雑であり、通常の参照の複雑さよりも少なくとも同じ注意を払う必要があります。また、8バイト構造がメモリプールになる可能性はほとんどありません。

割り当てられたメモリを返すように設計されている場合、TimChildはclGetPlatformIdsの使用方法について説明します。ただし、http://www.khronos.org/registry/cl/sdk/1.0/docs/man/xhtml/clGetPlatformIDs.htmlを読んでも、これが当てはまるとは十分に確信していません。

問題のリークは深刻な場合とそうでない場合があり、連続した呼び出しによって蓄積される場合とされない場合がありますが、バグを修正するか、開発用の別のopencl実装を見つけることを期待して、バグをnvidiaに報告するオプションしか残されていない可能性があります。それでも、openclライブラリがvalgrindの観点から使用されていないデータへの参照を作成する理由があるかもしれません。

残念ながら、これでも制御できない外部要因によって引き起こされるメモリリークが残り、過剰なvalgrind出力が残ります。

あなたがこのリークの責任を負わないことを十分に確信しているとしましょう(たとえば、nvidiaエンジニアがOpenCL.soにランダムな値を割り当てたという事実を知っていますが、彼はあなたをいじめるためだけに割り当てを解除しませんでした)。Valgrindにはフラグ--gen-suppressions=yesがあり、これを使用して特定の警告に関する警告を抑制できます。これを使用して、-suppressions =$filenameを使用してvalgrindにフィードバックできます。valgrindのページを読んで、その仕組みの詳細を確認してください。

ただし、抑制の使用には十分注意してください。明らかにエラーを抑制してもエラーは修正されません。メカニズムを自由に使用すると、nvidiaやvalgrindではなく、コードによって発生したエラーを抑制する状況になります。どこから来たのか完全にわからない警告を抑制したり、抑制を定期的に再度主張したりしないでください。

于 2013-05-14T20:31:47.350 に答える