我正在关注Even Easier Introduction to CUDA。使用GPU的add
内核的第一个示例如下:
__global__
void add(int n, float *x, float *y)
{
int index = threadIdx.x;
int stride = blockDim.x;
for (int i = index; i < n; i+=stride)
y[i] = x[i] + y[i];
}
使用256个线程启动内核:
add<<<1,256>>>(N, x, y);
它在我的GPU上运行大约1.5毫秒。
作为一个实验,我尝试将数组元素组合成n / 256个块,每个线程处理一个块中的所有连续元素,而不是跨越内存。
__global__
void add(int n, float *x, float *y)
{
int size = n / blockDim.x;
int start = size * threadIdx.x;
int end = start + size;
for (int i = start; i < end; i++)
y[i] = x[i] + y[i];
}
但是大约需要3.7毫秒。
为什么访问连续的全局内存比跨步慢?