Memory 库达:为什么我们要用这么多的记忆?

Memory 库达:为什么我们要用这么多的记忆?,memory,cuda,Memory,Cuda,我学习了CUDA编程,遇到了一些问题。主要的一个是在CUDA中,“为什么我们使用这么多类型的内存(全局、本地、共享、常量、纹理、缓存、寄存器)?”而在CPU中,我们只有三个主内存(Ram、缓存、hd等) 本文解释了拥有多种内存的主要原因: 总而言之,它是一种非常简化的形式: 通常情况下,内存越大,速度越慢 当内存“靠近”处理器时,可以更快地读取和写入内存 正如评论中提到的:在CPU上,您还有几层内存:主内存和几层缓存。这些缓存比主内存小得多,但速度要快得多。这些缓存由硬件管理,因此作为软件开

我学习了CUDA编程,遇到了一些问题。主要的一个是在CUDA中,“为什么我们使用这么多类型的内存(全局、本地、共享、常量、纹理、缓存、寄存器)?”而在CPU中,我们只有三个主内存(Ram、缓存、hd等)

本文解释了拥有多种内存的主要原因:

总而言之,它是一种非常简化的形式:

  • 通常情况下,内存越大,速度越慢
  • 当内存“靠近”处理器时,可以更快地读取和写入内存
正如评论中提到的:在CPU上,您还有几层内存:主内存和几层缓存。这些缓存比主内存小得多,但速度要快得多。这些缓存由硬件管理,因此作为软件开发人员,您根本不会直接注意到这些缓存的存在。所有数据似乎都在主存中

在GPU上,您必须手动管理此内存(尽管在较新的CUDA版本中,您也可以将共享内存声明为“缓存”,并让CUDA负责数据管理)

例如,从CUDA中的共享内存读取一些数据可能在几纳秒内完成。从全局内存读取数据可能需要几微秒。因此,CUDA高性能的关键之一是数据局部性:您应该尝试将正在处理的数据保存在本地或共享内存中,并避免在全局内存中读取/写入数据


(旁白:将这个问题标记为“主要基于观点”的“接近”投票有些可笑。这个问题可能表明缺乏自己的研究,但这是一个合理的问题,可以在这里清楚地回答)

你确定CPU上只有RAM和HD吗?缓存呢?CPU也有寄存器。本地内存对应于CPU上的TLS。根据体系结构的不同,CPU可能有更多类型,但它们往往只对设备驱动程序感兴趣(例如,旧系统上DMA传输的“低内存”)。感谢您的快速回复。值得注意的是,在CUDA编程模型中,不同的记忆是虚拟的抽象。的确,它们映射到当前硬件的特定硬件功能上,但它们不必映射到当前硬件上,而且它们可能不会映射到未来的CUDA平台上。OpenCL有一个非常相似的结构,它被用在很多没有类似硬件特性的硬件上。