精华内容
下载资源
问答
  • GPU编程与优化 大众高性能计算(高清完整版) pdf 版。 本书第一篇系统地介绍GPU编程的相关知识,帮助读者快速入门,并构建GPU知识体系;第二篇和第三篇给出大量实例,对每个实例进行循序渐进的并行和优化实践,为读者...
  • GPU编程

    2021-01-25 15:52:23
    最近需要使用gpu进行并行计算, 自身技术栈只会Java,之前没有这方便的经验,只能从0开始调研和研究 CPU: 中央处理器(CPU,Central Processing Unit)是一块超大规模的集成电路。 CPU的结构主要包括运算器(ALU,...

    最近项目需要使用gpu进行并行计算, 自身技术栈只会Java,之前没有这方便的经验,目标是尽量使用java编写GPU程序,只能从0开始调研和研究

    CPU:

    中央处理器(CPU,Central Processing Unit)是一块超大规模的集成电路。

    CPU的结构主要包括运算器(ALU, Arithmetic and Logic Unit)、控制单元(CU, Control Unit)、寄存器(Register)、高速缓存器(Cache)和它们之间通讯的数据、控制及状态的总线

    简单来说就是:计算单元、控制单元和存储单元。

    所以一条指令在CPU中执行的过程是这样的:读取到指令后,通过指令总线送到控制器(黄色区域)中进行译码,并发出相应的操作控制信号;然后运算器(绿色区域)按照操作指令对数据进行计算,并通过数据总线将得到的数据存入数据缓存器(大块橙色区域)

    其核心就是:存储程序,顺序执行

    因为CPU的架构中需要大量的空间去放置存储单元(橙色部分)和控制单元(黄色部分),相比之下计算单元(绿色部分)只占据了很小的一部分,所以它在大规模并行计算能力上极受限制,而更擅长于逻辑控制。

    GPU:

    能不能把多个处理器放在同一块芯片上,让它们一起来做事,这样效率不就提高了吗?没错,GPU便由此诞生了。

    GPU的构成相对简单,有数量众多的计算单元和超长的流水线,特别适合处理大量的类型统一的数据。

    GPU的工作大部分都计算量大,但没什么技术含量,而且要重复很多很多次。

    但GPU无法单独工作,必须由CPU进行控制调用才能工作。CPU可单独作用,处理复杂的逻辑运算和不同的数据类型,但当需要大量的处理类型统一的数据时,则可调用GPU进行并行计算。

    GPU中有很多的运算器ALU和很少的缓存cache,缓存的目的不是保存后面需要访问的数据的,这点和CPU不同,而是为线程thread提高服务的。如果有很多线程需要访问同一个相同的数据,缓存会合并这些访问,然后再去访问dram

    GPU编程:

    gpu的出现标志者着进入了无限计算时, 各种GPU编程也相继出现,

           CUDA(Compute Unified Device Architecture)是显卡厂商Nvidia于2007年推出的业界第一款异构并行编程框架。在Nvidia的大力支持下,CUDA拥有良好的开发环境,丰富的函数库,优秀的性能。但是CUDA只能被用于在Nvidia的显卡上进行异构编程,有先天的局限性。

          OpenCL (Open Computing Language) 是业界第一个跨平台的异构编程框架。它是Apple领衔并联合Nvidia,AMD,IBM,Intel等众多厂商于2008年共同推出的一个开放标准,由单独成立的非营利性组织Khronos Group管理。Nvidia自己独家的CUDA显得很封闭。我们可以把OpenCL在异构编程上的地位与OpenGL和OpenAL类比,这两个标准分别用于三维图形和计算机音频。

          C++ AMP(Accelerator Massive Parallelism)是专为设计支持C++的异构并行模型。因为CUDA与OpenCL比C++AMP更接近硬件底层,所以前两者的性能更好,然而与C++ AMP的易编程性却要优于CUDA和OpenCL。与C++ AMP基于C++语言特性直接进行扩展不同,OpenCL是基于C99编程语言进行的相关修改和扩展,因此C++ AMP比OpenCL拥有更高层次的抽象,编程更加简单。在CUDA和OpenCL中,kernels(运行在GPU上的代码)必须被封装成特定函数,而在C++ AMP中,代码看起来整洁的多:我们只需要使用for循环中内嵌的lambda函数就能完成异构并行计算,而且它的内存模型也在一定程度上被大大简化了。

     那么在OpenCL、CUDA 与C++ AMP之间,开发者该如何选择呢?
           1)如果你只需要在Windows平台上进行异构编程,并且看重易编程性的话,C++ AMP无疑是最好的选择。依托于Visual Studio这个强有力的开发工具,再加上基于C++这一更高层抽象带来的先天优势,C++ AMP将为Windows开发者进行异构编程提供良好的支持。


           2)如果你只需要在Nvidia的GPU卡上进行异构编程,并且非常看重性能的话,CUDA应该是第一选择:在Nvidia的强力支持下,CUDA在Nvidia硬件上的性能一直保持领先,许多学术研究表明OpenCL与CUDA的性能相差不大,在一部分应用中CUDA的性能稍微好于OpenCL。同时CUDA的开发环境也非常成熟,拥有众多扩展函数库支持。


           3)如果你更注重不同平台间的可移植性,OpenCL可能是目前最好的选择。作为第一个异构计算的开放标准,OpenCL已经得到了包括Intel,AMD,Nvidia,IBM,Oracle,ARM,Apple,Redhat等众多软硬件厂商的大力支持。当然,C++ AMP本身也是一个开放的标准,只是目前只有微软自己做了实现,将来C++ AMP的跨平台支持能做到什么程度还是一个未知数。


           其实从编程语言的发展来看,易编程性往往比性能更加重要。从Java和.Net的流行,到脚本语言的崛起,编程效率无疑是最重要的指标。更不用说开发者往往可以通过更换下一代GPU硬件来获得更好的性能。从这点来看,C++ AMP通过降低异构编程的编程难度,实际上也是推进了异构编程的普及。下面我们需要看的就是C++ AMP是否能成为真正的业界标准,而不仅仅局限于微软自己的平台,微软这次开放C++ AMP标准的行为也正是为了推广C++ AMP在业界的普及。、

    Java on the GPU:

    (Byte)code translation and OpenCL code generation:

    (字节)代码翻译和OpenCL代码生成:

    https://github.com/aparapi/aparapi:由AMD创建和积极维护的开源库。在特殊的“Kernel”类中,可以重写应该并行执行的特定方法。此方法的字节代码在运行时使用自己的字节码读取器加载。代码被转换为OpenCL代码,然后使用OpenCL编译器进行编译。然后,结果可以在OpenCL设备上执行,OpenCL设备可以是GPU或CPU。如果编译成OpenCL是不可能的(或没有OpenCL可用),代码将仍然使用线程池并行执行。

    https://github.com/pcpratts/rootbeer1:用于将Java的一部分转换为CUDA程序的开源库。它提供专用接口,其可以被实现以指示应当在GPU上执行某个类。与Aparapi相反,它尝试自动将“相关”数据(即对象图的完整相关部分)序列化为适合GPU的表示。

    http://code.google.com/p/java-gpu/:用于将带注释的Java代码(有一些限制)翻译为CUDA代码的库,然后将其编译为在GPU上执行代码的库。图书馆是在博士论文的背景下开发的,其中包含有关翻译过程的深刻背景信息。

    https://github.com/ochafik/ScalaCL:OpenCL的Scala绑定。允许与OpenCL并行处理特殊的Scala集合。在集合的元素上调用的函数可以是通常的Scala函数(有一些限制),然后将其转换为OpenCL内核。

    Language extensions:

    语言扩展

    http://www.ateji.com/px/index.html:Java的语言扩展,允许使用OpenCL在GPU上执行的并行构造(例如并行for循环,OpenMP样式)。不幸的是,这个非常有前途的项目已不再保持。

    http://www.habanero.rice.edu/Publications.html(JCUDA):一个库,可以将特殊的Java代码(称为JCUDA代码)转换为Java和CUDA-C代码,然后可以在GPU上编译和执行。然而,图书馆似乎不是公开的。

    https://www2.informatik.uni-erlangen.de/EN/research/JavaOpenMP/index.html:用于OpenMP构造的Java语言扩展,具有CUDA后端

    Java OpenCL/CUDA binding libraries:

    Java的OpenCL / CUDA绑定库

    https://github.com/ochafik/JavaCL:OpenCL的Java绑定:面向对象的OpenCL库,基于自动生成的低级绑定

    http://jogamp.org/jocl/www/:OpenCL的Java绑定:面向对象的OpenCL库,基于自动生成的低级绑定

    http://www.lwjgl.org/:OpenCL的Java绑定:自动生成的低级绑定和面向对象的方便类

    http://jocl.org/:OpenCL的Java绑定:低级绑定,是原始OpenCL API的1:1映射

    http://jcuda.org/:CUDA的Java绑定:低级绑定,是原始CUDA API的1:1映射

    Miscellaneous:

    混合

    http://sourceforge.net/projects/jopencl/:OpenCL的Java绑定。似乎不再维持自2010年

    http://www.hoopoe-cloud.com/:CUDA的Java绑定。似乎不再维护

     

     

    展开全文
  • CUDA是一种专门为提高并行程序开发效率而设计的计算架构。在构建高性能应用程序时,CUDA架构可充分发挥GPU的强大计算功能,颇受广大开发者拥趸。
  • 《CUDA专家手册:GPU编程权威指南》英伟达公司CUDA首席架构师Nicholas Wilt亲笔撰写,英伟达中国首批CUDA官方认证工程师翻译;全面而系统地讲解CUDA编程的各方面知识,深度解析CUDA各种优化技术,包含大量实用代码...
  • 多核与GPU编程附录

    2017-05-09 15:51:59
    《多核与GPU编程》一书的附录
  • CUDA并行程序设计 GPU编程指南 shane cook 中文版全 共522页
  • 不可多得的GPU编程指南,高清完整版,之前淘宝买的,赚点积分
  • GPU编程与CG语言中文版
  • CUDA并行程序设计 GPU编程指南,权威书籍。。。。。。。。。
  • CUDA并行程序设计 GPU编程指南 ShaneCook著-中文扫描539页完整版pdf+高质量英文完整原版591页非扫描pdf
  • 这本书的经典就不用多说了,我觉得写的很好,特别是写体绘制的那部分讲的非常易懂,自己手动添加的书签,花了好长时间,要分比较高,不喜勿下
  • GPU编程与优化

    2019-02-25 17:13:56
    GPU编程与优化--大众高性能计算。扫描版,完整,433页。
  • CUDA开发者社区技术总监亲自撰写,英伟达中国首批CUDA官方认证工程师翻译,译著双馨 全面、详实地讲解了CUDA并行程序设计的技术知识点和编程方法,包含大量实用代码示例,是目前学习CUDA编程最权威的著作之一
  • GPU编程技术

    2016-12-27 17:31:04
    GPU编程技术,编技术向明辉提纲 2GPU简介GPUVS CPU34GPU图形绘制管线Shade Language(着色语言)5CG编程GPU简介:GPU前途无限光明◆自诞生起,GPU就将摩尔定律的定义大大扩展。研究表明,从993年开始,GPU的性能以...
  • CUDA并行程序设计GPU编程指南(包含原书代码book.h CPUBitmap.h等)
  • 从并行机制到CUDA开发环境搭建,从GPU高性能计算相关硬件知识到并行计算和CUDA编程技巧,从核心概念到多个热点技术和高级主题,无所不包。本书侧重于CUDA实践应用,特别在CUDA程序优化上下足了工夫,例如发挥多GPU...
  • 《CUDA专家手册:GPU编程权威指南》详细讨论CUDA的硬件和软件,包括CUDA 5.0和开普勒架构的最新特性。每个CUDA开发人员,不论新手还是高手,都可以在这里找到感兴趣的内容并即时上手。新晋的CUDA开发者将理解硬件...
  • CUDA并行程序设计 GPU编程指南 PDF 中文 完整 高清扫描 + 英文版
  • GPU编程精粹,非常系统且庞大的一本书。该书介绍了GPU在几何体、光照、渲染以及图形处理等领域的算法和知识。对计算和CUDA感兴趣的可以了解一下。
  • 一个很有科研精神的作者,在GPU编程尚未在中国得到发展的时期写下的,浅显但初步涵盖了GPU编程的很多部分
  • CUDA并行程序设计:GPU编程指南共分为12章。 第1章 超级计算简史 第2章 使用GPU理解并行计算 第3章 CUDA硬件概述 第4章 CUDA环境搭建 第5章 线程网格、线程块以及线程 第6章 CUDA内存处理 第7章 CUDA实践之道 ...
  • CUDA开发者社区技术总监亲自撰写,英伟达中国首批CUDA官方认证工程师翻译,译著双馨 全面、详实地讲解了CUDA并行程序设计的技术知识点和编程方法,包含大量实用代码示例,是目前学习CUDA编程最权威的著作之一
  • GPU编程和CUDA

    2015-09-23 11:35:19
    GPU编程,CUDA方面的详细介绍,包括Nvidia显卡开内存,传送数据,计算等
  • CUDA 并行编程专家手册 ++ GPU 编程权威指南书籍(并行计算)
  • 基于c++ amp的gpu编程

    2020-12-21 15:17:55
    3 gpu编程架构 3.1 opencl 3.2 cdua 3.3 c++ amp 4 一个c++ amp解决方案 5 结论 参考资料 http://ceur-ws.org/Vol-1746/paper-23.pdf 摘要: 如今,程序员面临的挑战是使他们的程序变得更好。“更好”一...

    目录

     

    摘要:

    1 简介

    2 性能改进

    2.1 异构平台

    2.2 gpu架构

    2.3 通过平行的性能改进

    3 gpu编程架构

    3.1 opencl

    3.2 cdua

    3.3 c++ amp

    4 一个c++ amp解决方案

    5 结论


    参考资料

    http://ceur-ws.org/Vol-1746/paper-23.pdf

     

    摘要:

    如今,程序员面临的挑战是使他们的程序变得更好。“更好”一词意味着更简单,可移植且执行速度更快。 异构计算是计算机科学领域的一种新方法。

        GPGPU(general purpose gpu)编程是一项具有挑战性的新技术,用于解决具有数据并行性的问题。 在本文中,我们将重点介绍使用C ++ AMP语言进行GPU编程的这种新编程方法,以及使用这些并行技术适合加速的问题类型。

    最后,我们描述使用C ++ AMP解决一个简单问题的解决方案以及该解决方案的优点。

    1 简介

    作为解决难题的算法的实现过程,需要进行深入的分析。 虽然,今天有许多工具可以帮助分析人员完成这项工作,并为程序员提供将其转换为编程语言的过程。 当执行速度很重要时,总是会遇到困难。 如果执行速度不是主要条件,那么对于程序员来说更容易,他们可以通过构建包含顺序执行的指令的源代码来更快地找到解决方案。 当所提出算法的主要条件是执行速度时,并行编程就变得更加重要。

       除了并行源代码(其指令是从CPU(中央处理单元)并行执行)之外,GPGPU编程是一种新方法。

    图形处理单元(GPGPU,很少使用GPGP或GP²U)上的通用计算是图形处理单元(GPU)的使用,通常仅处理计算机图形的计算单元,执行在传统上由中央处理单元(CPU)处理的应用程序中的计算任务。 图形处理单元(GPU)的体系结构非常适合于数据并行问题。 它们通过许多并行处理单元和极高的内存带宽支持极高的吞吐量。 对于与GPU架构非常匹配的问题,通常可以轻松实现相同问题的CPU实施2倍的加速,调整后的实施可以使CPU的性能提高10到100倍。但是,对这些处理器进行编程仍然很困难。因为gpu的架构与CPU有很大差异。 本文描述了使用C ++ AMP语言进行GPU编程的好处,以及哪些问题适合使用这些并行技术进行加速。

     

    2 性能改进

    1975年,世界首次引入了“个人计算机”。几十年来,拥有个人计算机的想法变得可能且真实。  如今,每个人都拥有从台式计算机,笔记本电脑到智能手机的各种电子机器。 多年来,随着技术的发展,这些电子机器的运行速度大大提高。制造商继续增加单个芯片上的晶体管数量,但这面临着由该芯片产生的热量的问题。 由于这个问题,制造商开始在计算机上生产具有两个或更多CPU的多核计算机。但是,添加CPU内核并不能使所有操作变得更快。

    我们可以将软件分为两组:并行感知和并行非感知。 不支持并行的软件几乎使用了可用CPU内核的1/4或1/8,而并行感知的软件的执行速度是第二类软件的2倍或4倍,与CPU内核的数量成正比。

     

     

    2.1 异构平台

    在最近几年中,图形卡也经历了强大的发展。 图形处理单元(GPU)是执行快速数学计算的计算机芯片,主要用于渲染图像。  GPU具有强大的并行处理架构,因此它可以比CPU更快地渲染图像。  GPU本身就是一种可编程且功能强大的计算设备。 由此带来的性能改进使GPU成为了与图形无关的其他资源密集型任务的流行芯片。

    GPU加速计算是将图形处理单元(GPU)与CPU结合使用,以加速深度学习,分析和工程应用程序。 如果说CPU是PC的大脑,那么GPU就被称为灵魂。 如今,我们可以找到具有两个,四个,七个CPU内核的机器,但是GPU可以具有数百个内核。 如果我们想知道GPU和CPU之间的区别,让我们看看它们如何处理任务。 一个CPU包含几个为顺序串行处理而优化的内核,而一个GPU则具有一个大规模并行体系结构,该体系结构包含数千个较小的,更有效的内核,旨在同时处理多个任务。 想象一下,一台机器中是否存在GPU内核和CPU内核的混合,是否在同一块芯片中,这是一台异构的超级计算机。

       在计算中,FLOPS或触发器(每秒浮点操作数)是计算机性能的一种度量,在大量使用浮点计算的科学计算领域很有用。 在这种情况下,这是比通用说明更准确的方法。 因此,一台1 FLOP的机器将在一秒钟内执行一次“操作”。 浮点运算涉及浮点数,通常执行时间比简单的二进制整数运算要长。  1 Gigaflops具有10亿FLOPS,1 Teraflops具有1000 Gigaflops。 通常,CPU可以达到100 GFLOPS。 典型的GPU具有32个内核,晶体管的数量是CPU的两倍,并且可以达到3000 GFLOPS。

    GPU实现此性能的原因不在于晶体管的数量或内核的数量。存储器带宽是处理器可以从半导体存储器读取数据或将数据存储到半导体存储器中的速率。 内存带宽通常以字节/秒为单位。CPU的内存带宽约为20 GB / s,而GPU的内存带宽为150 GB / s。  CPU支持具有多任务,I / O,虚拟化,深度执行管道和随机访问的通用代码。 相反,GPU设计用于具有可编程和固定功能处理器,浅层执行管线和顺序访问的图形和数据并行代码。

       GPU的优点是功耗。  GPU可以达到10 GFLOPS /瓦,CPU可以达到1 GIGAFLOPS /瓦。 机器的电池寿命非常重要,尤其是在手持设备中。 在大多数情况下,用户宁愿不使用消耗电池电量很快的应用程序,而用不消耗电池的类似应用程序代替它们。 如果我们研究从该芯片访问的内存,则CPU会为其访问的数据提供较大的缓存,以便不等待执行从主存储器或辅助存储器读取数据的进程的执行,因为CPU经常使用相同的数据 。  GPU的缓存较小,但是使用大量线程,并且某些线程始终可以正常工作。  GPU可以预取数据以隐藏内存延迟。 与CPU不同,GPU具有较小的缓存,因为多次访问同一数据的可能性很小。

       如今,我们可以找到许多CPU编程语言。  C ++是一种流行的CPU编程语言。 在功能和性能方面,它是首选的主要语言。 通用GPU编程(GPGPU)的选择很少。 开发人员需要一种方法来提高其应用程序速度或减少特定计算的功耗。与GPU结合使用GPU的异构计算。 这种选择的一个不利方面是对可以使用这种方法构建的软件的性质的限制。

     

    2.2 gpu架构

    GPU具有较浅的执行管道,较小的缓存以及大量执行顺序访问的线程。 线程按组排列。 这些组称为经线。

    扭曲一起运行,可以共享内存并进行协作。  GPU的强大功能是可以极其快速地切换这些线程组,因此,如果阻塞了一组线程,则将执行另一组线程。

       当相邻线程使用相邻的内存位置时,读取内存的方式可提供良好的速度性能。 不利的一面是,当组中的线程正在访问的内存不接近该组中其他线程正在访问的内存时,性能将受到影响。

       只要有诸如编译器之类的工具,高级编程语言的开发人员现在就不需要CPU的体系结构。 如果开发人员想要编写将在GPU上执行的代码,那么他应该了解GPU架构的基础知识。

     

     

    2.3 通过平行的性能改进

    CPU使用带有并行数据的并行代码和顺序代码。GPU在数据并行问题上效果最佳。 有些问题可以轻松地划分为多个子问题,这些子问题可以并行执行并且彼此独立。 但是也存在一些问题,如果以某种方式对待它们,将无法将它们划分为可以并行执行的单元,但是必须以另一种方式对待它们,因此您将能够将它们划分为独立的单元。 可以并行执行的单元。 结论是,当程序员考虑问题的解决方案(源代码)并且执行速度是优先事项时,他们必须考虑并行解决方案。 他们需要以不同的方式设计算法,以创建可拆分成多个独立线程的工作。

       例如,具有并行性质的问题是两个矩阵的相加。 如果我们想要一个快速简单的解决方案,则在C ++中如下所示:

    int M1[n][n],M2[n][n],M_sum[n][n];

    for(int i=0;i<n;i++)

    for(int j=0;j<n;j++) 

    M_sum[i][j]=M1[i][j]+M2[i][j]

    }

     

    如果我们有两个具有10000个整数的100x100矩阵,则上面的代码将进行10000个加法运算,并并且是一个接一个地执行10000个运算。 如果要快速执行,可以考虑采用并行解决方案,因此可以将操作拆分为10000个线程,所有添加操作都可以立即完成。

       另一个示例是在向量(数组,集合)中找到最大值的问题。 快速解决方案是一次遍历数组中的一个元素,并将每个元素与最大值(代表当前的最高值)进行比较,然后将最大值用数组的当前元素更新(如果该值较大)。 如果数组具有100000个元素,则将进行100000个比较。 如果优先考虑算法的快速执行,我们可以考虑采用并行解决方案,那么我们可以选择1000个线程,每个线程可以处理1000个项目。 计算之后,每个线程将选择其数组部分的最大值。 这样,您可以评估仅进行1000次比较所需的每个数字。 之后,第1001个线程可以比较所有线程的结果以找到最高的值。涉及大量数据的问题是并行处理的候选对象。 我们可以找到这类问题的一些领域是:

    •实时控制系统

    •科学建模和仿真

    •游戏

    •金融仿真

    •图像处理

    减少在应用程序的顺序部分中花费的时间量的一种方法是 它的顺序性要差一些-重新设计应用程序以利用CPU并行性和GPU并行性。

     

    3 gpu编程架构

    如今,存在一些GPU编程语言,开发人员可以使用它们来构建并行软件。这些并行编程语言有其优点和缺点。 其中一些平台是opencl、cuda和c++amp,下面对其简单介绍。

    3.1 opencl

    OpenCL是主要的开放式通用GPU计算语言。 英特尔,AMD,Nvidia和ARM平台均支持OpenCL。 它是用于编写跨异构平台执行的程序的框架。

     

    3.2 cdua

    CUDA是NVidia创建的并行计算平台和应用程序编程接口(API)模型。CUDA平台可以使用C,C ++和FORTRAN编程语言。

    3.3 c++ amp

    C ++ AMP(C ++加速大规模并行处理)通过利用通常作为离散图形卡上的图形处理单元(GPU)提供的数据并行硬件,来加速C ++代码的执行。  C ++加速大规模并行计算(C++ Acclerated Massive Parallemism, C++ AMP)是一个本机编程模型,其中包含跨越C ++编程语言及其运行时库的元素。  C ++ AMP是在DirectX 11上实现的库,并且是Microsoft的开放式规范,用于直接在C ++中实现数据并行性。 该语言更易于使用,并且包含许多用于构建数据并行应用程序的库。

     

    4 一个c++ amp解决方案

    为了更清楚地说明如何使用C ++ AMP解决数据并行问题,我将提供以下示例。 这个问题很简单,具有并行性质,即矩阵乘法。

       让我们以一个数学或金融应用程序为例,其中过程的一部分是矩阵的乘法,但可能的情况是小尺寸矩阵的乘法,并且乘法操作不会执行多次,因此该操作的串行源代码将不需要执行时间长,并且并行源代码会过多。 但是,想象一下一个场景,其中有200个矩阵,每个矩阵有40000个元素。 从这里开始,我们有100个乘法运算,并且串行源代码将花费很长的执行时间,而如果利用GPU提供的功能并行执行100个运算,则执行时间将更短。

       下面是C ++中用于两个矩阵相乘的简单非并行函数:

    multiplication(vector<vector>& T1,

    vector<vector>& T2, vector<vector>& T3,

    const int n, const int m, const int k)

    { for(int i=0; i<n;i++)

    {

    for(int j=0; j<k; j++)

    {

    int sum = 0;

    for(int z=0; z<m; z++)

    sum += T1[i][z]*T2[z][j];

    T3[i][j] = sum;

    }

    }

    }

     

    如果矩阵T1和T2的大小为200x200,则此功能在中等计算机上的执行时间为3.36秒。 如果采用上述情况,即100次乘法运算,则执行时间将为336秒或5.6分钟。

      让我们看一下两个矩阵相乘的C ++ AMP并行函数:

     

    multiplication_parallel(vector<vector<int>>& T1,

    vector<vector<int>>& T2, vector<vector<int>>& T3,

    const int n, const int m, const int k)

    array_view<const int, 2> a(n, m, T1), b(m, k, T2);

    array_view<int, 2> c(n, k, T3); c.discard_data();

    parallel_for_each(c.extent, [=](index<2> idx) restrict(amp)

    int row = idx[0];

    int col = idx[1]; 

    int sum = 0; 

    for(int i = 0; i < b.extent[0]; i++) 

    sum += a(row, i) * b(i, col);  c[idx] = sum;

    });

    c.synchronize();

    此版本使用C ++ AMP库的array_view数据结构。  parallel_for_each函数是主要功能,可从计算机的GPU执行所有并行工作。 此功能在一定范围内运行-范围的形状控制着执行工作的线程数。 在中等计算机上,执行时间比无并行的解决方案快20倍。 第一个函数和第二个函数之间执行时间的差异是显而易见的。

    5 结论

    如果提出的算法的主要条件是执行速度,那么并行编程就变得很重要。GPGPU编程是一种新的具有挑战性的技术,用于解决具有数据并行性的问题。 我们可以发现此类问题的领域包括:实时控制系统,科学建模与仿真,游戏,财务模拟,图像处理等。对于与GPU架构非常匹配的问题,通常很容易实现2 倍与同一个问题的CPU实施,速度提高了甚至更多,经过调整的实现可以比CPU快10到100倍。GPU本身就是一种可编程且功能强大的计算设备。GPU具有大规模并行架构,由数千个更小,更高效的内核组成,旨在同时处理多个任务。

       CPU的内存带宽约为20 GB / s,而GPU的内存带宽为150 GB / s。GPU的优点是功耗。GPU可以达到10 GFLOPS /瓦,CPU可以达到1 GIGAFLOPS /瓦。

       如果我们要构建将并行执行的代码,则GPGPU是新技术的不错选择,而C ++ AMP是在编程和提供必要的库时提供便利的语言。

     

    参考文献

    Manika P, Xhumari E, Fejzaj J. GPU Programming Using C++ AMP[C]//RTA-CSIT. 2016: 140-144.

     

    展开全文
  • GPU编程模型

    2021-02-25 01:14:46
    当第三代GPU出现的时候,GPU开始用于图形编程,研究者们给GPU烧制程序,进行图像处理。GPU的并行流处理能力吸引了并行计算的研究者,研究者们借助图形编程的概念,把计算操作转化成图形纹理操作。这个时候GPU计算,...
  • 1、CUDA并行程序设计 GPU编程指南.pdf 2、CUDA专家手册++GPU编程权威指南.pdf

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 57,966
精华内容 23,186
关键字:

gpu编程

友情链接: divide.zip