精华内容
下载资源
问答
  • 并行处理技术的形式为
    千次阅读
    2017-09-11 22:27:38

    序之序

            下面几篇将连载并行信号处理技术,内容来自于我原来的工作,略作总结。

            这个系列在调研国内外通用异构计算技术和软件化雷达技术的基础上,结合某雷达样机验证项目,探寻在基于GPU的通用异构服务器上进行实时信号处理任务和建立软件化信号处理软件开发体系。在此基础上分析阐述了当前通用异构计算领域的关键技术、性能指标、硬件组成和软件开发手段,探索未来全软件化架构的发展和在通用异构服务器上,特别是针对GPU和多CPU情况下进行雷达信号实时处理的可能性。
            所用硬件平台是建立在商用COTS服务器基础上,搭载多核多CPU和多GPU加速卡的异构并行处理平台,并在此硬件平台上实现了窄带脉冲多普勒雷达和宽带逆合成孔径雷达的并行化设计和部署,验证了异构环境下运算的实时性和正确性。最后结合前期调研,尝试性的设计了适合于通用异构并行平台的软件化雷达开发体系架构和实现思路,并就可能涉及的关键技术进行了初步分析。
            这一篇[补充连接]阐述了本课题的研究背景和研究意义,并调研国内外相关研究的进展,和平行领域对通用异构并行平台的研制情况进和发展经验,对本文课题进行了背景研究和简单综述。
           这一篇[补充连接]首先介绍了并行计算体系的原理和可能结构,并针对本文采用的多核多CPU以及GPGPU加速的异构并行平台,分别阐述了相关的并行计算模型和开发手段,特别针对本课题使用的CUDA体系框架和OpenMP并行计算模型进行了详细的阐述。对其计算架构和编程技术做了较为详细的分析,为后文的应用实例奠定基础。
           这一篇[补充连接]就窄带脉冲多普勒(PD)雷达在基于GPGPU的通用异构并行平台上的应用设计做出说明,包括对动目标检测理论的分析,关键算法的并行化设计和在本异构并行平台上的部署工作,最后分析了并行设计并实现后的运算性能,并和传统基于TI C6678 DSP的嵌入式平台进行了对比验证,验证了本文阐述的并行化设计方法和实现手段在对于窄带目标检测跟踪雷达的信号处理算法实时实现上的可用性和高效性。
           这一篇[补充连接]就宽带逆合成孔径成像雷达(ISAR)在基于GPGPU的通用异构并行平台上的应用设计做出分析,包括对ISAR典型信号处理过程的原理分析,关键算法的并行化设计和在本异构并行平台上的部署工作,最后分析了并行设计并实现后的运算性能,并和传统基于TI C6678 DSP的嵌入式平台进行了对比验证,验证了本文阐述的并行化设计方法和实现手段在对于宽带成像雷达的信号处理算法实时实现上的可用性和高效性。
           这一篇[补充连接]就本课题使用的基于GPGPU的通用异构并行平台,结合软件化雷达发展要求,对其软件化体系架构做出分析,尝试性的提出了异构并行通用计算平台上的软件化雷达体系架构。对软件化的综合处理子系统做了概念性分析,阐述了一种采用五层划分软件化体系实现方式,并就其可能需要攻破的关键技术做出了初步分析。
    最后,对本文设计采用的COTS硬件,基于GPGPU的通用并行综合处理平台,异构并行模式下的软件开发手段,特别是将GPGPU应用于雷达信号处理领域的探索,以及软件化综合处理子系统的实现方式的探索做出总结,并展望了未来全COTS的、异构的、并行化的、通用的、软件化的雷达综合处理子系统的发展。


    背景和意义


            然而随着材料科学和电子对抗技术发展,雷达面临着前所未有的挑战。隐身、低空、高速、高机动目标对雷达的探测能力提出了新的要求;电磁波频率的日益紧缺,现代电磁环境复杂多变性对雷达适应能力和抗干扰能力是严峻的考验[2]。传统雷达工作模式固定、可调整参数有限、资源配置僵化、信号处理方案受平台制约,已经难以适应瞬息万变的现代化战场要求。

            结合现代IC和IT技术,雷达信号处理的精细化研发需要从雷达工业体制、雷达系统结构、信号处理平台、雷达算法研究等多方面做出改变。然而功能多样、用途广泛的传统雷达在软硬件选择、设备生产制造一直都是定制的,给雷达系统的开发、维护、升级带来了很大困难。为了统一雷达装备的设计制造、提高装备效费比、缩短研发周期、保证装备研制的可靠性和可维护性,军方对雷达装备特别是信号处理子系统的统型逐渐重视。雷达系统的高度可重构、功能可扩展、模式多样化成为研制开发的迫切需求[3],缩短研制周期、提高可维护能力更是势在必行。自上世纪80年代后期以来,雷达经历了模块化、通用化、数字化、软件化四个发展阶段,其发展趋势始终是信号处理系统的通用化,其它分系统最大程度的数字化,开发验证环境尽可能的软件化。

            为此,本文瞄准雷达精细化研发和智能化处理需求,以数字化和软件工程技术为支撑,构建基于通用图形处理器(GPGPU)的通用化雷达综合信息处理平台,其核心为以通用图形处理器为主要运算单元,配合多个高性能多核中央处理器(CPU),在此异构平台上,进行实时的雷达信号信息处理工作。在软件设计上,考虑构件化和通用化[4],以合理的软件框架结构和标准的应用程序接口(API)定义,形成可复用、可重构、组件化的综合雷达信号信息处理软件平台,满足更精细、更灵活多样的雷达处理工作。同时通过软件的逐层抽象和封装,将开发任务分级分层,形成自上而下的逐层开放结构,各级别开发人员及其使用的软硬件资源松耦合,达到快速开发、快速迭代、快速重构的目的,满足新的需求。


    现状和趋势


    实时处理平台研制技术


    (1)高性能运算处理器


            随着半导体技术的发展,微处理器的运算性能大幅度提高,但实际处理能力与具体应用算法的实现方法密切相关[5],而实时信号处理中关键性的I/O能力相对较弱,不同类型的微处理器在实时信号处理领域表现不一[6]。在实时信号处理中主流处理器有如下四类:

    ①     数字信号处理器(DSP),浮点运算能力强、I/O带宽大,适合信号处理运算和高带宽通信。随着多核DSP的成熟其处理能力得到了进一步的提升。目前这类DSP依然是雷达信号处理领域的主流处理设备。

    ②     FPGA构建的专用处理设备,定点运算能力极强、I/O带宽极大,但较难进行软件化设计,且浮点性能不足。一般用在信号处理机前端或作为特定算法的协处理器,如正交插值、滤波、固定系数脉压、FFT、固定权DBF等。

    ③     通用CPU具有较高的主频,其运算速度最高达每秒数百亿至千亿次浮点,这一指标远高于DSP,如Intel Core系列主频超3GHz。但其不足是用户开发硬件难度高、功耗大、I/O带宽远低于其运算能力。这类处理器拥有良好的软件生态环境和良好的兼容性,有利于系统设计的可持续性。

    ④     GPU作为一种新兴的协处理器,补充了CPU在矢量运算上的劣势,利用其大量的运算核心获得了极高的数据吞吐量,在较低核心频率(1.328GHz)下获得了最高达每秒十万亿次浮点的运算能力(GP100)。同时良好的软件生态环境也大大降低了开发周期,但其不足是不能独立于CPU运行且功耗较大。


    表1  主流处理器指标和应用情况

    型号

    Xeon E5-2450

    TI C6678

    Nvidia GP100

    FPGA

    核心频率

    2.9 GHz

    1.25 GHz

    1328 MHz

    500 MHz

    处理内核

    8

    8

    3584

    -

    浮点处理速度

    410亿/秒

    160亿/秒

    10万亿/秒

    定点处理速度

    980亿/秒

    320亿/秒

    >1万亿/秒

    通信速度

    38.4 GB/秒

    10GB/秒

    160GB/秒

    >50GB/秒

    功耗

    95W

    15W

    300W

    5W

    硬件设计难度

    较高

    软件设计成本

    较高



    (2)国内外专用信号处理平台研制情况


            国外标准信号处理平台常配置多片DSP和FPGA,具备高速处理、高速通信、大容量存储,并配有成熟的应用支持软件。
    从设计趋势上看,未来更强调通用化和软件化。从硬件选用上看,处理器发展水平相对雷达应用的运算要求是满足的。因此信号处理设备的设计制造将更多的是系统设计和软件开发。这样规避了先进处理器系统的硬件设计难度大、周期长、成本高的问题。
    国外厂商采用DSP、FPGA、CPU等多种处理器混合设计的雷达信号处理机型号多样、规模和处理速度不一,处理机的互连结构、操作系统和软件设计上千差万别。尽管都强调通用化和软件化,也采用可编程、可扩展、可重构的设计方法,但通用性、易用性仍不足,编程效率低,缺乏高层设计软件支持。而在强调通用化特点后,限制了有针对性的优化措施,制约了处理机的运算效率。并且为满足雷达系统特殊要求,在标准总线基础上又设计了背板自定义连线和前面板数据端口(FPDP)增加了系统复杂度,不便于维护和扩展,有悖于通用化的设计需求,同时在软件的可移植性上也由于专用接口和定制总线的存在而带来困难。
            国内自上世纪90年代以来,雷达数字化、软件化技术快速发展,清华、北理、西电、中科院声学所、中船709、中船715、中电14、中电38等[3]都开展了雷达数字化、软件化相关技术研究。十五至十一五期间,在采集存储模块、信号处理模块、互联结构等硬件水平和通用化软件设计上都取得了很大进展。
    国内雷达、声呐、航空等行业的多家单位设计生产的信号处理设备相继采用具备高速通信能力的新型总线,如VPX。国内航天、航空、舰船领域的专业设备研究所,主要雷达研究所,包络北理、西电在内的各大高校先后研制了兼容OpenVPX标准的信号处理设备。


    软件化雷达处理平台的发展


            自二战以来,美军研制了搜索、跟踪、测高、航管等各型雷达,扩展了成像、分类、识别等功能,而各个雷达谱系体系封闭、功能单一、型谱复杂、精细化程度低,使用、维护、升级困难。美国防部于1994年在《国防部指示5000.02》中开始明确要求采用模块化、开放式的研发方式;2000年提出了软件化雷达的设计理念;2009年成立了开放式雷达体系结构国防支援团队,推动软件化雷达的发展,并成功在三坐标远程雷达(3DELRR)上进行了演示验证;2013年美国联邦航空管理局(FAA)在国防部(DoD)的宙斯盾防御系统中论证了模块化开放系统方法(MOSA),并成功应用于多功能相控阵雷达(MPAR),计划于2018年完成投资分析,随后进入研发阶段(图1);2014年美军开展软件化多功能数字阵列雷达的研制,成功推广软件化雷达技术。


    图1  MPAR研制计划路线图

            MIT林肯实验室于2000年在一代雷达开放式体系架构(ROSA-I)基础上,成功设计了Cobra Gemini雷达样机;2010年提出ROSA-II分层架构,相比于ROSA-I,二代ROSA增加了灵活性、可扩展性、模块化程度、便携性和可维护性,还增加了对相控阵雷达的支持。
    ROSA-II分层架构如图2所示,左侧代表已优化好的组件库,可根据系统设计搭建雷达系统。组件要求具有很好的工程特性、相互松耦合、遵循接口控制文件(ICD)标准。ROSA-II在标准组件库中增加了网络服务组件以支持网络中心化服务,配合控制组件和数据流组件,允许设计者搭建完全网络中心式系统,支持多任务需求,以及传感器数据收集、流数据产生等。ROSA-II结构中自顶向下分别是:应用组件层,应用独立层,中间件,操作系统和硬件层。ROSA-II增加了雷达开放式体系架构应用独立层(RTCL),上层组件以应用程序编程接口形式连接RTCL的通用接口。RTCL将组件和中间件隔离,具有任意多个中间件兼容的特点。例如,在一个系统中可以存在两种中间件,一个可以用来在一个对称多核计算平台上进行组件之间的数据传输,另一个用来支持网间的数据传输。前者采用共享存储器方式,避免数据拷贝,有利于提高系统吞吐量、减小延迟。后者是数据分布服务(DDS)组件,用于B/S模式下的发布-订阅式数据传输。ROSA已成为雷达开放式体系架构ROSA 2020防御系统工程的一部分,由美国USD(AT&L)防御研究团队领导,旨在促进通用开放的、以网为中心的雷达体系架构的发展。


    图2  ROSA-II分层架构

            美军通过构建软件化雷达,实现雷达系统软硬件隔离;采用开放式架构打破了当前相对封闭的研发生态,引入独立的第三方进入软件研发,调动全行业智力资源,促进军民融合式发展;同时改变现有采购规则和甲乙方之间的静态合约关系;有效解决了雷达装备发展面临的维护升级困难、型谱复杂、研制周期长等难题,形成快速响应新需求的能力。
            国内雷达数字化技术研究在循序渐进的展开,于“十一五”至“十二五”期间,对数字化、软件化的信号处理平台样机在数字阵列雷达上进行了演示验证[3]。
    从用户方面看,国内雷达型号多、用途差异大,设计方法、核心器件、性能水平等差别很大,设备整体存在以下诸多问题,严重制约了设备的可维护性和稳定性;硬件设备标准不统一,数据传输协议差异大,软件设计多样化。用户对众多前端信号处理设备和终端的软硬件和接口标准统一化有迫切需求,早在“十五”期间就提出通用信号处理机的发展计划,并已着手标准制定,拟在某些地面情报雷达中推广[16]。
    硬件方面,数字化技术正迅速应用,全数字化雷达已逐步走向成熟应用阶段。其主要技术优点有:系统资源利用率高,易实现同时多功能;动态范围大,测角精度高;超低副瓣以及自适应波束置零;易实现天线阵列自校准和失效单元校正;可实现以距离为函数的自适应处理技术;易实现硬件重构和软件重组,具备可扩充性和柔性制造。国防科技大学已实现多通道射频数字化接收组件,可用于有源/无源相控阵雷达,给软件化雷达发展提供了技术支撑[17]。西安电子科技大学研制的基于TI C6678的多核多处理通用平台,解决了雷达信号处理设计方法软硬件耦合紧、研发低效率、无移植性、通用性差的问题,为软件化雷达的研制提供硬件基础[18]。目前,已经做到信号处理模块通用,数字采样模块通用等,硬件模块通用化,初步制定了一些软硬件规范,为软件化雷达提供有力的基础。
    软件方面,国内计算所从事基础软件到应用软件的研发,可以为软件化雷达服务。清华大学推出了多DSP平台上的自动代码生成软件,针对特定多DSP平台上的具体代码进行分类和特征提取,能够在通用代码框架模板下生成DSP源代码,为软件化雷达的发展提供软件支撑。清华大学汤俊教授带领的团队已经完成通用雷达信号实时处理平台RadarLab 2.0的研发工作[3],实现了上层硬件和底层硬件的解耦,可显著提高雷达信号处理系统的开发效率和灵活性。

    GPU设备的演进


           图形处理器(GPU)自独立于CPU作为加速设备至今,架构上发生了三次主要的升级。第一代是1999年之前,实现了图形加速器的分离,不具备软件开发环境,以通用电气(GE)为代表。第二代是1999年至2002年,硬件指标上有所提升,具备了有限的软件编程环境,以NVidia的GeForce3为代表。第三代为2002年至今,硬件飞速发展,软件开发环境逐步完善,以NVidia的CUDA为代表。
           目前,GPU设备的主要生产商有Intel、AMD(ATI),NVidia和Matrox,作为通用计算设备,且具有较为完善软件开发环境和良好社区生态的是NVidia支持的CUDA体系GPU系列。NVidia GPU主要分为Tesla(2008)、Fermi(2010)、Kepler(2012)、Maxwell(2014)和最新的Pascal(2016)架构,以及即将推出的Volta(2018)架构。图3显示了自2002年以来,NVidia GPU和Intel CPU在浮点运算性能上的比较,可以看出GPU经过几代的发展其浮点运算能力远远高于CPU。


    图3  NVidia GPU和Intel CPU的浮点运算性能对比

            不同架构的NVidia GPU其流处理器(SM, Streaming Multiprocessor)结构和数量均不相同,片上存储单元的布局和带宽分配也不一样,导致其性能和适用性上稍有区别。典型的SM含有8~32的SIMT执行宽度。每个SM中包含私有L1数据缓存,只读纹理缓存、常量缓存和低访问延迟的共享内存。每个内存控制器(MC)有一列片上L2缓存来加速对片外高速缓存数据的访问。此外CUDA核心内有如浮点数单元(FP Unit),整数单元(INT Unit)等更小的组件,图4显示了典型的流处理器结构。


    图4  NVidia GPU典型的流处理器SM结构


            在科学计算领域最先进的是2016年发布的NVidia Tesla P100(图5),搭载Pascal架构的GP100处理器,其单精度浮点能力达10.6 TFLOPS;采用160GB/s带宽的NVLink专用互联接口;片外采用HBM2高速缓存,具有720GB/s带宽,HBM2内存采用SECDED差错控制编码(ECC),在保证数据安全的同时不占用内存带宽和存储空间。P100还支持统一内存寻址和计算优先。且虚拟地址空间扩展至49bit,支持最高512TB的统一地址;计算优先允许其在指令级的粒度上计算任务可以被抢占,可以阻止长时间独占系统或超时的应用。



    图5  NVidia P100的NVlink版本实物图


            GP100处理器含有6个GPC,每个GPC含10个SM;每个SM包括64个单精度的CUDA核心(图6中深色块)、32个双精度的CUDA核心(图1.6中浅色块)和4个纹理单元;每个MC连接512KB的L2缓存,共4096KB;各SM分别有独立的64KB共享内存(Shared Memory)。  


    图6  NVidia P100处理器逻辑结构图

    GPU在通用计算领域的推广


            随着GPU运算能力的提升和软件开发环境的完善,其应用范围逐渐扩大,基于GPU的通用计算作为一个全新领域正在快速发展。目前已有相当的案例在生物信息学、计算化学、金融、数据科学、国防、电子设计自动化、数值分析、天气气候预测等应用领域取得良好的加速效果[24]。同时也催生了针对GPU开发的通用计算工具包的成熟。GPU通用计算在IEEE、SIGGRAPH、SUPERCOMPUTING等国际会议以及Folding@Home等组织的支持下,已经展现出向主流计算的趋势发展。在商业化方面,NVidia也逐步完善了用于GPU开发的CUDA软件开发环境,为GPU通用计算提供了良好的平台。


    图7  GPU在不同领域的加速应用


    (1) 重离子研究中数值模拟的GPU加速

            当前科学计算领域多数数值模拟问题都是数据产生过程,也就是将数据输入设定的模型来模拟科学试验过程。这类运算主要依赖于计算系统的浮点运算能力,而且对运算精度有较高的要求。一般在数值模拟算法中使用双精度数运算。而NVidia提供的Tesla P100和Tesla K80这类双精度运算能力较强的科学计算加速卡成为科学加速的首选。中国曙光高性能计算公司为中科院重离子研究团队提供了搭载8块Tesla P100加速卡的DGX-1方案,得到了70%以上的加速效果,加速了求解重离子研究遇到的难题。

    (2) 卫星通信系统中扩频信号捕获算法的GPU加速

            中国科学院大学的数据挖掘与高性能计算实验室在解决扩频捕获技术上提出了基于滑动相关的并行捕获算法,该捕获算法采用4块NVidia K40c计算卡,相对于Intel IPP的多CPU并行加速,实现了400多倍的性能提升,并具有良好的扩展性。在真实遥测数据的测试实验中,获得了显著的效果。
    在通信领域,诸如调制解调、目标识别、目标追踪等,都能够使用GPU并行计算平台获得很好的加速效果。

    (3) 石油工业勘探中地震资料分析的GPU加速

            工业勘探领域需要对地震波信号等计算资料进行水平叠加、偏移校正等处理,以反映地下地层形态和各种地质现象。为了满足是由勘探中地震波分析的计算需求,曙光团队设计了HC2000异构计算方案,采用天阔W580I GPU服务器,具有1TB内存,搭载4块的NVidia K80加速卡,单节点提供高达24 TFLOPS的单精度计算性能。为了解决地震波运算中高I/O请求,采用56G FDR IB网络,配合自研的ParaStor200并行数据持久系统。同时结合专用的Gridview作业调度环境,充分发挥了GPU异构计算系统的运行效率。







    更多相关内容
  • 弥补复杂事件处理技术(Complex Event Processing,CEP)在大规模事件并行处理、共享事件关联以及整体运行能力优化等方面存在的不足.文中给出了一种进行了时间扩展的有色Petri网检测模型.利用该模型将CEP事件模式原子...
  • 并行处理及分布式系统

    千次阅读 2021-12-24 17:43:45
    什么要并行计算 并行硬件和并行软件 MPI编程 Pthreads编程 OpenMP编程 并行程序开发 CUDA编程基础。 1 什么要并行计算 1.1 什么需要不断提升性能 随着计算能力的增加,我们所面临的计算问题和需求也在增加...

    并行处理及分布式系统

    1 为什么要并行计算

    1.1 为什么需要不断提升性能

    • 随着计算能力的增加,我们所面临的计算问题和需求也在增加
    • 随着技术的进步,我们从未想过的技术得到了解决,比如:人类基因解码、更准确的医疗成像、更快速准确的网络搜索…
    • 更复杂的问题仍有待解决,比如:气候模拟、蛋白质折叠、药物发现、能源研究、数据分析…

    1.2 为什么要构建并行系统

    单处理器性能大幅度提升的主要方法是增加集成电路晶体管密度。但是随着晶体管尺寸的减小,晶体管的传递速度增快,它们的能耗也在增加,大多数的能量是以热能的形式消耗,当一块集成电路变得太热的时候,就会变得不可靠。在 21 世纪的第一个 10 年中,使用空气冷却集成电路的散热能力已达到极限。也就是说,只通过增加集成电路的速度来提升处理器的性能的方法不可取。在这种条件下,集成电路制造商提出多核处理器的思路。

    1.3 为什么要编写并行程序

    大多数为传统单核系统编写的程序无法利用多核处理器,为了使程序能够更快地运行,有更加逼真的图像,就需要将串行程序改写为并行程序。

    1.4 如何编写并行程序

    想要解决某个问题,需要编写其对应的并行程序,首先需要对任务进行划分,确定其属于任务并行还是数据并行。

    • 任务并行:当许多任务或函数可以独立地、大规模地并行执行时,这就是任务并行。任务并行的重点在于利用多核系统对任务进行分配,将待解决的问题所需要的执行的各个任务分配到各个核上执行。
    • 数据并行:当可以同时处理许多数据时,这就是数据并行。数据并行的重点在于利用多核系统对数据进行分配,每个核在分配到的数据集上执行大致相似的数据操作

    1.5 接下来做什么

    首先我会参考《并行程序设计导论》所讲的 C 语言的三种拓展:消息传递接口(Message-Passing Interface,MPI)、POSIX 线程(POSIX threads,Pthreads) 和 OpenMP 来编写基本的并行程序。

    选择并行程序实现框架的时候应该根据计算机的架构来选择,即根据硬件选择软件。Pthreads 和 OpenMP 是为 共享内存系统 的编程而设计的,它们提过访问共享内存的机制;而 MPI 是为 分布式内存系统 的编程而设计的,它提供发送消息的机制。

    图中(a)表示共享内存系统,(b)表示分布式内存系统。

    1.6 并发、并行、分布式

    • 并发计算:一个程序的多个任务再同一个时段内可以同时执行
    • 并行计算:一个程序通过多个任务紧密协作来解决某个问题
    • 分布式计算:一个程序需要与其他程序写作来解决某个问题

    2 并行硬件和并行软件

    2.1 背景知识

    并行计算涉及到两个不同的技术领域:

    • 计算机架构(硬件)
    • 并行程序设计(软件)

    硬件主要的目标就是为软件提供更快的计算速度,更低的性能功耗比,硬件结构上支持更快的并行。
    软件的主要目的是使用当前的硬件压榨出最高的性能,给应用提供更稳定快速的计算结果。

    2.1.1 冯 · 洛依曼结构

    经典的冯 · 洛依曼结构包括存储器、运算器、控制器、输入设备、输出设备,其中运算器和控制器都在 CPU 之中,CPU 和主存通过总线连接。当数据或指令从主存传送到 CPU 时,称为数据或指令从内存中取出或者读出;当数据或指令从 CPU 传送到主存时,称为数据或指令写入或者存入内存中。这样主存和 CPU 之间的分离称为 冯 · 洛依曼瓶颈。

    2.1.2 进程、多任务及线程

    • 进程:正在运行的程序的一个实例。

    • 多任务:通过时间片轮转的方式使人产生多个任务同时执行的错觉。

    • 线程:线程包含在进程中,同一个进程内的线程共享内存和 I/O 设备,利用线程程序员可以将程序划分为多个大致独立的任务。

    2.2 对冯 · 洛依曼模型的改进

    《并行程序设计导论》介绍了三种对冯 · 洛依曼模型的改进措施:缓存、虚拟内存、低层次并行

    2.2.1 缓存(Cache)

    基于访存局部性而设计的 CPU 缓存(CPU Cache)有着比其他存储器更小的访问开销,CPU Cache 通常和 CPU 位于同一块芯片上,访存开销比普通内存小很多。

    局部性原理

    • 访问一个位置之后,接着访问其附近的位置
    • 空间局部性:访问临近的位置
    • 时间局部性:最近访问的位置,在不久的将来还会访问

    CPU Cache 一般分为不同的层(level),第一层(L1)最小但是访问速度最快,更高层的 Cache (L2, L3, …)更大但访问速度较慢。大多数系统采用 3 层 Cache,每层 Cache 中的数据不重合,且都会存放在主存中。

    当 CPU 需要访问数据或指令时,它会沿着 L1 Cache -> L2 Cache -> L3 Cache -> 主存 这条路径查询,若从 Cache 中查询到数据或指令时,则称为 Cache 命中 或 命中;若没有从 Cache 中查询到则称为 Cache 缺失 或 缺失。

    Cache 命中 Cache 缺失

    当 CPU 向 Cache 写数据时,会出现 Cache 中的值与主存中的值不一致的情况,为了解决这个问题,数中介绍了两种方法:

    • 写直达:当 CPU 向 Cache 写数据时,更新主存中的数据。
    • 写回:将 Cache 中的数据标记为 脏数据,当 Cache line 被主存中的新的 Cache line 替换时,脏的 Cache line 会被写入主存。

    在 Cache 设计中,另一个问题是 Cache line 应该存储在什么位置。当从主存中取出一个 Cache line 时,应该把这个 Cache line 放到 Cache 中的什么位置,不同的系统采用不同的方式,这些方式分别为:

    • 全相联:一个新的 Cache line 可以放在 Cache 中的任意位置
    • 直接映射:每一个 Cache line 在 Cache 中都有唯一的位置
    • n路组相联:每个 Cache line 可以被放在 n 个不同的位置中的一个

    当主存中的行能被映射到不同到 Cache 中的不同位置时,需要决定替换或者驱逐 Cache 中的某一行。常用的方案是最近最少使用

    2.2.2 虚拟内存

    如果一个大型的程序或者程序需要访问大型数据集,那么所有的指令或者数据可能在主存中放不下。采用 虚拟内存,使得主存可以作为辅存的缓存。利用时空局部性的原理,只把正在运行程序的活动部分保存在主存中。

    2.2.3 低层次并行

    指令级并行

    指令级并行通过让多个处理器部件或者功能单元同时执行指令来提高处理器的性能。有两种主要方法来实现指令级并行:

    • 流水线:将功能单元分阶段安排。
    • 多发射:让多条指令同时启动。
      • 静态多发射:功能单元在编译时调度
      • 动态多发射:功能单元在运行时调度

    硬件多线程

    硬件多线程为系统提供了一种机制,使得当前执行的任务被阻塞时,系统能够继续其他有用的工作。

    • 细粒度多线程:处理器在每条指令执行完后切换线程,从而跳过被阻塞的线程。
    • 粗粒度多线程:只切换那些需要等待较长时间才能完成操作而被阻塞的线程。
    • 同步多线程:通过允许多个县城同时使用多个功能单元来利用超标量处理器的性能。

    2.3 并行硬件

    利用 Flynn 分类法 对计算机体系结构进行划分:

    分别以数据和指令进行分析:

    • 单指令单数据 SISD (传统串行计算机,386)
    • 单指令多数据 SIMD (并行架构,比如向量机,所有核心指令唯一,但是数据不同,现在 CPU 基本都有这类的向量指令)
    • 多指令单数据 MISD (少见,多个指令围殴一个数据)
    • 多指令多数据 MIMD (并行架构,多核心,多指令,异步处理多个数据流,从而实现空间上的并行,MIMD 多数情况下包含 SIMD,就是 MIMD 有很多计算核,计算核支持 SIMD)

    注:GPU 属于 SPMD,但是其可以使用 SIMD 并行

    计算机架构也可以 根据内存划分:

    • 共享内存系统
      共享内存系统
    • 分布式内存系统
      分布式内存系统

    2.4 并行软件

    负载均衡:将任务在线程或进程之间分配,并使得每个进程或线程获得大致相等的工作量。

    将串行程序或者算法转换为并行程序的过程称为 并行化。某些程序,如果能够通过简单地将会任务分配给进程或线程来实现并行化,我们称该程序是 易并行的

    动态线程

    • 主线程等待工作请求,当一个请求到达时,它会派生出一个新线程来执行该请求。当新线程完成任务后,就会终止执行再合并到主线程中。
    • 资源的有效使用,但是线程的创建和终止非常耗时。

    静态线程

    • 创建线程池并分配任务,但线程不被终止直到被清理。

    • 性能更好,但可能会浪费系统资源。

    非确定性:在任何一个 MIMD 系统中,如果处理器异步执行,那么很可能会引发 非确定性。给定的输入能产生不同的输出,这种计算称为非确定性。

    临界区:一次只能被一个线程执行的代码块。访问临界区的行为应该是 互斥的

    保证互斥执行的最常用机制是 互斥锁 或者 互斥量

    2.5 输入和输出

    为了解决多个进程或线程直接输入或输出的矛盾,需要遵循以下规则:

    • 在分布式内存程序中,只有进程 0 能够访问 stdin。在共享内存程序中,只有主线程或线程 0 能够访问 stdin。
    • 在分布式内存和共享内存系统中,所有进程或线程都能够访问 stdout 和 stderr。
    • 但是,因为输出到 stdout 的非确定性顺序,大多数情况下,只有一个进程或线程会将结果输出到 stdout。但输出调试程序的结果是一个里外,在这种情况下,允许多个进程或线程写 stdout
    • 只有一个进程或线程会尝试访问一个除 stdin、stdout 或者 stderr 外的文件。
    • 调试程序输出在生成输出结果时,应该包括进程或线程的序号或者进程标识符。

    2.6 性能

    线性加速比 T 并 行 = T 串 行 / p T_{并行}=T_{串行}/p T=T/p,其中 p p p 表示程序运行所运行的系统的核数。

    加速比
    S = T 并 行 T 串 行 S=\cfrac{T_{并行}}{T_{串行}} S=TT
    并行程序的效率
    E = S P = T 串 行 p ⋅ T 并 行 E=\frac{S}{P}=\cfrac{T_{串行}}{p\cdot{T_{并行}}} E=PS=pTT
    并行开销的影响
    T 并 行 = T 串 行 / p   +   T 开 销 T_{并行}=T_{串行}/p\ +\ T_{开销} T=T/p + T

    阿姆达尔定律

    除非一个串行程序的执行几乎全都并行化,否则,不论有多少可以利用的核,通过并行化所产生的加速比都会是受限的。

    假设原串行程序所需时间为 T 串 行 T_{串行} T,其中的 α \alpha α 的比例能够并行化,假设并行化的这一部分使用 p p p 个核,则程序中可以并行化的部分的加速比为 p p p。当 p p p 趋于无穷大时,该程序的加速比为:
    S ∞ = 1 1 − α S_{\infty} = \frac{1}{1-\alpha} S=1α1
    假设该程序可并行化部分并行化之后,其整体的加速比为:
    S = T 串 行 α × T 串 行 / p   +   ( 1 − α ) × T 串 行 = 1 α / p   +   ( 1 − α ) S=\frac{T_{串行}}{\alpha\times{T_{串行}}/p\ +\ (1-\alpha)\times{T_{串行}}}=\frac{1}{\alpha/p\ +\ (1-\alpha)} S=α×T/p + (1α)×TT=α/p + (1α)1
    所以可得:
    S ≤ 1 1 − α S\le \frac{1}{1-\alpha} S1α1

    可扩展性

    假设我们运行一个拥有固定进程或线程数目的并行程序,并且它的输入规模也是固定的,那么我们可以得到一个效率值 E E E。现在,我们增加该程序所用的进程或线程数,如果在输入规模也以相应增长率增加的情况下,该程序的效率一直都是 E E E,那么我们就称该程序是 可拓展的

    如果在增加进程或线程的个数时,可以维持固定的效率,却不增加问题的规模,那么程序称为 强可拓展性的

    如果在增加进程或线程个数的同时,只有以相同倍率增加问题的规模才能使效率值保持不变,那么程序就称为 弱可拓展的

    2.7 并行程序设计

    Foster 方法

    • 划分 问题并识别任务:将要执行的指令和数据按照计算拆分为多个小任务。这一步的关键在于识别出可以并行执行的任务。
    • 在任务中识别要执行的 通信:确定前一步所识别出来的任务之间需要执行哪些通信。
    • 凝聚聚合 任务使之变成较大的组任务:将第一步中确定的任务和通信合并成更大的任务。
    • 将聚合任务 分配 给进程或线程:将聚合好的任务分配给进程或线程,还要使通信最小化,使得每个进程或线程得到的工作量大致均衡(负载均衡)。

    3 MPI编程

    分布式内存系统

    MPI 是为 分布式内存系统 的编程而设计的,它提供发送消息的机制。本节将会介绍怎么利用 MPI 使用 消息传递 来对分布式内存系统进行编程。

    3.1 预备知识

    头文件

    #include <mpi.h>
    

    编译

    mpicc -g -Wall -o outputname.out filename.c
    

    执行

    mpiexec -n <number of processes> <executable>
    

    例如:

    mpiexec -n 4 ./mpi_hello.out
    

    运行 mpi_hello.out 文件并开启 4 个进程。

    程序框架

    //...
    #include <mpi.h>
    //...
    int main(int argc, char *argv[])
    {
        //...
        MPI_Init(&argc, &argv);
        //...
        MPI_Finalize();
        //...
        return 0;
    }
    

    通信子

    int my_rank;//进程编号
    int comm_sz;//进程数量
    MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);
    MPI_Comm_size(MPI_COMM_WORLD, &Comm_sz);
    

    其中 MPI 创建,由所有进程组成的通信子,称为 MPI_COMM_WORLD。

    SPMD 程序

    • 单程序多数据流
    • 只编译一个程序
    • 进程 0 做一些不同的事情
    • if-else 结构使程序是 SPMD

    通信

    MPI_Send(send_buf_p, send_buf_sz, send_type, dest, send_tag, send_comm);//q 号进程调用
    MPI_Recv(recv_buf_p, recv_buf_sz, recv_type, src, recv_tag, recv_comm, &status);//r 号进程调用
    

    则 q 号进程调用 MPI_Send 函数所发送的消息可以被 r 号进程调用 MPI_Recv 函数接受,如果:

    • recv_comm = send_comm
    • recv_tag = send_tag
    • dest = r
    • src = q
    MPI_Recv(result, result_sz, result_type, MPI_ANY_SOURCE, result_tag, comm, MPI_STATUS_IGNORE);
    

    当设置 src 为 MPI_ANY_SOURCE 时,该进程接收所有进程发送给他的信息。

    集合通信

    集合通信 不同于只涉及两个进程的 MPI_Send 和 MPI_Recv,它涉及到一个通信子汇总的所有进程。为了区分这两种通信方式,MPI_Send 和 MPI_Recv 常常称为 点对点通信

    4 Pthreads编程

    共享内存系统

    4.1 预备知识

    头文件

    #include <pthread.h>
    

    编译

    gcc -g -Wall -o outputname.out filename.c -lpthread 
    

    执行

    ./filename.out <number of threads>
    

    例如,运行 4 个线程的程序:

    ./filename.out 4
    

    4.2 竞争条件

    当多个线程同时执行时,多个线程执行语句的顺序通常是非确定的。当多个线程试图访问同一个共享资源时,并且其中至少有一个访问是更新操作,这样的访问可能会导致错误,导致结果的不确定性,我们称这种现象为 竞争条件。编写共享内存程序时最重要的任务之一就是识别和更正竞争条件。

    4.3 临界区

    临界区 是一个代码块,在这个代码块中,任意时刻还有一个线程能够更新共享资源,因此临界区中的代码执行应该作为串行代码执行。因此在设计程序时,应该尽可能少地使用临界区,并且使用的临界区应该尽可能短。

    有三种避免对临界区竞争访问的基本方法:忙等待、互斥量和信号量。

    4.4 忙等待

    在忙等待中,线程不停地测试某个条件,但实际上,直到某个条件满足之前,不会执行任何有用的工作。

    但是要注意编译器的优化会影响忙等待的正确执行。

    4.5 互斥锁

    互斥量 是互斥锁的简称,它是一个特殊类型的变量,通过某些特殊类型的函数,互斥量可以用来限制每次只有一个线程能进入临界区。互斥量保证了一个线程独享临界区,其他线程在有线程已经进入该临界区的情况下,不能同时进入。

    4.6 信号量

    产生原因:

    • 忙等待强制顺序线程访问临界区,造成资源浪费。

    • 使用互斥量,顺序由系统自己决定。

    • 在一些应用程序中,我们需要控制线程访问临界区的顺序。

    5 OpenMP编程

    共享内存系统

    5.1 预备知识

    预处理器指令:#pragma

    编译

    gcc -g -Wall -fopenmp -o outputname.out filename.c
    

    执行

    ./filename.out <number of processes>
    

    例如:

    ./omp_hello.out 4
    

    程序

    最基本的 parallel 指令可以以如下简单的形式表示:

    #pragma omp parallel
    

    子句

    许多 OpenMP 指令可以被 子句 修改。使用最频繁的是 num_threads 子句,当时用 OpenMP 指令启动线程组时,可以通过修改 num_threads 子句来启动需要数目的线程。

    6 并行程序开发

    7 代码附录

    梯形积分法 MPI 程序

    矩阵向量乘

    通过数学求和公式计算π

    蒙特卡洛方法计算π

    奇偶交换排序

    展开全文
  • 这篇文章就计算体系结构展开讨论,从计算框架特别是异构系统下的计算模式和并行计算结构设计的角度,分析异构并行计算架构设计和软件编程技术并行计算体系结构 不同层次的并行化设计已成为现代计算体系设计的...

            计算体系包括组成和硬件两个方面,随着计算机系统的发展,逐渐由单个处理器的简单计算系统发展为由多个处理器,甚至多个不同架构处理器组成的复杂计算系统。这篇文章就计算体系结构展开讨论,从计算框架特别是异构系统下的计算模式和并行计算结构设计的角度,分析异构并行计算架构设计和软件编程技术。


    并行计算体系结构


    不同层次的并行化设计已成为现代计算体系设计的推动力量,而能耗和成本是并行化设计的主要约束条件。应用程序中出现的并行模式有数据级并行(DLP)和任务级并行(TLP)。而计算机硬件在实现这两种不同并行模式时常采用指令并行、向量化运算、多线程和并发请求四种方法。这四种方法可追溯至50年前由Michae Flynn于20世纪60年代提出的Flynn分类法,计算系统可以分为如下四类:
    • 单指令单数据(SISD, Single Instruction Single Data);
    • 单指令多数据(SIMD, Single Instruction Multiple Data);
    • 多指令单数据(MISD, Multiple Instruction Single Data);
    • 多指令多数据(MISD, Multiple Instruction Multiple Data)。

    SISD(单指令单数据)硬件不具备并行性,逐条指令串行执行,每次处理一个数据,因此被称为单指令单数据计算系统。早起的计算机均属于SISD计算系统,如采用冯诺.依曼架构的IBM PC机。


    图1  SISD结构示意图

    SIMD(单指令多数据)设备在单个指令控制下能够同时处理多项数据,因此适合于数字信号处理、图形图像处理等向量运算较多的领域。Intel CPU中的MMXTM、SSE、SSE2及SSE3扩展指令集就是完成这类向量化处理工作,过去雷达信号处理领域常用的TS201就属于SIMD处理设备。图形处理器GPU在广义上也属于SIMD设备。


    图2  SIMD结构示意图

    MISD(多指令单数据)设备指同时使用多个指令来对同一个数据进行不同的处理。这种计算结构在发展中只作为理论模型出现而没有实际应用。


    图3  MISD结构示意图

    MIMD(多指令多数据)设备可以同时使用多个指令同时对多个数据进行的处理,也就是众核处理设备,最新的多核计算平台就属于MIMD结构。目前常用的多核心处理器属于MIMD设备,例如目前雷达信号处理领域较常用的C6678处理器和多核CPU。


    图4  MIMD结构示意图


    并发多任务开发模型


    现代计算系统通常包含了多个处理设备,可能是多个同架构或不同架构的微处理器,其间通过高速总线连接,构成一个统一的计算系统,广义上都属于MIMD计算体系。在这样的计算模型下,有一些行之有效软件设计方法和编程架构,主要包括消息传递模型、共享内存模型、流模型和异构混合编程模型。


    消息传递模型(MPI)


            消息传递模型(Message Passing Interface, MPI)是一种基于消息传递的并行编程模型[33]。消息传递作为标准的编程接口是一套可移植API,不同组织依据这套API有不同的实现,包括开源的MPICH、LAM MPI和商用的Intel MPI。在进行并行程序开发时只需要显式的使用相应的应用程序编程接口完成数据和消息的传递工作,而不需要考虑程序在具体硬件运算设备上执行。
    在MPI编程模型中计算任务被拆分为不同的执行单元,各执行单元以独立进程的形式存在,具有完全独立的堆栈空间和程序段。各子任务(进程)间的通信通过MPI API完成,因此MPI标准不仅适用于多线程程序开发,更适用于多进程程序的开发。消息传递的物理实现取决于MPI的具体实现,可以是共享内存方式,也可以是网络连接方式,因此MPI编程模型能够将计算任务分发到不同的运算处理器甚至不同的运算节点上,也就是通常所言的分布式计算。在第五章中讨论的软件化雷达系统从系统顶层结构来看就属于这类分布式系统,可以使用MPI模型完成各运算节点间的逻辑组织。



    图5  MPI系统典型结构示意图

    图5显示了一个典型的MPI分布式系统,以通信域、进程组、上下文标识和数据结构为特征。通信域指定了通信操作上下文以确定其执行范围;不同进程在使用相同的预定义数据结构在同一个通信域中进行消息的发送和接受;各通信域间互不干扰,通过上下文标识进行区分,而属于同一个通信域的所有进程被称为一个进程组。


    共享内存模型(OpenMP)


            共享存储器并行编程模型(Open Multi-Processing, OpenMP)是一种共享存储器的多线程程序设计方法。该模型要求所有存储器均被连接到同一个共享的地址段上,系统中所有处理器可以使用统一编址方式访问这些存储器。由于存储器共享,因此不同处理器间的数据可以被立即交换访问,大大提高了并行多任务处理程序的执行效率。OpenMP为开发人员提供了一种简单而安全的多线程开发方法,无需关心容易出错的线程操作。编程人员能够使用编译指导(Compiler Directing)或运行时库(Runtime Library)完成并行化。编译指导语句不改变程序源代码,在编译阶段完成并行域的识别拆分,具有较高的运行效率但对运行时的支持较少;运行时库需要对程序源代码进行并行优化,破坏了与原有串行程序的一致性,但提供了良好的运行时支持。

     
    图6  OpenMP编程模型示意图

            OpenMP程序从主线程(Master Thread)开始运行,遇到并行域(Parallel Region)后分解成多个子线程开始并行执行。子线程在并行域执行完成后被销毁,程序回到主线程。本文在下述几章的程序设计过程中均使用这种并行设计的方法来提高程序运行效率。


    流模型(Streaming)

    流处理是对不间断数据连续处理的技术,其处理流程采用有向无环图(DAG)描述,DAG是对作业流程的图形表示,用来描述流处理任务的逻辑拓扑。
     

    图7  流处理的DAG描述示意图

    流处理作业系统有原生(Native)流处理和微批(Micro-batch)处理[39]两种实现方式。如图2.8,原生流处理对于一条记录(待处理数据)到达即立即处理,而微批流处理则会按照预定的规则(一般按照时间间隔)划分,积累成数据段进入流处理系统以采用突发方式进行处理。
        

    图8  流处理系统处理流程
    原生流处理(左) 微批流处理(右)

    不同的流处理系统,在运行时、编程模型、函数式原语、状态管理、消息传输保障、容错、性能以及平台的成熟度和接受度方面有很大不同。目前主流的流处理系统主要有Apache Storm,Trident,Spark Streaming,Samza和Apache Flink。
    Apache Storm由Nathan Marz及其团队于2010年在BackType开发,后被Twitter收购于2014年开源至Apache社区并逐渐成为工业标准。Storm属于原生流处理系统,提供低层次API,使用Thrift定义topology,支持包括Scala、Java在内的多种编程语言。
    Trident是对Storm的高层次的抽象,简化了topology构建过程,增加窗口操作、聚合操作或者状态管理等高级操作,属于微批量流处理系统。对标于Storm的至少一次流传输机制,Trident提供了精确一次传输机制。Trident同样支持Java、Scala等编程语言。
    Spark包含Spark SQL, MLlib和Spark Streaming,是目前最受欢迎的流处理框架。由于Spark的运行时(Runtime)是在批处理基础上构建的,因此Spark Streaming也依赖于批处理方式,属于微批流处理框架。Spark Streaming以高层次的声明式API供调用,支持包括Scala和Python在内的多种语言。
    Samza是由LinkedIn公司开发的流处理框架,在基于消息队列的Kafka基础上构建的准实时流处理系统,提供组合式API,以作业作为基本处理流程串联处理。同样支持包括Scala在内的多种编程语言。
    Apache Flink属于原生流处理系统,以高层次API提供给设计人员,也提供批处理方式,其批处理模式的下API与Spark接近,但其批处理原理与Spark不同。Flink将所有数据都抽象为一个流,更接近于现实逻辑。

    表2  主流流处理系统特点比较

    流模型

    Storm

    Trident

    Spark

    Samza

    Flink

    处理方式

    原生

    微批量

    微批量

    原生

    原生

    API

    组合式

    组合式

    声明式

    组合式

    声明式

    传输保障

    至少一次

    精确一次

    精确一次

    至少一次

    精确一次

    容错

    反馈记录

    反馈记录

    RDD检查点

    日志

    检查点

    状态管理

    非内建

    专用操作

    专用流

    状态操作

    状态操作

    延迟

    极低

    吞吐量

    技术成熟度




    异构混合编程模型(MOC)


    本文硬件平台是典型的CPU+GPU异构系统,由于两种处理器的设计思路和实现结构的不同,适合于不同的处理。如下图,程序中的串行部分运行于CPU,而适合数据并行的部分运行于GPU。
     
    图9  GPU加速的异构运算系统

    借鉴图2.10显示的“天河一号”混合编程模式[40],考虑算法运算组件的隔离性和可移植性,通常使用独立进程的方式运行,而算法内部使用CPU多线程并或GPU加速的方式,因此异构系统常采用MPI/OpenMP/CUDA的混合模式,充分利用了MPI在进程间通信优势和便利性以及OpenMP轻量线程组的开发方式,在运算密集部分充分利用GPU的数据并行优势使用CUDA加速[41],保证了MIMD系统的高效性和开发的便利性,不同并行模型优势互补,本文称之为MOC(MPI OpenMP CUDA)模型。这样的异构并行化方式拥有三级并行粒度和存储结构,针对不同的数据和处理类型使用不同粒度的并行方式进行加速以达到最高的性能[32]。
     
    图10  天河-1混合编程模型

    MOC模型在编程上采用如下结构,不同计算任务间采用MPI解决粗粒度的数据传递和结果汇总,在子任务级别上进行了并行和流式设计;计算节点内部采用共享内存的OpenMP屏蔽复杂的线程操作,以轻量级线程组方式解决子模块级别的并行加速问题;而最高效的数据并行则采用CUDA加速。这种并行模型由于拆分合理、结构灵活而不受制于设备数量,具有良好的扩展性和通用性,非常适合第五章的软件化框架设计[33]。
     
    图11  MOC混合编程模式下的三级并行粒度

    GPGPU并行计算及CUDA架构


    GPGPU编程模型


    由于GPGPU的广泛应用,各厂商和组织为其开发了众多编程模型和设计框架,主流的有NVidia的CUDA,AMD的steam,微软的C++ AMP以及开源的OpenCL和OpenACC等。

    (1) OpenCL


    开放运算语言(Open Computing Language, OpenCL)是第一个兼容通用的开源开发平台标准,由Apple联合AMD、IBM、Intel、NVidia开发,其目的是统一CPU、GPU、DSP、FPGA等所有硬件加速设备组成的异构计算平台[44],提供统一的并行程序开发标准。
     
    图14  OpenCL框架

    OpenCL框架由平台接口、运行时接口和内核编程语言组成。平台(Platform)包含宿主机(Host),运算设备(Device)和框架(Framework),多个平台可共存于同一计算系统内;平台API的作用是为运行时创建运行上下文(Context);运行时(Runtime)为使用上下文的各种功能提供了调用接口,其首要任务是为硬件设备建立运行于主机或设备内的命令队列,提供内核对象、程序对象和存储器对象的调用依据。内核编程语言是C99标准的扩展集,用于编写直接控制硬件运算的内核代码,即运行于对应设备上的函数,该函数遵循SIMT编程模型,为运算任务指定了工作项(Work-item)、工作组(Work-group)和ND区域(ND-range)。
     
    图15  OpenCL编程模型

    (2) CUDA


    统一计算设备架构(Compute Unified Device Architecture, CUDA)是由NVidia推出的GPU计算框架,该框架兼容OpenCL编译器和NVidia自定义C99扩展集,可以被编译为PTX代码交由GPU进行计算。在逻辑结构上CUDA将GPU硬件抽象为并行线程[47],而不需要将数学运算映射到图形API,极大的方便了并行程序设计。CUDA拥有极其丰富的编程语言支持和运算库,大大方便了高层次的算法设计开发。
     
    图16  CUDA编程框架的生态环境

    CUDA由开发库、运行时环境和驱动组成。开发库包含了CUDA提供的各种应用支持,以API的形式提供给开发人员;运行时环境提供丰富的API以对接底层设备和运行时,包括存储器管理、设备管理、运行调度等;驱动通过对GPU硬件抽象对上提供了软件访问接口,图2.17显示了这三者和应用程序的关系。
     
    图17  CUDA体系结构的组成


    (3) OpenACC


    为统一加速器并行软件开发环境,解决如CUDA、OpenCL等低层次语言在硬件隔离上的不彻底带来的编程难度,PGI、Cray、CAPS和NVidia四家公司联合制定了OpenACC应用编程接口标准,该标准借鉴了PGI Accelerator编程模型,同时融入了CUDA相关术语,在标准行文上与OpenMP相似[46]。
    目前大多数的算法描述都针对于串行处理结构,因此在人工并行化时不仅需要对算法的运算原理和实现细节有非常深入的了解,而且需要对并行硬件平台及其软件架构的映射关系也有充分理解,才能有针对性的对算法进行并行化重设计以适应特定的并行硬件平台和软件框架,然而这种跨领域人才的缺失严重阻碍了并行计算在各领域的拓展,而OpenACC使用并行导语解决了这个矛盾。
     
    图18  OpenACC的导语并行模式

    OpenACC使用导语设计模式,允许编译器根据开发者在原有的串行代码上添加的编译导语产生低层代码,而开发者无需了解相应加速器的硬件结构即可完成程序的并行化设计,在不破坏原代码的前提下获得了良好的加速效果,相比于CUDA和OpenCL等低级语言显著提高了开发效率。由于OpenACC在设计初期就考虑了平台兼容性,因此同一份代码只需要经过重新编译即可无痛移植到不同的加速器平台。
     
    图19  OpenACC在多平台上的一致通用性


    统一计算设备架构CUDA

    CUDA作为高层并行计算平台和编程模型,提供对NVidia GPU的高层次抽象,以利用GPU众多的处理单元进行高效数值计算。本节从编程模型、线程结构、存储结构和程序结构四个角度探讨CUDA的特性。

    (1) 弹性编程模型


    GPU在开发应用软件上的挑战是如何透明地扩展其运算规模以利用越来越多的处理器核心。CUDA并行编程模型采用三个关键的抽象[48]:线程组、共享存储和屏障同步的分层结构,解决了这个问题。
    这种分层次抽象引导程序员将问题划分为逐个可解决的子问题,并将子问题进一步划分为一组线程可以协同解决的精细处理片段,并解决每个子问题时保持语言描述能力,并且同时实现自动可伸缩性[49]。可以并发或顺序地在GPU内的任何可用多处理器上调度每个线程块,使编译的CUDA程序可以在如图2.20所示的任意数量的多处理器上执行。
     
    图20  CUDA的弹性编程模型

    (2) 线程结构


    并行程序以线程为基础单元,而线程束(warp)是GPU上线程组的最小单位,同一个线程束中的线程同步执行。一条指令只需要被读取一次就可以广播给同一个线程束中的所有线程,因此CUDA的指令运行模式被称为单指令多线程模式[50]。
    线程根据最合适的数据共享方式被分为一维、二维或三维的线程块(Block),同一线程块中的线程必须位于同一流多处理器中,其线程间可通过Share Memory交换数据。线程块被组合为线程网格(Grid),网格中的线程块的数量由程序的并行设计需求确定而不受制于物理处理器的数量。线程由三维变量threadIdx标识,可以使用1D、2D或3D索引来识别线程,线程的索引及其ID以线性方式彼此对应。
     
    图21  GPU的线程模型

    这种分层的线程结构决定其应用的并行方式的两个层次:块间粗粒度并行和块内线程间细粒度并行。
    细粒度并行:细粒度并行指块内线程并行,块内线程可通过Share Memory通信,并可使用同步命令__syncthreads()进行节奏同步,同时CUDA允许开发人员定义块内线程的结构。
    粗粒度并行:粗粒度并行指块间并行,块间可以通过Global Memory通信,而线程块组成线程网格,同样CUDA允许开发人员定义线程网格的结构。

    (3) 存储结构


    CUDA设备拥有多个不同层次的存储器:全局内存(Global Memory)、本地内存(Local Memory)、共享内存(Share Memory)、常量内存(Constant Memory)、纹理内存(Texture Memory)和寄存器(Register),这些存储器的开放级别和访问规则均不相同[51]。每个线程有私有本地缓存和寄存器;每个线程块有共享内存,共享内存对块内线程可见;全局存储器对所有线程可见;常量内存和纹理内存是两个对所有线程可见的只读存储器。纹理内存可提供特殊的格式转换和寻址模式,可进行一些数据过滤操作。全局内存、常量内存和纹理内存与CUDA上下文具有相同的生命周期,可被多个核函数使用。
     
    图22 CUDA的存储器模型


    (4) 程序结构


    CUDA采用异构编程方式,主机(CPU)和设备(GPU)分别有各自的存储器,主程序由CPU执行,当遇到描述数据并行的核函数(Kernel),将被编译成设备代码传送到GPU由多个CUDA线程并行执行。主程序调用核函数时须进行执行配置,以确定该核函数执行的线程结构和存储器分配。
     
    图23 CUDA框架的主从程序结构

    CUDA框架将主机代码和设备代码混合在同一工程中,由编译器和处理器进行区分,并分别编译为不同的执行文件[56]。nvcc将把两部分代码做预编译处理,使用不用的编译工具链进行编译链接,形成不同的二进制执行文件在不同平台上执行。
     
    图24 CUDA混合应用程序的编译链接流程

    CUDA提供Runtime API和Driver API两套封装。Driver API支持对底层硬件更加细致的控制,其调用硬件速度比Runtime API快且向后兼容,但两种API对于常见功能都有实现。在Runtime API接口之上,NVidia提供众多软件加速库,包括c++ STL的并行实现thrust API、blas并行实现cublas、FFTW并行实现cuFFT等。
     
    图25 CUDA的软件层次

    基于GPGPU的异构并行计算平台


    本文异构并行运算平台采用CPU、GPU和FPGA共同协作完成计算密集型处理,三者通过PCI-e总线连接,CPU、GPU和FPGA拥有各自的存储系统,其间通过DMA操作实现数据的传递。这里CPU采用高性能的Intel至强多核系列,高速DDR4作为片外高速缓存;GPU采用NVidia高性能计算专用卡K80,以GDDR5作为片外高速缓存;FPGA采用Xilinx的K7系列,挂载DDR3作为高速片外缓存。采用SATA SSD组成的RAID阵列作为持久性数据存储介质,通过高性能RAID控制器接入PCI-e总线系统。对外接口采用千兆以太网和多通道自定义光纤,实现控制命令、处理结果合原始数据传输通道,平台采用如下结构:


    图26  使用GPU加速的通用高性能计算平台

    计算平台由商用1U机箱承载,具有CPU计算核心24个,CUDA计算核心4992个,DDR4内存64GB,GDDR5内存24GB,DDR3内存4GB,磁盘阵列采用8块SATA SSD组成的RAID5阵列,具有最高2.4GB/s的存取带宽,4.8TB的存储容量,兼顾了高速大容量存储的存储需求和数据安全,具有4组PCIe 3.0 x16总线接口,具有32GB/s的高速传输带宽。以24组最高5Gbps的可变速率光纤通道作为外部传输总线,4路千兆以太网用作外部控制和结果报送,兼顾了高速原始数据的出入和控制通路的灵活性。高性能通用计算平台具有全软件定义、网络中心控制、可扩展、可重配置、多功能、集成化、一体化等众多特点,是应用软件化信号处理的良好平台。
    由于雷达信号数据率较大,并考虑到现有雷达前端多采用自定义光纤通道,本系统采用自定义光纤采集卡实现高带宽数字信号数据传输。自定义光纤通道具有可定制性强、带宽高、稳定性高和可靠性高等优势。当雷达信号进入采集卡后,由FPGA进行合并和原始数据解析,通过板载缓存进行数据缓冲,避免由于系统调度或吞吐量波动导致的数据丢失和数据溢出。由主机控制逻辑将数据通过PCIe接口传输至系统内存或采用GPU Direct技术直接进入GPU计算卡上高速存储器中。
    光纤采集卡采用PCIe 2.0 x8接口设计,具有理论4GB/s,实测2.89GB/s的传输带宽。采集卡数据经系统内存可以同时分发给RAID阵列和GPU计算卡,多个模块间工作相互独立、并行工作,可以实现原始数据的同步存储和实时信号处理。RAID阵列卡可以将大吞吐量的雷达信号数据进行缓冲并带有冗余地写入多个磁盘中,既保证了写入的速度,也保障了数据安全性。目前SATA SSD能够达到450MB/s的速度,且相比过去的机械硬盘极大地减少了寻道时间。同步的雷达信号存储将有利于研究数据积累,存储的原始数据能够给算法开发提供大量可靠的实际数据来源。便于未来研究过程中的数据回放、数据仿真、系统模拟运行等功能。
     
    图27  计算平台上的典型数据流程和控制流程

    上图显示了在本软件化通用信号处理系统中典型数据流框图,绿色代表存储数据流,红色代表运算数据流,蓝色代表控制和结果数据流。GPU计算卡执行高度优化后的并行算法,随后通知雷达系统控制逻辑,数据通过PCIe通道被读取至系统内存,交由CPU进行下一步处理。GPU计算卡多用于多线程并行数据计算,CPU上算法的开发相对较为灵活,并且擅长于分支跳转等处理,对于数据量小、并行性不高、分支判断复杂的逻辑处理具有GPU无法比拟的优势。后期雷达信号处理,如航迹显示、目标跟踪、雷达数据记录等均可由CPU进行处理,少量大粒度的并行计算可以通过多线程技术在多路多核芯主板上提升系统计算性能[4]。同时也可以由CPU控制将其通过千兆以太网汇总至雷达显控终端。
    在现有市场条件下如上所述的软件化信号处理平台在纯商用设备上实现(表2.2),采用AMAX XG-23201GK机架式服务器一台,主要运算部件为两颗Intel E5-2643v3和NVidia Kepler K80加速卡,配备内存64GB,采用2U标准服务器机箱承载。

    表2  COTS通用计算平台产品清单

    品名

    类别

    说明

    单机部件

    AMAX XG-23201GK

    处理器

    Intel Haswell E5-2643v3

    2

    缓存模块

    8GB DDR4 2133MHz ECC Reg

    8

    存储模块

    2.5" Intel SSD S3510 800G/SATA

    8

    计算模块

    NVidia Kepler K80

    1



    异构平台并行编程及优化技术


    基于上节描述的硬件平台,本文采用独立存储器的异构编程方式,基于总线的通信方法,将三种差异性较大的平台,多核CPU、GPU和FPGA,尽可能的解耦合,减少不同平台间的数据通信,在有限的通信带宽下节约通信时间。
    混合编程部分主要是多CPU和多GPU,对于CPU部分采用OpenMP的共享内存并行编程方式,OpenMP由编译指导语句、运行时库函数组成。对于GPU加速程序,采用NVidia的CUDA框架进行设计。官方提供了不同层次的API供开发者使用,CUDA的内核编程语言作为标准C99的扩展子集,可以让开发人员快速上手开发。下图显示了CUDA针对于不同语言的编程接口和不同级别的应用程序接口。
     
    图28 采用CUDA加速的异构平台编程框架

    基于CUDA的GPU并行应用程序,其执行流程可归纳为下载数据、执行核函数、上传结果三大步骤。具体来说有如下图显示的四个处理流程能:分配主机内存和设备内存。将运算数据从主机内存拷贝至设备内存。加载、启动核函数并执行运算。将设备内存中的运算结果拷贝回主机内存。根据运算流程,CUDA应用程序的性能瓶颈主要在访存带宽、主机接口带宽和指令吞吐量三个方面。下面就基于Tesla架构下CUDA程序的优化在这三个方面做出说明。
     
    图29 CUDA架构编程模型

    CUDA架构并行程序优化的目标是在最短时间、允许误差下完成运算任务[59]。这里“最短时间”特指数据吞吐量,而不是数据延迟。下面就影响程序加速性质的三个方面分别给出说明。

    并行运算量影响加速性能


    运算量的大小决定了指令吞吐量和I/O时间的隐藏。计算量过小导致GPU长时间处于空闲状态以等待数据I/O,因此小计算量的程序在性能上主要受限于指令吞吐量和IO操作的瓶颈[60]。具体来说,应用程序进行GPU加速后需要花相对大量的时间把数据从主机内存拷贝到设备内存,却只花了极少的时间用于数据的处理。这样的程序运行速度显然受限于PCIe的主机连接带宽。从另一方面来讲,算法的运算量中能够得到有效加速的部分是算法可并行部分,可并行部分占整个程序运行时间的比例决定了加速效果的上限,根据Amdahl定理,在固定负载(即运算总量不变)的前提下,公式(2-1)定义了程序的加速比。
      (2-1)
    其中, 为串行部分时间; 为可并行部分串行运算的时间; 为处理器数量,这里可以理解为CUDA线程数量。
    定义 为串行部分占比:
      (2-2)
    其中 为程序运行总时间。
    那么在理想情况下,并行化后程序的理想上界为:
      (2-3)
    实际情况下,并行化后需引入数据转存、同步、归约、通信等额外开销,假设额外开销时间为 ,那么实际中并行化后程序的加速比为:
      (2-4)
    显然可并行部分占比越大,加速比上界越高;并行中可隐藏的额外开销时间越多,加速比上界越高[62]。这需要待优化的程序具有良好的可并行性,且可并行部分的运算量足够大以使并行化后的运算时间足以隐藏额外开销时间。


    高精度处理影响加速效果


    目前的GPU架构更擅长于进行单精度甚至半精度处理,而高精度的运算则较为受限,同时除法、求模、求余数等运算的指令吞吐量也较低。然而在科学计算中往往需要更高的计算精度以保证数值安全和迭代的收敛性。这时需要权衡运算精度和加速效果。根据Gustafson定律,在使用相同数量的并行处理设备的前提下,要获得更高的运算精度,需要花费更多的时间。这种模型下运算加速比可定义为如下形式。
      (2-5)
    这意味着加速比与并行处理器(CUDA线程数)的增加是线性的,同样在考虑额外开销的前提下可得实际加速比为:
      (2-6)
    理论上这个加速比是不存在上限的,但实际系统中,受限于系统可提供的并行处理器,在CUDA中也就是线程数量的限制。

    微批处理造成延迟


    在现行的CUDA版本中线程最小的执行单元是一个wrap,即32个线程同步开始工作,对于确定运算量的算法CUDA更希望以2.2.3节中描述的微批量的流模式进行运算。而根据系统实时性要求选择合理的微批长度称为影响算法实现性能、实时性和吞吐量的重要指标。根据Sun-Ni定理[64],在存储器可增加的情况下,增加微批大小以获得更高的单次运算密度,从而提高整体吞吐量,能够获得理论加速比如公式(2-7)所示,但是随之带来的缺点是更大的运算延迟,加速比可定义为如下形式。
      (2-7)
    其中G(p)表示存储器增加p倍后增加的运算量。
    因此微批大小的选择需要更具实际系统的实时性指标,在运算延迟能够满足实时性要求的前提下尽可能选择较大的微批规模,这样有助于提高运算、I/O比,减少数据传输交互次数,提升整体性能。

    2优化总结


    在需要较大运算吞吐量的系统应使用GPU进行加速处理,而对于实时性和吞吐量均由严格要求的系统,则需要ASIC、FPGA等逻辑实现才能满足要求,但是会带来更高的开发成本核研制周期。
    综上所述,对于充分优化的CUDA程序具有如下几个特点:给定数据规模下,并行算法计算复杂度不显著高于传统最优算法。有足够的并行线程以获得高指令吞吐量。恰当了选择了合理的分级存储以获得最高的IO带宽。
    因此,CUDA程序的开发和优化可遵循如下步骤进行:
    1. 分解计算任务重的串行部分和可并行部分,对运算任务进行重新划分以确定使用的并行算法。
    2. 按照任务划分确定数据的切割方式,设计实现高效并行算法确保获得较高的指令吞吐量。
    3. 按照以上初步思路编写结果正确的并行程序作为优化的起点,确保正确使用存储器栅栏、线程同步等技术保证数据产品的准确性。
    4. 利用寄存器、共享内存、纹理内存等技术优化访存,避免访存带宽成为性能瓶颈[65]。在访问瓶颈问题解决之前,更细致的优化方式很难取得理想的效果。
    5. 通过线程标记、循环展开、原子操作、合理的同步等技术优化指令流,以获得最高的指令吞吐量[66]。
    6. 调整存储资源分配,保证每个线程的数据使用量以确保在SM中有足够的线程在运行而不受制于资源不足而需要上下文切换导致性能损失[67]。
    7. 由于与主机之间的PCIe带宽远比于主频和缓存速度小,因此需要优化主机通信以减少CPU和GPU之间的数据传输或者通过流式处理方式[68]隐藏数据传输时间以获得更高的运算效率。
    8. 在极端情况下可以使用PTX汇编编写算法的关键部分,以对访存方式和指令吞吐量有细致的控制。







    展开全文
  • 在声纳、雷达、图像和语音等领域经常需要对海量数据进行并行、实时处理,除了信号的内容、形式处理算法等有所不同外,通常可采用相同的硬件平台进行处理。而目前国内在声纳、雷达和图像等领域一般都各自独立进行...
  • 在分析EC上点乘操作的基础上,构造了MSB方式下局部并行线性systolic结构的模乘递推形式,设计了具体的单元结构,给出了性能分析和模拟比较结果。实验证明MSB方式下局部并行、域多项式可变的阵列结构能适应多种EC上模...
  • 流水线与并行处理概述

    千次阅读 2019-10-16 21:18:59
    ①计算时间:处理器或电子系统处理一个问题时,第一个计算的开始于最后一个计算的结束之间的时间间隔称为计算时间; ②流水周期:一个处理器中两次连续计算之间的时间间隔称为流水周期,流水速率是是流水周期的倒数...
    1. 基本概念
      ①计算时间:处理器或电子系统处理一个问题时,第一个计算的开始于最后一个计算的结束之间的时间间隔称为计算时间;
      ②流水周期:一个处理器中两次连续计算之间的时间间隔称为流水周期,流水速率是是流水周期的倒数;
      ③块流水周期:处理器连续处理两个问题时两次起始时刻的时间间隔称为块流水周期;
      ④阵列尺寸:阵列中处理器(单元、门电路)的数目;——决定了硬件成本
      ⑤I/O通道:与外部(主机)进行通信的I/O线数;——I/O通道决定了通信带宽
      阵列尺寸与计算时间的乘积可用于度量硬件的设计效益
      在这里插入图片描述
      ⑥关键路径
      组合电路的关键路径定义为信号输入与输出之间的最长路径;
      时序电路的关键路径定义为任何两个存储单元(或者延迟单元)之间的最长路径;
      对既有组合电路又有时序电路的系统,关键路径指最长路径。
      ⑦时钟周期:由关键路径的运算时间决定;
      ⑧吞吐率:信号处理系统每秒处理的样点个数;
      ⑨采样周期:吞吐率的倒数;
      ⑩迟滞:产生输出的时间与系统接收对应输入的时间之差;
      对于只有组合逻辑的系统,迟滞通常按绝对时间单位或者门延迟数来表示;
      对于时序系统,迟滞通常按时钟周期的数量来表示;

    流水线变换导致关键路径的缩短,从而可以提高时钟速度或采样速度,或者在同样采样速度下降低电压(功耗)
    在这里插入图片描述

    在并行处理中,对个输出在一个时钟周期内并行地计算,有效采样速度提高到与并行级数相当的倍数

    实例:考虑三阶FIR滤波器
    在这里插入图片描述
    在这里插入图片描述
    仅当不等式(2.2)满足时才可以直接使用上述直接形式的FIR滤波器结构。
    对于某些实时使用要求较快的输入速率(采样率),这个结构就不能用了!

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    展开全文
  • 并行处理技术(parallel computer system)

    千次阅读 2009-04-08 23:55:00
    并行处理技术模型 并行处理技术是40年来在微电子、印刷电路、高密度封装技术、高性能处理机、存储系统、外围设备、通信通道、语言开发、编译技术、操作系统、程序设计...并行处理技术主要是以算法核心,并行语言
  • 并行计算与分布式处理的区别

    千次阅读 2017-06-09 15:29:42
    一、一些概念 ... 超线程技术的目的是提高物理处理器的利用效率,开销是模拟的多个逻辑处理器在工作切换时,有不少的数据保存和恢复工作,因此实际处理性能的提升要弱于多核CPU的多个物理处理器;双核CPU的两
  • DDS同 DSP(数字信号处理)一样,是一项关键的数字化技术。DDS是直接数字式频率合成器(Direct Digital Synthesizer)的英文缩写。与传统的频率合成器相比,DDS具有低成本、低功耗、高分辨率和快速转换时间等优点,...
  • 并行计算与集群技术

    千次阅读 2020-12-26 16:21:19
    它的快速发展其他技术、的发展提供了重要的支撑。云计算关注的两个要点是计算力和存储力,而计算力依赖的技术就 是并行计算,因此学习云计算需要了解并行计算的概念和分类。集群技术并行计算的基础,也是云计算...
  • 并行计算与云计算有什么关系?

    千次阅读 2021-06-29 06:08:39
    在概述并行计算和云计算与什么关系之前,我们有必要先阐述一下并行计算、云计算等相关的概念,是大家对本文的内容能够理解更加透彻。1、并行计算并行计算其实早就有了,所有大型编程语言都支持多线程,多线程就是一...
  • 最后,该系统的底层实现通过执行轻量级的数据分组复制、分布式的并行分组转发和负载均衡后的数据分组合并来支持网络功能的并行处理。基于DPDK技术,在Linux容器中实现了该系统的原型机。通过实验验证可知,该系统能...
  • Spring batch教程 之 扩展与并行处理

    万次阅读 2017-04-05 10:37:30
    很多批处理问题都可以通过单进程、单线程的工作模式来完成, 所以在想要做一个复杂设计和...当你准备使用并行处理技术来实现批处理作业时,Spring Batch提供一系列选择,本章将对他们进行讲述,虽然某些功能不在本章中涵
  • 提出一个基于MapReduce的并行视频编码架构, 将源视频切分后以任务的形式分发到不同的处理器上并行地进行编码处理, 以达到提高编码速度的目的。使整个任务的完成时间最短并平衡负载, 系统综合考虑视频编码特点及...
  • 本节书摘来自华章计算机《深入理解大数据:大数据处理与编程实践》一书中的第1章,第1...1.1.1 并行计算的基本概念随着信息技术的快速发展,人们对计算系统的计算能力和数据处理能力的要求日益提高。随着计算问题规...
  • 11.4.6 深度优先分支定界搜索的并行形式 11.4.7 IDA*的并行形式 11.5 并行最佳优先搜索 11.6 并行搜索算法的加速比异常 11.7 书目评注 习题 第12章 动态规划 12.1 动态规划概述 12.2 串行一元DP形式 ...
  • 并行计算的一些思考与总结

    千次阅读 2020-02-17 14:36:15
    一般的串行程序中为SISD,即在单核CPU下任何时间和地点只有一个指令处理一个数据,其所谓的多线程实际上是采用时分方法,以使人感觉是在同时运行 而现在大多数多核计算机一般MIMD,操作系统复杂多线程或进程的...
  • 并行数据库技术分析与发展展望

    千次阅读 2014-12-17 11:51:29
    在维基百科上,并行数据库被定义通过并行使用多个CPU和磁盘来将诸如装载数据、建立索引、执行查询等操作并行化以提升性能的数据库系统。其中最重要的关键词是并行。 在组成大规模计算机集群的时候,通常有两种...
  • 并行Java技术的发展水平Javascript被定义单线程编程和执行模型,但是存在几种并行Javascript的独立设计和实现,涵盖了一系列功能。 该列表旨在捕获并行Javascript的最新技术,并启用诸如共享内存之类的技术。 这是...
  • 一、概述 大数据领域的两大难题: 1、存储 2、处理 解决方案:Hadoop解决类存储和处理...以键值对的形式来进行数据的输入和输出,它将待处理的数据集分解多个小的键值对来处理。MapReduce编程模型将复杂的并行计算过
  • 每一层分别对应在CMP-CLUSTER混合并行计算 环境概念模型下进行并行处理的某一个特定的目的和步骤。 针对本文提出的并行编程模型中的每一层,本文都研究了相应的简化并行编 程实现的方法、技术和工具,以帮助在混合...
  • OpenMP并行编程

    千次阅读 2022-03-22 17:02:27
    编译器根据程序中添加的pragma指令,自动将程序并行处理,使用OpenMP降低了并行编程的难度和复杂度。当编译器不支持OpenMP时,程序会退化成普通(串行)程序。程序中已有的OpenMP指令不会影响程序的正常编译运行。 ...
  • 1.大数据环境下的数据处理需求 在大数据环境下数据来源非常丰富且数据类型多样,存储和分析...对依靠并行计算提升数据处理速度方面而言,传统的并行数据库技术追求高度一致性和容错性,根据CAP理论,难以保证其可用...
  • 前言:最近再搞个PCIe的高速串行总线的项目,关于串行和并行数据的传输到底谁更快,分别有哪些优势和劣势呢等等一些问题现在做个整理,是对自己学习的一个记录,同时呢,也刚刚想入门的或者对高速串行总线有些误解...
  • 【JAVA高级技术】Java 处理结构化数据多种解决方案

    万次阅读 多人点赞 2022-04-23 23:07:18
    Java 处理结构化数据多种解决方案
  • 云计算中的并行计算技术分析

    千次阅读 2015-06-19 09:31:09
    本文阐述了并行计算和云计算的关系,简要回顾并行计算的历史,分析了并行计算的重要技术OpenMP、MPI和Erlang,研究了这些技术在中国电信的应用方法,并介绍了中国电信实施云计算、并行计算的指导思想、原则和策略。...
  • 针对构件化的路由交换平台设计,提出硬件基础构件的抽象模型及其内部处理流程的形式化描述,提取出顺序、并行、分支以及聚合4种原子组装机制,用于构建更高层次的复合构件,并推导出复合构件抽象模型及其处理流程的...
  • 模型并行( **model parallelism** ):分布式系统中的不同机器(GPU/CPU等)负责网络模型的不同部分 —— 例如,神经网络模型的不同网络层被分配到不同的机器,或者同一层内部的不同参数被分配到不同机器;...
  • 并行算法】知识点总结

    千次阅读 2021-01-05 21:48:58
    完成此项处理的计算机系统称为并行计算机系统,它是将多个处理器(可以几个、几十个、几千个、几万个等)通过网络连接以一定的方式有序地组织起来(一定的连接方式涉及网络的互联拓扑、通信协议等,而有序的组织则...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 123,064
精华内容 49,225
热门标签
关键字:

并行处理技术的形式为