CPU和GPU的区别

  异构计算的英文名称是Heterogeneous computing,主要是指使用不同类型指令集和体系架构的计算单元组成系统的计算方式。常见的计算单元类别包括CPU、GPU等协处理器、DSP、ASIC、FPGA等。我们常说的并行计算正是异构计算中的重要组成部分异构计算近年来得到更多关注,主要是因为通过提升CPU时钟频率和内核数量而提高计算能力的传统方式遇到了散热和能耗瓶颈。而与此同时,GPU等专用计算单元虽然工作频率较低,具有更多的内核数和并行计算能力,总体性能/芯片面积的比和性能/功耗比都很高,却远远没有得到充分利用。

  CPU的设计让其比较擅长于处理不规则数据结构和不可预测的存取模式,以及递归算法、分支密集型代码和单线程程序。这类程序任务拥有复杂的指令调度、循环、分支、逻辑判断以及执行等步骤。而GPU擅于处理规则数据结构和可预测存取模式。而APU的设计理念则正是让CPU和GPU完美合作,集合两者的长处,用异构计算来达到整体性能的最佳化。

目前,已经有50款领先的应用能够利用AMD APU进行加速,而后续的应用也将陆续到来——异构计算普及的一刻应该是近在咫尺了。

再谈谈现在正在流行的异构计算CPU+GPU。


CPU和GPU的本质区别

CPU的目标是快速执行单一指令流;

CPU将其用于乱序执行、寄存器重命名、分支预测以及巨大的cache上,这些设计都是为了加速单一线程的执行速度;

CPU利用cache来降低内存访问延迟;

CPU通过大量的cache和分支预测来降低延迟,这些机制消耗了大量的晶体管的电能;

CPU每个核心支持1~2个线程;

CPU切换线程的代价是数百个时钟周期;

CPU通过SIMD(单指令多数据)来处理矢量数据;

Intel的CPU没有集成内存控制器;

 

GPU的目标是快速执行大量的并行指令流;

GPU将晶体管用于处理器阵列、多线程管理、共享内存、内存控制器;

这些设计并不着眼于提高单一线程的执行速度,而是为了使GPU可以同时执行成千上万的线程;

实现线程间通信,并提供极高的内存带宽;

GPU使用cache来放大内存带宽;

GPU通过同时运行上千个线程来隐藏延迟,等待内存访问的线程会被切换掉,GPU切换线程不耗时间;

对于支持CUDA的GPU,每个流处理器可以同时处理1024个线程;

GPU切换线程的代价是0,事实上GPU通常每个时钟周期都切换线程;

GPU则使用SIMT(单指令多线程),SIMT的好处是无需开发者费力把数据凑成合适的矢量长度,并且SIMT允许每个线程有不同的分支;

支持CUDA的GPU集成有8个内存控制器,GPU的内存带宽通常是CPU的十倍。

 

CPU的长项是整数计算,GPU的优势则是浮点计算。

对于整机性能而言,CPU和GPU都是性能的保障,合理的搭配才是重中之重,才能给用户带来最强的综合性能。

### TensorFlow CPUGPU区别 #### 设计初衷的不同 CPUGPU由于最初用于处理的任务不同,因此在设计上存在显著区别。某些任务与GPU最初旨在解决的问题较为相似,这使得这些任务更适合由GPU执行[^1]。 #### 版本差异 对于TensorFlow而言,其提供了专门针对CPU优化的版本以及支持GPU加速的版本。两者的主要差别在于后者能够利用NVIDIA CUDA技术实现并行计算能力,从而大幅提升特定类型运算的速度。 ```python import tensorflow as tf print(tf.__version__) ``` 这段代码可以用来验证所使用的TensorFlow的具体版本号,这对于确认安装的是哪个版本非常重要[^2]。 ### 性能对比分析 当涉及到大规模矩阵乘法或其他高度可并行化的操作时,随着计算量的增长,CPU所需的时间会逐渐增多;相比之下,GPU的表现则更加稳定,即使面对更大的数据集也能保持较低的增长率。一旦计算需求超过一定阈值,GPU展现出明显优于CPU的优势[^3]。 为了直观展示这种差距,可以通过编写简单的程序分别测量同一段代码在两种环境下的执行效率: ```python # 测试函数定义 def test_performance(): a = tf.random.normal([1000, 1000]) b = tf.random.normal([1000, 1000]) with tf.device('/CPU:0'): start_time_cpu = time.time() c_on_cpu = tf.matmul(a, b) end_time_cpu = time.time() with tf.device('/GPU:0'): start_time_gpu = time.time() c_on_gpu = tf.matmul(a, b) end_time_gpu = time.time() print(f'Execution on CPU took {end_time_cpu - start_time_cpu} seconds') print(f'Execution on GPU took {end_time_gpu - start_time_gpu} seconds') test_performance() ``` 此脚本创建两个随机张量,并通过`tf.device()`方法指定了它们相乘的操作应该发生在哪个硬件资源之上——要么是在默认配置下自动选择的最佳选项(通常是GPU),要么强制限定到CPU上来完成同样的工作负载。最后打印出各自耗时情况供比较之用。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值