在我的程序中,我使用共享内存来预取数据。一个 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'设置为全局内存缓冲区的宽度(以float4s的数量为单位),'d'设置为8(复制的float4s的数量)。
这样的配置和内存的进一步使用,是否会导致存储库冲突,或者会应用广播?当线程只复制时也会出现这种情况,比如 5 个 float4s,而不是 8 个?
MK
PS 相同的主题在这里