浅谈多核CPU、多线程与并行计算_第1页
浅谈多核CPU、多线程与并行计算_第2页
浅谈多核CPU、多线程与并行计算_第3页
浅谈多核CPU、多线程与并行计算_第4页
免费预览已结束,剩余1页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1 0 前言 最近发觉自己博客转帖的太多 于是决定自己写一个原创的 笔者用过 MPI 和 C 线程池 参加过比赛 有所感受 将近一年来 对多线程编程兴趣 一直不减 一直有所关注 决定写篇文章 算是对知识的总结吧 有说的不对 的地方 欢迎各位大哥们指正 1 CPU 发展趋势 核心数目依旧会越来越多 依据摩尔定律 由于单个核心性能提升有着严 重的瓶颈问题 普通的桌面 PC 有望在 2017 年末 2018 年初达到 24 核心 或 者 16 核 32 线程 我们如何来面对这突如其来的核心数目的增加 编程也要 与时俱进 笔者斗胆预测 CPU 各个核心之间的片内总线将会采用 4 路组相连 因为全相连太过复杂 单总线又不够给力 而且应该是非对称多核处理器 可能其中会混杂几个 DSP 处理器或流处理器 2 多线程与并行计算的区别 1 多线程的作用不只是用作并行计算 他还有很多很有益的作用 还在单核时代 多线程就有很广泛的应用 这时候多线程大多用于降低阻 塞 意思是类似于 while 1 if flag 1 break 2 sleep 1 这样的代码 带来的 CPU 资源闲置 注意这里没有浪费 CPU 资源 去掉 sleep 1 就是纯浪费了 阻塞在什么时候发生呢 一般是等待 IO 操作 磁盘 数据库 网络等等 此时如果单线程 CPU 会干转不干实事 与本程序无关的事情都算不干实事 因为执行其他程序对我来说没意义 效率低下 针对这个程序而言 例如 一个 IO 操作要耗时 10 毫秒 CPU 就会被阻塞接近 10 毫秒 这是何等的浪费 啊 要知道 CPU 是数着纳秒过日子的 所以这种耗时的 IO 操作就用一个线程 Thread 去代为执行 创建这个线程 的函数 代码 部分不会被 IO 操作阻塞 继续干这个程序中其他的事情 而 不是干等待 或者去执行其他程序 同样在这个单核时代 多线程的这个消除阻塞的作用还可以叫做 并发 这和并行是有着本质的不同的 并发是 伪并行 看似并行 而实际上还是 一个 CPU 在执行一切事物 只是切换的太快 我们没法察觉罢了 例如基于 UI 的程序 俗话说就是图形界面 如果你点一个按钮触发的事件 需要执行 10 秒钟 那么这个程序就会假死 因为程序在忙着执行 没空搭理用户的其他操作 而如果你把这个按钮触发的函数赋给一个线程 然后启动线程去执行 那么程序就不会假死 继续响应用户的其他操作 但是 随之而来的就是线程的互斥和同步 死锁等问题 详细见有关文献 现在是多核时代了 这种线程的互斥和同步问题是更加严峻的 单核时代 大都算并发 多核时代真的就大为不同 为什么呢 具体细节请参考有关文献 3 我这里简单解释一下 以前 volatile 型变量的使用可以解决大部分问题 例如 多个线程共同访问一个 Flag 标志位 如果是单核并发 基本不会出问题 P S 在什么情况下会出问题呢 Flag 有多个 或者是一个数组 这时候只能通过逻 辑手段搞定这个问题了 多来几次空转无所谓 别出致命问题就行 因为 CPU 只有一个 同时访问这个标志位的只能有一个线程 而多核情况下就不太 一样了 所以仅仅 volatile 不太能解决问题 这就要用到具体语言 具体环境 中的 信号量 了 Mutex Monitor Lock 等等 这些类都操作了硬件上的 关中断 达到 原语 效果 对临界区的访问不被打断的效果 具体就不 解释了 读者可以看看 现代操作系统 2 并行计算还可以通过其他手段来获得 而多线程只是其中之一 其他手段包括 多进程 这又包括共享存储区的和分布式多机 以及混合 式的 指令级并行 ILP 指令级并行 x86 架构里叫 SMT 同时多线程 在 MIPS 架构里 与之对应的是 super scalar 超标量 和乱序执行 二者有区别 但共同点都 是可以达到指令级并行 这是用户没法控制的 不属于编程范围 只能做些有 限的优化 而这有限的优化可能只属于编译器管辖的范畴 用户能做的甚少 3 典型的适于并行计算的语言 Erlang 和 MPI 这两个前者是语言 后者是 C 和 Fortran 的扩展库 效 果是一样的 利用多进程实现并行计算 Erlang 是共享存储区的 MPI 是混合 型的 C NET4 0 新版本 4 0 可以用少量代码实现并行 For 循环 之前版本需 要用很繁琐的代码才能实现同样功能 这是利用了多线程实现并行计算 Java 4 和 C 3 5 都有线程池 ThreadPool 也是不错的很好用的多线程管理类 可以方便高效的使用多线程 CUDA 还是个初生牛犊 有很大的发展潜力 只不过就目前其应用领域 很有限 其目前只能使用 C 语言 而且还不是 C99 比较低级 不能使用函数 指针 个人感觉这由于硬件上天生的局限性 平均每个核心可用内存小 与系 统内存通讯时间长 只适用于做科学计算 静态图像处理 视频编码解码 其他领域 还不如高端 CPU 等以后 GPU 有操作系统了 能充分调度 GPU 资 源了 GPU 就可以当大神了 游戏中的物理加速 实际上多核 CPU 也能很好 的做到 其他语言 恩 留作将来讨论 3 线程越多越好吗 什么时候才有必要用多线程 线程必然不是越多越好 线程切换也是要开销的 当你增加一个线程的时 候 增加的额外开销要小于该线程能够消除的阻塞时间 这才叫物有所值 Linux 自从 2 6 内核开始 就会把不同的线程交给不同的核心去处理 Windows 也从 NT 4 0 开始支持这一特性 什么时候该使用多线程呢 这要分四种情况讨论 a 多核 CPU 计算密集型任务 此时要尽量使用多线程 可以提高任务 执行效率 例如加密解密 数据压缩解压缩 视频 音频 普通数据 否则 只能使一个核心满载 而其他核心闲置 5 b 单核 CPU 计算密集型任务 此时的任务已经把 CPU 资源 100 消耗 了 就没必要也不可能使用多线程来提高计算效率了 相反 如果要做人机交 互 最好还是要用多线程 避免用户没法对计算机进行操作 c 单核 CPU IO 密集型任务 使用多线程还是为了人机交互方便 d 多核

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论