私のプログラムでは、共有メモリを使用してデータのプリフェッチを行っています。スレッドの 2D ブロック (寸法 8 x 4 (32)) は、8 * 4 * 8 * sizeof(float4) バイトの共有メモリを取得します。各スレッドは、ループ内で 8 つの float4 をコピーします。
inline __device__ void pack(const float4 *g_src, float4 *s_dst, const unsigned int w, const unsigned int d) {
uint2 indx = { blockIdx.x * blockDim.x + threadIdx.x, blockIdx.y * blockDim.y + threadIdx.y };
uint2 sindx = { threadIdx.x, threadIdx.y };
int i;
for (i = 0; i < d; ++i) s_dst[(sindx.y * blockDim.x + sindx.x) * d + i] = g_src[(w * indx.y + indx.x) * d + i];
}
ここで、「w」はグローバル メモリ バッファの幅 (float4 の数) に設定され、「d」は 8 (コピーされた float4 の数) に設定されます。
そのような構成とメモリのさらなる使用は、バンクの競合につながる可能性がありますか、またはブロードキャストが適用されますか? これは、スレッドが 8 つではなく 5 つの float4 のみをコピーする場合にも当てはまりますか?
MK
PS同じトピックはこちら