多核和多CPU编程——基础硬件说明

一、硬件的发展

CPU的发展在经过了摩尔定律的快速迭代后,有了长足的进步。但俗话说的好,一个好汉三个帮,单体的CPU发展,最终还是遇到了瓶颈。无论是超标量还是流水设计,都无法超越此瓶颈。从实际情况来看,多CPU要比多核出现的早,毕竟多CPU要比多核好设计架构一些。而随后,在单个芯片上集成多个CPU核心(CMP)也就是常说的多核技术开始迅速发展起来。
现代的多核心处理器,是一种内存共享的技术,CPU一般为对称状态,所以叫做共享存储的对称多处理器(SMT,symmetric multi-processor)。多核CPU上,线程是真正的并行执行的,而不是像单核那样时间片轮转的。
而多CPU技术中,如果是同一主板上,则和多核类似,如果是分布式集群中,则相关的分布式技术已经很成熟有展现,此处重点指的是多核心的基础硬件。

二、多核CPU的架构

多核CPU的架构按Flynn的划分主要有四类:
1、单指令流单数据流(SISD)——传统的顺序执行计算机其有一个CPU,它从存储在内存中的程序那里获得指令并串行执行,且只作用于单一的数据流即一个时钟周期内只处理一个数据流。早期的PC都是这种架构。
2、单指令流多数据流(SIMD)——单个的指令流同时处理多个数据流,它在处理数字信号、图形图像等领域应用较多。SIntel的MMX等处理器即是这种情况。
3、多指令流单数据流(MISD)——用多个指令同时处理单个数据流,但这种情况更倾向于一种理论模型,在实际情况中很少见。
4、多指令流多数据流(MIMD)——多个同时执行多个指令流,且这些指令流可以同时处理对应的多个数据流,现在的Intel和AMD的多核即是这种情况。
在PC上,常用的是AMD和Intel的架构设计,而在服务器上,则有Sun和IBM的架构设计。

三、指令集

不同的架构,一定会有不同的指令集来对应。早期的SIMD架构中,Intel从MMX指令集过渡到使用SSE指令集,但随着技术的进步,AMD不断推出兼容的指令集如SSE5,Intel为了保持技术的先发性,推出了AVX(Advanced Vector Extensions:高级向量扩展)指令集。相比起迭代了多年的SSE系列指令集,AVX指令集带来了巨大的革新,其中最为主要的是,它在兼容SSE指令集性的同时,将SSE时代最大宽度为128-bit的寄存器拓宽到了256-bit。而这只是开始,随后,Intel又推出了更新的AVX-512指令集,将寄存器宽度扩展到了512位。
好弓还得有好箭,这就是硬件在发展,指令集也得发展,才能更好的挖掘硬件的潜力。随之而来的,一定是上层的编译器及软件的更新,然后就是软件的进一步迭代。

四、多核的体系结构

多核的体系结构从发展来看分成了三类:
1、早期的HT超线程技术,定义的逻辑处理器而不是真正的物理处理器。
2、最早实现的多CPU处理器,一个芯片只有一颗CPU。
3、现代的多核心处理器,即一个芯片上有多颗CPU,当然这种多核可能也包含HT等技术。
4、混合型多核处理器,即在一个封装里混装了多种类型的处理器。这种典型是IBM的Cell。

五、总结

软件和硬件是相互促进,相互成就的。好的软件可以弥补硬件的不足,好的硬件可以更好的发挥软件的能力。从底层的硬件到上层的软件有着一条长长的链条,从硬件厂商,到编译器厂商,到操作系统,到语言标准,到语言库再到上层的应用,缺少哪一个环节,那么这个多核的优势就不能够完整的展现出来,所以一个技术的迭代发展,不是一朝一夕完成的。
硬件限制软件的空间,软件定义硬件的能力,不分彼此,合作共赢。
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
好的,关于CPU多核编程——线程池开发方面的问题,我可以向您提供一些建议和思路。 线程池是一种常用的并发编程技术,其主要作用是在多核CPU的情况下,实现任务的并行执行,提高程序的性能。在实际开发中,线程池通常都采用生产者-消费者模式进行开发。 具体来说,线程池中有一个任务队列,负责存放待执行的任务。线程池内部有一些工作线程,它们会不断地从任务队列中取出任务进行执行。如果任务队列为空,那么工作线程会被挂起,等待新的任务到来。 在开发线程池时,关键是要实现线程的管理和同步。具体工作包括: 1. 配置线程池中工作线程的数量。这个数量通常要根据CPU的核心数和任务的类型来决定。如果任务是I/O密集型,那么工作线程数量应该设置得比较大;如果任务是计算密集型,那么工作线程数量可以适当减少。 2. 实现任务队列。这个队列可以采用多种数据结构来实现,比如数组、链表、堆等。对于多线程的情况,需要考虑线程之间的同步问题,防止数据竞争。 3. 实现工作线程。这些线程需要不断地从任务队列中取出任务进行执行,并且在没有任务时进入等待状态。同时,为了保证线程之间的公平性,需要采用一些调度算法,比如轮询、优先级队列等。 4. 实现任务接口。这些接口需要包括任务的执行函数以及相关的参数,以支持不同类型的任务。 总体来说,线程池的开发比较复杂,需要在多线程的情况下考虑到各种同步和调度问题。但是一旦实现成功,线程池可以大大提高程序的运行效率和响应速度。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值