現在、処理されたデータが十分に大きい場合に利用可能なグローバルデバイスメモリ(VRAM)を使用するCUDAアプリケーションを作成しています。私が割り当てようとしているのは、cudaMalloc3d
を使った3Dボリュームなので、私が使用するメモリは連続していなければなりません。この目的のために、関数cudaMemGetInfo
を使用して無料のデバイスメモリの量を取得し、空き容量を割り当てようとしました。しかし、これは動作していないようです。その量のメモリを割り当てようとすると、まだエラーが出ます。連続して割り当てることができるGPUデバイスメモリの最大量を決定する
私の質問は、私が連続して割り当てることができるデバイスメモリの最大量を取得する方法があるかどうかです。
1つのオプションは、割り振りが成功するまで割り振ろうとする量を反復的に減らす試行錯誤のアプローチです。しかし、私はこの考えがとても嫌いです。
背景:私はGPUでコーンビームCT再構成を行うプログラムを持っています。これらのボリュームはかなり大きくなるので、必要に応じてそれらを分割します。したがって、チャンクがどれくらい大きくても、たいていグローバルデバイスのメモリに収まるようにすることができなければなりません。
これを実行するには、繰り返しアプローチが最適です。 cudaMemGetInfoを空きとし、割り当て呼び出しが成功するまで1MiBずつステップダウンします。それは私がいつもそれをする方法です – talonmies
私は重複を探しましたが、引数を避けるのに十分シンプルなものを探すのにいくつかの問題がありました。それにもかかわらず、CUDAタグには多くの類似の質問があり、反復的なアプローチは@talomies [ここ]の回答によって概説されています(http://stackoverflow.com/questions/8905949/why-is-cudamalloc-giving-me-十分な記憶空間/ 8923966#8923966)を使用することができる。 –
@talonmies:私は繰り返しアプローチを試みましたが、何とかmallocが成功した後でさえ、カーネルの起動に失敗しました。私は何とかエラーから回復する必要があるようです。私は何をしなければならないか知っていますか? – user1488118