C++并行与并发


写在前面的话:这篇文章借鉴了很多文章,csdn填转载需要很多链接,我这里被迫写成原创,借鉴文章都给出链接,如有侵权请联系我

1cpu核数与线程

1.1核心(core)

一开始,每个物理 cpu 上只有一个核心(a single core),对操作系统而言,也就是同一时刻只能运行一个进程/线程。 为了提高性能,cpu 厂商开始在单个物理 cpu 上增加核心(实实在在的硬件存在),也就出现了双核心 cpu(dual-core cpu)以及多核心 cpu(multiple cores),这样一个双核心 cpu 就是同一时刻能够运行两个进程/线程的。

1.2虚拟核(virtual core)

为了提高单个 core 同一时刻能够执行的多线程数的能力(充分利用单个 core 的计算能力,尽量让其“一刻也不得闲”)
发展出了同时多线程技术(simultaneous multithreading)和 超线程技术(hyper–threading/HT),二者本质一样。
simultaneous multithreading 缩写是 SMT,AMD 和其他 cpu 厂商的称呼。 hyper–threading 是 Intel 的称呼,可以认为 hyper–threading 是 SMT 的一种具体技术实现。
通过这种技术可以将单个core分成多个virtual core。virtual core是一个逻辑概念,如果一个核可同时执行2个线程,那么该核的虚拟核数为2。(通常一个核某一个时刻只能执行一个线程,也就是一个核的线程数是1,但由于多线程技术(Simultaneous Multithreading,SMT)的出现,使得一个核具备多线程同时执行的能力。参考链接

在类似技术下,以下术语等价
虚拟 core: virtual core
逻辑 processer: logical processor
线程:thread
所以可以这样说:某款采用 SMT 技术的 4 核心 AMD cpu 提供了 8 线程同时执行的能力;某款采用 HT 技术的 2 核心 Intel cpu 提供了 4 线程同时执行的能力。参考链接
查看Windows下cpu、core、virtual core(thread)数量:
分别为1,8,16
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HqvIzqpH-1650520892562)(./1.jpg)]

2进程、线程、并发、并行

进程就是一个可执行程序,线程是cpu的虚拟核(cpu调度的基本单元),因此一个进程可以使用一个或多个线程。
并发,并行都是以线程为基本单元去定义和讨论的。

2.1定义

并发处理(Concurrency Processing):指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个虚拟核上运行,如果系统只有一个虚拟核,则它根本不可能真正同时运行一个以上的线程,它只能把运行时间划分成若干个时间段,再将时间段分配给各个线程执行,在某一个时间段内,只有一个线程在运行,其它线程处于挂起状态。这种方式我们称之为并发处理。

并行处理(Parallel Processing):当系统有一个以上的virtual core(或核)时,一个virtual core执行一个线程时,另一个virtual core可以执行另一个线程,两个线程互不抢占CPU资源,可以同时进行,这种方式我们称之为并行处理。参考链接

2.2区别

(1)并发是指在一段时间内宏观上多个程序同时运行(微观上只有一个程序在运行)。并行指的是同一个时刻(每时每刻),多个任务确实真的在同时运行(宏观微观均是如此)。
(2)并发的多个任务之间是互相抢占资源的。
并行的多个任务之间是不互相抢占资源的。
(3)并发过程中由于计算机的处理速度很快,只要时间段的间隔取得适当,那么一个用户作业从用完分配给它的一个时间段到获得下一个CPU时间片,中间有所”停顿”,但用户察觉不出来。参考链接
(4)图示区别:
在这里插入图片描述

3 C++与并行并发

一般而言,并发,串行经常使用cpu,并行经常使用gpu。

3.0c++线程

借助c语言的"pthread",或者借助c++11加入的线程库"thread"(推荐)。

3.1c++与并发

借助"pthread"或者"thread"实现cpu上的并发(通常做法,并且有相关书籍)

3.2c++与cpu并行

(1)c++17自带stl函数并行版本,可以实现在cpu或者gpu并行计算
(1)借助"pthread"或者"thread"实现cpu上的并行(通常不这么做)参考链接
(2)通常做法:借助openMP并行库,实现c++语言的cpu并行(openMP也支持GPU并行)。OpenMP版本2.0和2.5非常适合迭代的并行算法;也就是说,它们对数据数组执行并行迭代(vs只支持openMP2.0)
(4)通常做法2:使用TBB ( Thread Building Blocks) 开源库,TBB是Intel公司开发的并行编程开发的工具,cloud compare软件中使用了该并行库。
(3)也可以借助微软的PPL并行库。递归问题(如快速排序算法或搜索数据树)难以使用 OpenMP 实现。并发运行时通过提供并行模式库 (PPL) 和异步代理库来补充 OpenMP 的功能(基本没人用)。参考链接

3.3 c++与GPU并行

程序在cpu或者gpu上运行取决于程序通过编译器被转换成cpu还是gpu指令。
(1)c++17自带stl函数并行版本,但是需要对应的gpu编译器参考链接
(2)NVIDIA CUDA、AMD stream、C++ AMP、OpenCL openMP第三方库理论上都支持GPU并行计算。
跨平台,OpenCL 最广,操作系统(Win和Linux)和GPU(A&N)都不受限;
CUDA 操作系统不受限,但是只能用于N卡;参考链接
C++ AMP 只有 Windows 平台,编程简单,易上手,显卡不受限(只要支持 DX11),但是从VS2022已经不支持c++ AMP了,微软已经弃用参考链接
openMP是支持cpu并行起家,对GPU支持并不友好。
常用cuda,opencl第三方库进行gpu并行加速。

  • 9
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值