GPU上缘何没有大量的cache

近年来,GPU广泛应用与高性能领域,其通用计算能力也得到了进一步的利用。与传统的CPU相比,GPU在处理能力和储存器带宽上有着明显的优势,在成本和功耗上也不需要付出太大的代价。

在当前主流的CPU+GPU架构中,CPU和GPU一般经过北桥芯片相互连接,各自有各自的外部储存器,分别为内存和显存。在这种混合架构中CPU负责逻辑性较强的事物运算,而GPU主要负责计算密集度较高的部分。其设计目的的不同导致了设计时的架构的不同。而这些架构的不同也最终影响了他们的性能。

CPU为何需要大量cache

对于单个的CPU核心通常在一个时刻只能运行一个线程的指令,其多线程机制也是在软件层次上的并行。当一个线程中断,或等待某些资源的时候,操作系统需要进行一个上下文转换,这通常会带来巨大的开销。因此需要大量的cache来过滤过多内存的访问,减少访存的延迟,提升CPU的响应速度。而为了缓存的一致性,还需要复杂的替换机制,需要复杂的逻辑控制单元。

另一方面,为了提升单核指令级的并行,现代的CPU中使用了超标量、超流水、超长指令字。这些方式的运行也需要借助复杂的分支预测机制和大量的cache。

GPU为何不需要大量cache

在GPU中没有复杂的缓存体系和替换机制,其cache都是只读的,因此不用考虑cache一致性问题。GPU缓存的主要作用是过滤对存储器控制器的请求,减少对显存的访问,从而解决显存带宽。

GPU不需要大量的cache,另一个重要的原因是GPU处理大量的并行任务。其大量的block和同一个block的大量thread保证了GPU可以实现零开销的线程切换。当一个线程因等待资源而中断的时候就转到另一个已经就绪线程去执行,在这里线程切换反而成了一件好事。能通过计算来隐藏延迟。

时间: 2024-10-11 20:10:04

GPU上缘何没有大量的cache的相关文章

Nvidia GPU 上的 CNN 计算速度变迁

笔者从 2012 年初开始接触 GPU 编程,2014 年上半年开始接触 Caffe,可以毫不谦虚地说是"一天天看着 Nvidia GPU 和 Caffe 长大的". Nvidia GPU 架构经历了 Fermi.Kepler.Maxwell.Pascal(都是著名物理学家:特斯拉.费米.开普勒.麦克斯韦.帕斯卡.还未发布的 Volta 伏打--),硬件版本号从 1.x 到现在的 6.x,CUDA Toolkit 从 3.x 到现在 8.x,cuDNN 也从 v1 升级到 v5.1.

pytorch将cpu训练好的模型参数load到gpu上,或者gpu->cpu上

假设我们只保存了模型的参数(model.state_dict())到文件名为modelparameters.pth, model = Net() 1. cpu -> cpu或者gpu -> gpu: checkpoint = torch.load('modelparameters.pth') model.load_state_dict(checkpoint) 2. cpu -> gpu 1 torch.load('modelparameters.pth', map_location=la

CUDA ---- Memory Model

Memory kernel性能高低是不能单纯的从warp的执行上来解释的.比如之前博文涉及到的,将block的维度设置为warp大小的一半会导致load efficiency降低,这个问题无法用warp的调度或者并行性来解释.根本原因是获取global memory的方式很差劲. 众所周知,memory的操作在讲求效率的语言中占有极重的地位.low-latency和high-bandwidth是高性能的理想情况.但是购买拥有大容量,高性能的memory是不现实的,或者不经济的.因此,我们就要尽量

DeepLearning4j 实战——手写体数字识别GPU实现与性能比较

在之前的博客中已经用单机.Spark分布式两种训练的方式对深度神经网络进行训练,但其实DeepLearning4j也是支持多GPU训练的.这篇文章我就总结下用GPU来对DNN/CNN进行训练和评估过程.并且我会给出CPU.GPU和多卡GPU之前的性能比较图表.不过,由于重点在于说明Mnist数据集在GPU上训练的过程,所以对于一些环境的部署,比如Java环境和CUDA的安装就不再详细说明了. 软件环境的部署主要在于两个方面,一个是JDK的安装,另外一个是CUDA.目前最新版本的DeepLearn

Mali GPU OpenGL ES 应用性能优化--基本方法

1. 常用优化工具 2. 常用优化方案 OpenGL ES优化的主要工作是在图形管道中找到影响性能的bottleneck,其bottleneck一般表现在以下几方面: ? 在应用程序代码中,如冲突检测     ? GPU与主内存间的数据传输     ? 在VP(Vertex Processor)中的顶点处理     ? 在FP(Fragment Processor)中的片断处理 可通过DS-5 Streamline来定位性能瓶颈(Locate bottleneck).为了获取更好的性能,可从以下

Mali GPU OpenGL ES 应用性能优化--测试+定位+优化流程

1. 使用DS-5 Streamline定位瓶颈 DS-5 Streamline要求GPU驱动启用性能测试,在Mali GPU驱动中激活性能测试对性能影响微不足道. 1.1 DS-5 Streamline简介 可使用DS-5 Streamline从CPU和Mali GPU中实时收集性能计数器,然后以图形方式显示这些计数器,其主要功能如下:     ? 收集计数器--从CPU和Mali GPU中     ? 保存收集到的计数器数据以供回放     ? 查看显示GPU活动.GPU活动和Framebu

CUDA __shared__ thread、block、grid之间的一维关系 (例子chapter5 dot点积(GPU高性能编程))

chapter5里重要的例子是dot,来解释一个block内多个thread的共享内存和同步. __shared__共享内存:“对于在GPU上启动的每个线程块,cuda c编译器都将创建该变量的一个副本.线程块中的每个线程都共享这块内存,并和其他线程块无关,这使一个线程块中多个线程能够在计算上进行通信和协作” __syncthreads():确保线程块中的每个线程都执行完__syncthreads()前面的语句后,在往下执行. 例子是Grid->一维Block->一维Thread: 通过实例代

CPU GPU设计工作原理《转》

我知道这很长,但是,我坚持看完了.希望有幸看到这文章并对图形方面有兴趣的朋友,也能坚持看完.一定大有收获.毕竟知道它们到底是怎么"私下勾搭"的.会有利于我们用程序来指挥它们....(这是我加上去的) 原文从这里开始: 要说到设计的复杂程度,那还是CPU了!这个不用讨论,很简单的道理你看看显卡芯片的更新速度和CPU的更新速度就可见一斑了.还是简单说说他们的设计原理吧. CPU: 但是,现在我要问一句:"什么是CPU?"我相信大多数人并不知道什么是CPU.当然,你可以回

把书《CUDA By Example an Introduction to General Purpose GPU Programming》读薄

鉴于自己的毕设需要使用GPU CUDA这项技术,想找一本入门的教材,选择了Jason Sanders等所著的书<CUDA By Example an Introduction to General Purpose GPU Programming>.这本书作为入门教材,写的很不错.自己觉得从理解与记忆的角度的出发,书中很多内容都可以被省略掉,于是就有了这篇博文.此博文记录与总结此书的笔记和理解.注意本文并没有按照书中章节的顺序来写.书中第8章图像互操作性和第11章多GPU系统上的CUDA C,这