【发布时间】:2013-02-27 21:11:52
【问题描述】:
在我的程序中,我使用共享内存来预取数据。一个二维线程块,尺寸为 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 数量)。
这样的配置和内存的进一步使用会导致bank冲突,或者广播会被应用吗?当线程只复制时也会出现这种情况,比如 5 个 float4s,而不是 8 个?
MK
附: 同题here
【问题讨论】: