2

ねえ、私がコンパイルすると、次のnvcc -arch=sm_13ようになります。

ptxas info    : Used 29 registers, 28+16 bytes smem, 7200 bytes cmem[0], 8 bytes cmem[1] 

私が使用すると、次のようnvcc -arch=sm_20になります。

ptxas info    : Used 34 registers, 60 bytes cmem[0], 7200 bytes cmem[2], 4 bytes cmem[16] 

すべてのカーネルパラメータが共有メモリに渡されると思いましたが、sm_20の場合はそうではないようです...?!おそらく、それらはレジスターにも渡されますか?私の関数のヘッドは次のようになります。

__global__ void func(double *, double , double, int)

これまでのところありがとう!

4

2 に答える 2

4

@talonmies が述べているように、共有メモリの違いは、共有メモリではなく定数を介してカーネル引数を渡す SM 2.x デバイスによるものです。

ただし、SM 2.x デバイスでのレジスタ使用の主な違いの 1 つは、SM 1.x デバイスにはロードおよびストア命令専用のアドレス レジスタがあるのに対し、SM 2.x はアドレスに汎用レジスタを使用するという事実です。これにより、SM 2.x でのレジスタ プレッシャが増加する傾向があります。幸いなことに、レジスタ ファイルも GF100 (SM 2.0) と GT200 (SM 1.3) の 2 倍の大きさです。

于 2011-05-18T03:25:12.877 に答える
3

計算機能 2.x デバイスでは、カーネルへの引数は定数メモリに格納されます。レジスターの違いは、バージョン間の数学ライブラリー関数用に生成されたコードの違いによるものと思われます。sqrt超越関数やカーネルのようなものはありますか?

于 2011-05-17T23:35:40.993 に答える