• 浅说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

  • 相关阅读:
    古典密码-移位密码|埃特巴什密码Atbash
    古典密码-凯撒密码Caeser
    古典密码-维吉尼亚密码Vigenere
    使用kubeadm搭建一个k8s集群
    用户态线程和内核态线程的区别
    模板合集
    NoteExpress 章节合并后如何更新参考文献列表?
    CSDN 博客园主题
    GShang的博客园2020年终总结
    【比赛记录】CodeChef January Challenge 2021
  • 原文地址:https://www.cnblogs.com/fengfu-chris/p/4357821.html
Copyright © 2020-2023  润新知