3

__constant__すべてのカーネルのすべてのスレッドがアクセスするメモリを使用したいと考えています。

宣言はこのようなものです

extern __constant__ float smooth [8 * 1024];

を使用してこの変数にデータをコピーしています

cudaMemcpyToSymbol("smooth", smooth_local, smooth_size, 0, cudaMemcpyHostToDevice);

Smooth_size = 7K バイト

それは私に間違った出力を与えていました

しかし、-deviceemuモードで実行し、カーネル内のこれらの両方の変数の内容を出力しようとすると、スムーズですべてゼロになり、smooth_local は正しくなりました。

cudaMemcpyToSymbolまだ0が表示された直後に出力を印刷しようとしました。

誰でも私の問題に光を当てることができますか?

4

1 に答える 1

6

CUDA 定数メモリを宣言するには、次のようになります。

__constant__ float smooth[8 * 1024];

CUDA 定数メモリは、その翻訳単位に対してローカルであることに注意してください (つまり、暗黙的に static と宣言されています)。これは CUDA の厄介な制限の 1 つであるため、これらの値を別々の .cpp/.cu ファイル間で共有する必要がある場合は、必要な各 .cpp/.cu ファイルでメモリを再宣言する必要があります。 cudaMemCopyToSymbol を再度呼び出します。最後に、CUDA プログラム全体で合計 64k の定数メモリに制限されます。

于 2009-08-21T23:29:19.470 に答える