2016-03-31 3 views
4

現在、処理されたデータが十分に大きい場合に利用可能なグローバルデバイスメモリ(VRAM)を使用するCUDAアプリケーションを作成しています。私が割り当てようとしているのは、cudaMalloc3dを使った3Dボリュームなので、私が使用するメモリは連続していなければなりません。この目的のために、関数cudaMemGetInfoを使用して無料のデバイスメモリの量を取得し、空き容量を割り当てようとしました。しかし、これは動作していないようです。その量のメモリを割り当てようとすると、まだエラーが出ます。連続して割り当てることができるGPUデバイスメモリの最大量を決定する

私の質問は、私が連続して割り当てることができるデバイスメモリの最大量を取得する方法があるかどうかです。

1つのオプションは、割り振りが成功するまで割り振ろうとする量を反復的に減らす試行錯誤のアプローチです。しかし、私はこの考えがとても嫌いです。

背景:私はGPUでコーンビームCT再構成を行うプログラムを持っています。これらのボリュームはかなり大きくなるので、必要に応じてそれらを分割します。したがって、チャンクがどれくらい大きくても、たいていグローバルデバイスのメモリに収まるようにすることができなければなりません。

答えて

4

私の質問は、私が連続して割り当てることができるデバイスメモリの最大量を取得する方法があるかどうかです。

ありません。

少し試行錯誤して、cudaMemGetInfo()によって報告された利用可能なメモリの推定最大値、たとえば80%を計算して使用することができます。

cudaMallocの状況は、通常、ホスト側のアロケータに似ています。 malloc。使用可能なメモリのホストオペレーティングシステムを照会した後、すべてのメモリを単一のmalloc呼び出しで割り当てようとすると、失敗する可能性があります。

+3

これを実行するには、繰り返しアプローチが最適です。 cudaMemGetInfoを空きとし、割り当て呼び出しが成功するまで1MiBずつステップダウンします。それは私がいつもそれをする方法です – talonmies

+1

私は重複を探しましたが、引数を避けるのに十分シンプルなものを探すのにいくつかの問題がありました。それにもかかわらず、CUDAタグには多くの類似の質問があり、反復的なアプローチは@talomies [ここ]の回答によって概説されています(http://stackoverflow.com/questions/8905949/why-is-cudamalloc-giving-me-十分な記憶空間/ 8923966#8923966)を使用することができる。 –

+0

@talonmies:私は繰り返しアプローチを試みましたが、何とかmallocが成功した後でさえ、カーネルの起動に失敗しました。私は何とかエラーから回復する必要があるようです。私は何をしなければならないか知っていますか? – user1488118

関連する問題