【发布时间】:2016-08-04 04:55:16
【问题描述】:
我最近在学习 CUDA。我有一个关于内存事务的问题。 我的理解是,在每个事务中,32 个连续的线程(在同一个块中)可以同时访问连续的 128 个字节(32 个单精度字)的内存,这称为 warp。 但在示例中,每个线程始终将(4 字节)字作为 1 个完整变量进行访问。所以我的问题是,如果我在全局内存中的数组是用char类型定义的,那么32个线程是否可以全部访问这块内存,同时分别读取4个连续的char?
因此,例如,如果我编写代码:
__global__
void kernel(char *d_mask)
{
extern __shared__ char s_tmp[];
const unsigned int thId = threadIdx.x;
const unsigned int elementId = 4 * (threadIdx.x + blockDim.x * blockIdx.x);
s_tmp[thId_x] = d_mask[elementId];
s_tmp[1 + thId_x] = d_mask[elementId + 1];
s_tmp[2 + thId_x] = d_mask[elementId + 2];
s_tmp[3 + thId_x] = d_mask[elementId + 3];
__syncthreads();
/* calculation */
}
那么,每个线程会同时读取 4 个字节吗?如果没有,我怎么能做到呢?我应该使用 memcpy 之类的 API 吗?
【问题讨论】:
标签: cuda