使用Numba时GPU访问数组元素比CPU慢的原因及核内优化疑问
关于Numba CUDA数组访问的疑问解答
1. 为何GPU访问数组元素更慢?
你测试的GPU访问A_gpu[0][0]本质是主机CPU跨PCIe总线读取GPU设备内存中的元素,PCIe传输的延迟远高于CPU直接访问本地内存的延迟,这才导致速度差了一千倍。而shape是DeviceArray存在主机端的元数据属性,访问它不需要跨总线传输数据,所以GPU数组的shape访问反而比CPU数组略快。
2. @cuda.jit核函数内访问是否会被优化?
这和你之前测试的场景完全不同:核函数内是GPU设备端线程直接访问本地设备内存,Numba CUDA会做针对性优化:
- 自动实现内存合并访问(coalesced access),让同warp的线程连续访问内存,最大化带宽利用率
- 利用GPU的L1/L2缓存,重复访问的元素会被缓存,降低延迟
- 编译期优化索引计算逻辑,减少不必要的开销
这种设备内部的内存访问延迟和带宽,和主机跨PCIe访问完全不是一个量级,设备端访问速度远快于主机访问设备内存的速度。
3. GPU多核处理大数组的累计耗时是否不可忽视?
GPU的核心优势是并行执行:1000个核处理1000×1000数组时,是大量线程同时运行,不是串行逐个处理。比如可以让每个线程负责一个元素,总耗时是单个线程处理元素的时间,而非所有线程时间的累加。只要内存访问模式优化得当(比如合并访问),GPU处理这类大数组的总耗时会远低于CPU串行处理的时间,不存在“累计耗时不可忽视”的问题。
内容的提问来源于stack exchange,提问作者BPDev
相关产品推荐
相关产品推荐

