2016-04-07 5 views
-2

私はGeForce GTX 745(CC 5.0)を持っています。CUDA CC 5.0のレジスタ数はいくつですか?

deviceQueryコマンドは、ブロックごとに使用できるレジスタの総数が65536(65536 * 4/1024 = 256KB)であることを示しています。

サイズ10Kの配列を使用するカーネルを書きましたが、カーネルは次のように呼び出されます。私は配列を割り当てる2つの方法を試しました。

// using registers 
fun1() { 
    short *arr = new short[100*100]; // 100*100*sizeof(short)=256K/per block 
    .... 
    delete[] arr; 
} 
fun1<<<4, 64>>>(); 

// using global memory 
fun2(short *d_arr) { 
    ... 
} 
fun2<<<4, 64>>>(d_arr); 

どちらの場合でも正しい結果が得られます。 レジスタを使用する最初の方がはるかに高速です。

しかし、私は、エラーコード77

fun1<<<6, 64>>>(); 

を得た6つのブロックを使用してカーネルを起動する際に不正なメモリアクセスが

に遭遇した今、私が実際にどのように多く、思ったんだけどレジスタは使用できますか?そしてそれはどのようにブロックの数に関連していますか?

+4

これはおそらくレジスタの数とは関係ありませんが、コードにバグがあります。デバッグに関する助けが必要な場合は、完全でビルド可能なコードを投稿してください。すべてのAPI呼び出しとすべてのカーネル起動の戻り状況を確認するとどうなりますか? – njuffa

+0

@njuffa in fun1()ブロックあたりのレジスタの制限を超える256 KBを配列に割り当てました。それはなぜ機能するのですか? –

+2

'arr'のような動的に割り当てられた配列はレジスタに格納されません。 – njuffa

答えて

-1

あなたのコードfun1では、最初の行がすべてのスレッドによって呼び出されるため、各ブロックの各スレッドは10,000の16ビット値、つまりブロックあたり1,280,000バイトを割り当てます。 4ブロックの場合、5,120,000バイトとなります。6の場合、何らかの理由で7,680,000バイトが割り当てられます(デフォルトの制限は8MB - Heap memory allocation参照)。これはあなたがこの不正アクセスエラー(77)を取得する理由かもしれません。

newを使用すると、事前割り当てされた大域メモリがmallocとして使用されますが、レジスタは使用されません。指定したコードは実行したコードと正確に一致しません。あなたが登録したい場合は、固定された配列内のデータを定義する必要があります。

func1() 
{ 
    short arr [100] ; 
    ... 
} 

コンパイラその後、レジスタ内の配列に合わせてをしようとします。ただし、このレジスタデータはスレッドごとであり、スレッドごとの最大32ビットレジスタ数はデバイス上で255です。

関連する問題