多核开发入门指南

一、为什么需要多核开发?

        答案很简单,目前的芯片制造技术对CPU主频的提升已经达到一个极限了,也就是说性能的垂直伸缩已经不太可能了。因此通过多核的方法,可以让程序横向的伸缩,这就类似于用多台服务器实现负载均衡(水平伸缩),而不是简单的靠将服务器升级成小型机来提供处理能力(垂直伸缩)。

        虽然多核并行计算的概念已经存在了几十年了,但直到最近多核CPU在PC上的普及,多核开发才不得不提引起程序员的重视。

        多核开发的本质就是使用多线程进行程序开发,我们在学数据结构和算法的时候,写的所有的算法都是面向单线程的。而多核开发的目的就是将这些算法改造成多线程的支持,然后系统运行时将这些多线程平均分配到多核处理器上,以实现运行的加速。

        多核开发可以应用的领域非常多,对于初学者,可以从优化现有的各种算法开始,例如对于搜索状态空间数的各种算法,例如各种棋类问题的求解等等。此外,在视频,音频或图形的编码,加密解密算法,数据分析统计,以及需要高性能计算的各种仿真学领域都可以进行应用。当然在Web开发领域,多核应用一般不需要程序员来关心,因为现在的主流Web服务器都是基于轻量级的进程池,即每个请求由一个进程处理,而服务器会自动将进程分配到不同的核上去处理。

 

二、如何进行多核开发

      如果你很熟悉POSIX threads (pthreads) 或者 WinAPI threads,你就可以自己进行开发。
      如果你不想设计过多底层的线程操作,那就选择一个并发开发平台,由平台来自动协调,调度和管理多核资源。并发开发平台包括各种线程池的库,例如
          .NET的ThreadPool类
          Java的Concurrent类
          消息传递环境,例如MPI
          data-parallel编程环境,例如NESL, RapidMind, ZPL
          task-parallel编程环境, 例如Intel的Threading Building Blocks (TBB) 和 Microsoft的Task Parallel Library (TPL)
          动态编程环境,例如Cilk or Cilk++或者业界标准OpenMP. 
    这些并发平台通过提供语言抽象,扩充注释或者提供库函数的方式来支持多核开发。

 

三、使用并发开发平台具体有哪些好处

      我们从下面几个方面来看:

      软件开发中最重要的三个考虑的要素就是
              程序的性能 (使用多核就是为了提升程序的性能的)
              开发的时间
              程序的可靠性

      而其中影响开发时间的三个要素是

                 伸缩性:如果你自己编写线程,你必须考虑用户是双核,四核还是八核。如何将线程自动适应用户的核数,并且在多核上将线程均衡的负载。
                 代码简洁:直接使用底层线程库操作代码是十分复杂的
                 模块化:直接使用底层线程库操作还会破坏代码的模块化

 

四、具体实例

          下面以Fibonacci的例子来演示:它的递归算法经常被用来作为多核开发的例子,虽然我们知道该算法的迭代法效率最高,但是这里仅仅是为了说明如何使用多核开发库,所以请不要较真。


          单核时代,我们写Fibonacci代码的方法如下:

  1. int fib(int n) 
  2. {
  3.   if (n < 2) return n;
  4.  else {
  5.       int x = fib(n-1);
  6.       int y = fib(n-2);
  7.       return x + y;
  8.      }
  9. }       
  10.                 
  11. int main(int argc, char 
  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值