nvidia gtx980カードで、トランザクション数を観察することにより、結合されたメモリアクセスをテストするための簡単なカーネルを作成しました。カーネルは、
__global__
void copy_coalesced(float * d_in, float * d_out)
{
int tid = threadIdx.x + blockIdx.x*blockDim.x;
d_out[tid] = d_in[tid];
}
次のカーネル構成でこれを実行すると
#define BLOCKSIZE 32
int data_size = 10240; //always a multiply of the BLOCKSIZE
int gridSize = data_size / BLOCKSIZE;
copy_coalesced<<<gridSize, BLOCKSIZE>>>(d_in, d_out);
カーネル内のデータ アクセスは完全に統合されており、データ型は float (4 バイト) であるため、予想されるロード/ストア トランザクションの数は次のようになります。
ロード トランザクション サイズ = 32 バイト
トランザクションごとにロードできる float の数 = 32 バイト / 4 バイト = 8
10240 のデータをロードするのに必要なトランザクション数 = 10240/8 = 1280 トランザクション
データの書き込みにも同じ量のトランザクションが予想されます。
しかし、nvprof メトリックを観察すると、以下の結果が得られました
gld_transactions 2560
gst_transactions 1280
gld_transactions_per_request 8.0
gst_transactions_per_request 4.0
データのロードに必要なトランザクションの 2 倍が必要な理由がわかりません。しかし、ロード/ストアの効率に関しては、両方のメトリックが 100% を示します
ここで何が欠けていますか?