zoukankan      html  css  js  c++  java
  • 浅说CPU并行计算与GPU并行计算

    最近在学一门课,叫做“C++与并行计算”。要用到多CPU(进程)并行的原理,实现语言是C++的MPI接口。联想到上学期用到CUDA C/C++来做并行计算,就对这两门语言做一个总结,分享下自己关于并行计算的认识。

    1 并行计算的基本原理

    并行计算一般有两个维度,一个是指令(Instruction)或程序(Program),另一个是数据(Data)。这样,就可以归纳出各种并行模式(S代表Single,M代表Multiple)。

    除了SISD,其他几个都算是并行计算方法。这里重点介绍下SPMD。

    SPMD是最简单的一种并行计算模式。SP意味着程序员只需写一份代码,MD意味着这些代码对不同的数据应该分别处理。而并行,则要求数据处理的过程要同时进行。通俗的讲,就是一份代码被复制了多份,然后每份代码单独跑一份数据,从而实现并行。这就引出了一个问题:数据是如何存储的?

    1.1 数据的存储

    数据的存储可以分为两大类:分布式存储和共享内存。

    分布式存储意味着不同的进程/指令处理不同的数据,大家互相不干扰。基于多CPU的MPI并行计算接口用的就是这种思想。

    共享内存则要求不同的进程/指令可以同时修改同一块数据。这样,进程之间的通信将变得简单。缺点是容易造成数据读写冲突而需要谨慎对待。基于GPU的CUDA C/C++并行计算就用到了这种方法。

    2 MPI:多CPU并行计算

    鉴于最近几年个人计算机多CPU的兴起,利用多个CPU来处理同一个任务不失为最简单的并行计算方法。其中的代表方法就是MPI。MPI全称是Message Passing Interface,是一个消息传递接口(或约定)。MPI的特点可以用以下几点来概括:

    1. MPI属于SPMD框架;

    2. 数据是分布式存储的;

    3. 把握进程之间消息的传递是写好MPI程序的关键!

    最简单的MPI “Hello, World!”程序如下:(存储为hello.c)

    #include <stdio.h>
    #include <mpi.h> // MPI库
     
     int main(int argc, char *argv[])
     {
         MPI_Init(&argc, &argv);  // 启动MPI并行计算
     
         printf("Hello, World!
    ");
     
         MPI_Finalize();  // 结束MPI并行计算
    
         return(0);
     }

    MPI程序的编译不同于一般的C/C++程序,需要用单独的mpi命令编译。对于C MPI程序,编译命令是mpicc;对于C++ MPI程序,编译命令则是mpigxx。例如编译上面的C MPI程序:

    $mpicc hello.c -o hello

    同样,运行C/C++ MPI程序需要用到mpi的运行命令:mpirun 或 mpiexec。最常用的格式如下:

    $mpirun -np 3 hello

    -np是可选的参数,表示启动的进程数,默认为1。这里启动了三个进程,从而屏幕上将打印出三行"Hello, World!"。

    3 CUDA C/C++:最火的CPU+GPU并行计算语言

    GPU并行计算的崛起得益于大数据时代的到来,而传统的多CPU并行计算已经远远不能满足大数据的需求。GPU最大的特点是它拥有超多计算核心,往往成千上万核。而每个核心都可以模拟一个CPU的计算功能,虽然单个GPU核心的计算能力一般低于CPU。

    CUDA,全称是Compute Unified Device Architecture,即统一计算架构,是由生产GPU最有名的英伟达公司提出的CPU+GPU混合编程框架。CUDA C/C++语言有如下特点:

    1. 也是SPMD框架;

    2. 兼有分布式存储和共享内存的优点;

    3. 把握GPU的带宽是充分利用GPU计算资源的关键。

    一般,经过一定优化的CUDA C/C++程序的计算速度相比于传统的CPU程序的计算速度要快几倍到几十倍。正因为如此,在目前火热的深度学习领域,越来越多的科研工作者和工程师都开始利用GPU和CUDA来并行加速。

    4 其他

    并行计算,尤其是利用GPU和CUDA来并行加速是很诱人的一门技术。然而,从我个人的经验来讲,写一个并行计算程序比写一个串行程序难多了。难点主要体现在以下几点:

    1. 并行程序需要更长的代码,从而增加了工作量;

    2. 并行程序的各个进程执行进度不确定,增加了debug的困难。

    3. 需要对硬件架构、内存有更高的把握。

    不过,考虑到并行计算诱人的前景,这些难点还是值得克服的。至少,对于一个机器学习的科研工作者而言,几十倍的速度将大大的减少用于做实验的时间。所以,何乐而不为呢?

    欢迎讨论!

    参考:

    1. SPMD:http://en.wikipedia.org/wiki/SPMD

    2. MPI:https://www.sharcnet.ca/help/index.php/Getting_Started_with_MPI

  • 相关阅读:
    Educational Codeforces Round 85 D. Minimum Euler Cycle(模拟/数学/图)
    Educational Codeforces Round 85 C. Circle of Monsters(贪心)
    NOIP 2017 提高组 DAY1 T1小凯的疑惑(二元一次不定方程)
    Educational Codeforces Round 85 B. Middle Class(排序/贪心/水题)
    Educational Codeforces Round 85 A. Level Statistics(水题)
    IOS中的三大事件
    用Quartz 2D画小黄人
    strong、weak、copy、assign 在命名属性时候怎么用
    用代码生成UINavigationController 与UITabBarController相结合的简单QQ框架(部分)
    Attempting to badge the application icon but haven't received permission from the user to badge the application错误解决办法
  • 原文地址:https://www.cnblogs.com/fengfu-chris/p/4357821.html
Copyright © 2011-2022 走看看