【发布时间】:2021-08-08 22:52:48
【问题描述】:
我正在阅读 Even Easier Introduction to CUDA,我正在考虑这样的示例:
__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];
}
其中每个线程跨过数组。在正常的 CPU 计算中,人们宁愿将数组拆分为连续的子数组,这些子数组在线程之间进行拆分,以便它们可以更好地利用空间局部性。
这个概念是否也适用于 CUDA 的统一内存?我想了解在这种情况下最有效的方法是什么。
【问题讨论】:
-
虽然 NVIDIA 称它们为“线程”,但这是用词不当。您应该将 CUDA 线程视为 SIMD 矢量处理单元的通道。那么这个模式就更有意义了。话虽如此,这个类比并不适用于所有层面,因此他们称之为 SIMT。
-
而且 CUDA 也支持每个线程中的像 float4 这样的 SIMD 类型,作为较小的并行化方法(这可以减少内存繁重内核的内存事务数量)。
标签: c++ performance cuda unified-memory