最近在学一门课,叫做“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!\n"); MPI_Finalize(); // 结束MPI并行计算 return();
}

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  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

浅说CPU并行计算与GPU并行计算的更多相关文章

  1. 国内云计算的缺失环节: GPU并行计算(转)

    [IT时代周刊编者按]云计算特有的优点和巨大的商业前景,让其成为了近年来的IT界最热门词汇之一.当然,这也与中国移动互联网的繁荣紧密相关,它们需要有相应的云计算服务作为支撑.但本文作者祁海江结合自身的 ...

  2. 科学计算 | Matlab 使用 GPU 并行计算

    科学计算 | Matlab 使用 GPU 并行计算 本文转载自:  https://sanwen8.cn/p/14bJc10.html       Matlab下直接使用GPU并行计算(预告)< ...

  3. 【并行计算-CUDA开发】浅谈GPU并行计算新趋势

    随着GPU的可编程性不断增强,GPU的应用能力已经远远超出了图形渲染任务,利用GPU完成通用计算的研究逐渐活跃起来,将GPU用于图形渲染以外领域的计算成为GPGPU(General Purpose c ...

  4. [信安Presentation]一种基于GPU并行计算的MD5密码解密方法

    -------------------paper--------------------- 一种基于GPU并行计算的MD5密码解密方法 0.abstract1.md5算法概述2.md5安全性分析3.基 ...

  5. 89、tensorflow使用GPU并行计算

    ''' Created on May 25, 2017 @author: p0079482 ''' # 分布式深度学习模型训练模式 # 在一台机器的多个GPU上并行训练深度学习模型 from date ...

  6. pytorch利用多个GPU并行计算多gpu

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/Answer3664/article/de ...

  7. [个人论文]一种基于GPU并行计算的MD5密码解密方法

    求轻喷... [顺便get一份LaTeX论文模板....还是XeLaTex好用.珍爱生命远离CJK http://files.cnblogs.com/files/pdev/paper.zip

  8. TensorFlow在Windows上的CPU版本和GPU版本的安装指南(亲测有效)

    安装说明 平台:Window.Ubuntu.Mac等操作系统 版本:支持GPU版本和CPU版本 安装方式:pip方式.Anaconda方式 attention: 在Windows上目前支持python ...

  9. 学习笔记TF046:TensoFlow开发环境,Mac、Ubuntu/Linux、Windows,CPU版本、GPU版本

    下载TensorFlow https://github.com/tensorflow/tensorflow/tree/v1.1.0 .Tags选择版本,下载解压. pip安装.pip,Python包管 ...

随机推荐

  1. PL/SQL 流程控制语句-条件结构,循环结构

    条件结构 一.IF-THEN语句 IF-THEN语句是最简单的IF语句. 语法: IF condition THEN Statements END IF; 例子: declare v_score nu ...

  2. (原)vs2013编译成静态库

    转载请注明出处: http://www.cnblogs.com/darkknightzh/p/5477664.html 1. 在“属性”-“配置属性”-“常规”-“配置类型”里面设置“静态库(.lib ...

  3. Java异常基础Exception

    异常指不期而至的各种状况,如:文件找不到.网络连接失败.非法参数等.异常是一个事件,它发生在程序运行期间,干扰了正常的指令流程.Java通 过API中Throwable类的众多子类描述各种不同的异常. ...

  4. 单机/伪分布式Hadoop2.4.1安装文档

    转载自官方文档,最新版请见:http://hadoop.apache.org/docs/r2.4.1/hadoop-project-dist/hadoop-common/SingleCluster.h ...

  5. [原]C++程序示例:涉及到抽象类、继承…

    C++复习题. 有助于理解: .h与.cpp分离 基类.派生类.抽象类 多态.纯虚函数 对象指针.引用 派生类使用基类的构造函数 ... =============================== ...

  6. 2016届百度实习生前端笔试题上海卷a

    1.写出javascript运行结果:alert(‘5’+5); 结果:alert()函数中不能进行算术运算或字符串拼接,故不会弹出对话框.   2.写出javascript运行结果:for(var ...

  7. Eclipse Clojure 开发插件

    参考:http://doc.ccw-ide.org/documentation.html#install-as-plugin 安装Eclipse Clojure插件 这里安装的插件是Countercl ...

  8. js加载优化

    阻塞特性:       JS 有个很无语的阻塞特性,就是当浏览器在执行JS 代码时,不能同时做其他任何事情,无论其代码是内嵌的还是外部的. 脚本位置:       浏览器在碰到一个引入外部JS 文件的 ...

  9. Qt直接使用OpenSSL里的函数

    简述 OpenSSL是一个强大的安全套接字层密码库,囊括主要的密码算法.常用的密钥和证书封装管理功能及SSL协议,并提供丰富的应用程序供测试或其它目的使用. 简述 下载安装 使用 更多参考 下载安装 ...

  10. T-SQL 游标

    游标是面向行的,它会使开发人员变懒,懒得去想用面向集合的查询方式实现某些功能. 在性能上,游标会迟更多的内存,减少可用的并发,占用带宽,锁定资源,当然还有更多的代码量. 用一个比喻来说明为什么游标会占 ...