2016-08-19 4 views
1

さまざまな量のメモリと計算機能を備えた複数のCUDA GPUで実行する必要があるソフトウェアを開発しています。私のマシンで再現できなかったGPU上で再現可能な問題を顧客が報告するということが二度以上起こりました。たぶん私は8 GBのGPUメモリを持っていて、彼らは4 GBを持っているかもしれません。おそらく、2.0よりもむしろ計算能力3.0のためです。GPUを性能の低いモデルとテスト用のメモリにダウングレードする

質問:私は、より少ないモデルで、より少ないメモリ量で、かつ/または先進的な計算能力で、GPUを一時的に「ダウングレード」できますか?

私が何を求めているのかを明確にしたコメント。

コンピューティング機能がCのGPUで問題が発生したとし、MギガのGPUメモリ、およびTスレッドをブロックごとに報告したとします。私は私のマシン上でより良いGPUを持っています。計算能力、メモリ、ブロックあたりのスレッド数が増えています。

1)GPUメモリのMに制限されたGPUでプログラムを実行できますか?これに答えて "はい、ちょうどあなたが持っているものは何でも) - Mを起動時に割り振り、使用しないでください。プログラムが終了するまでMだけ残します。"

2)GPUのブロックサイズを、実行時間中、Tスレッドまで減らすことはできますか?

3)私のプログラムで見られるように、ランタイム中にGPUの計算能力を減らすことはできますか?

+1

これはいくつかの以前の質問の複製です。 –

+0

@RobertCrovella:どちらですか? – Michael

+0

確かに、私はそれに取り組んでいます。前の房を見つけるプロセスは自明ではありません。あなたが望むなら、あなた自身でそれを検索することができます。 –

答えて

3

私はもともとこれをコメントにしたいと思っていましたが、その範囲では大きすぎます。

@RobertCrovellaに言われているように、あなたが求めていることを行うネイティブな方法はありません。つまり、他のアーキテクチャで見られるバグを最小限に抑えるために、次のような対策を講じることができます。

0)ターゲットとするCUDA GPUからcudaGetDevicePropertiesの出力を取得してください。ユーザーやコミュニティからこの情報を入手することができます。

1)メモリを制限するには、メモリマネージャを実装し、手動でメモリを追跡するか、cudaGetMemInfoを使用してかなり近い見積もりを得ます。注意:この関数は他のアプリケーションでも使用されるメモリを返します。

2)現在のプロファイルにブロック/スレッドの数が収まるかどうかを明示的に確認できるカーネルを起動するためのラッパーマクロを用意してください。あなたはマクロを持つことができます

LAUNCH_KERNEL((kernel<float>), blocks, threads, a, b, c); 

は次のように定義される:

#define LAUNCH_KERNEL(kernel, blocks, threads, ...)\ 
     check_blocks(blocks);\ 
     check_threads(threads);\ 
     kernel<<<blocks, threads>>>(__VA_ARGS__) 

3)計算能力の削減すなわち代わりに

kernel<float><<<blocks, threads>>>(a, b, c); 

を起動するとあなたはこのような何かをしたいですしかし、あなたはあなたのコードを様々な計算モードでコンパイルし、あなたのカーネルに下位互換性のあるコードがあることを確認することができます。古い計算モードで実行カーネルエラーの特定の部分は、あなたがこのような何かを行うことができた場合:あなたのフォールバックコードをテストし、あなたのコードは、古いを計算する上で動作することを確認したいとき

#if !defined(TEST_FALLBACK) && __CUDA_ARCH__ >= 300 // Or any other newer compute 
// Implement using new fancy feature 
#else 
// Implement a fallback version 
#endif 

あなたはTEST_FALLBACKを定義することができます。

関連する問題