31

CUDAで小さなプログラムを開発しようとしていますが、遅いのでテストをして少しググってみました。単一の変数はデフォルトでローカルスレッドメモリ内に格納されますが、配列は通常は格納されないことがわかりました。そういうわけで、実行するのにとても時間がかかるのだと思います。ここで、ローカルスレッドメモリは少なくとも16KBである必要があり、配列は52文字の長さであるため、ローカルメモリに格納する方法はありますか(構文をお願いします:))。

次のようなものではありません:

__global__ my_kernel(int a)
{
  __local__ unsigned char p[50];
}
4

5 に答える 5

11

必要なのはこれだけです:

__global__ my_kernel(int a)
{
    unsigned char p[50];
    ........
}

必要に応じて、コンパイラはこれをスレッド ローカル メモリに自動的にスピルします。ただし、ローカル メモリは GPU から離れた SDRAM に保存され、グローバル メモリと同じくらい遅いことに注意してください。したがって、これによりパフォーマンスが向上することを期待している場合は、がっかりする可能性があります.....

于 2012-04-24T11:47:07.997 に答える
-1

ローカル メモリ空間とレジスタ メモリ空間を混同しています。

単一変数と一定サイズの配列は、チップ上のレジスタ空間に自動的に保存され、読み取りと書き込みのコストはほとんどかかりません。

マルチプロセッサごとのレジスタの量を超えると、それらはローカル メモリに格納されます。

ローカル メモリはグローバル メモリ空間にあり、読み取り操作と書き込み操作の帯域幅は同じです。

#DEFINE P_SIZE = 50

__global__ void kernel()
{
    unsigned char p[P_SIZE];
}
于 2012-04-24T13:00:22.257 に答える
-1

お探しのキーワードは__shared__. 大きな配列は共有メモリ空間に収まりませんが、コンパイラはこの場合のように小さな固定サイズの配列に共有メモリを使用する必要があります。__shared__キーワードを使用して、これを確実に行うことができます。ブロックの共有メモリの最大量を超えると、コンパイル時エラーが発生します。

于 2012-04-24T13:31:25.107 に答える