gpu并行处理,python gpu并行计算
1.GPU架构概述GPU是众核架构,非常适合解决大规模并行计算。GPU是CPU的协处理器,必须通过PCIe总线连接到基于CPU的主机上才能运行,从而形成异构架构),如下图所示。其中CPU是主机端,负责逻辑控制和数据分发,GPU是设备端),负责并行数据的集中计算。这里,ALU是一个算术运算单元。
GPU架构是围绕可扩展的流多处理器阵列(SM)构建的。下图是NVIDIA的Fermi架构SM的图像,包括GPU核心、共享内存/l1缓存、寄存器文件、加载/存储单元、特殊功能单元和线程束调度器。GPU中的每个SM都支持数百个线程同时运行,每个GPU都有多个SM。这意味着一个GPU可以同时运行数千个线程。当内核网格启动时,它的线程块被分配并运行在可用的SM上。多个块可以被分配给同一个SM。
2.CUDA并行计算CUDA是NVIDIA推出的通用并行计算平台和编程模型,可以利用NVIDIA GPU实现并行计算。CUDA可用于CUDA加速器库、编译器指令、APP应用编程接口和标准编程语言(包括C、C、Fortan和Python)的扩展。CUDA线程模型线程是GPU的最小执行单元,可以执行逻辑运算。每个线程都有自己的指令地址计数器和寄存器状态。利用自身的数据执行当前的指令每次调用线程时,另一个线程捆绑GPU以线程捆绑单元执行。在线程束中,所有线程都以单指令多线程(SIMT)模式运行。也就是说,所有线程都执行相同的指令。多个线程束有三个最高维的线程块,同一个线程块中的所有线程都可以使用共享内存进行通信和同步。线程也由最高维度为3的网格管理。
CUDA内存模型CUDA内存模型有两种内存:不可编程内存和可编程内存。前者不向开发者开放包括主缓存和辅助缓存在内的访问接口;后者是显式地控制数据在内存空间中的存取,包括寄存器、共享内存、本地内存、常量内存、纹理内存和全局内存。
寄存器:最快,按线程分配,数量有限。使用具有超过有限数量的寄存器的单个内核函数将导致本地存储器溢出,从而降低算法的性能。本地内存:用于存储寄存器溢出的本地内存。本地存储器访问满足高效存储器访问的要求。共享内存:带宽比本地内存和全局内存更宽,延迟更低。这是由线程块分配的,生命周期包括线程块,其中每个线程都可以共享存储空间。块中的线程可以通过共享内存进行通信。常见的方法是将全局内存读入共享内存。读取方法是读取每个线程所在位置的数据,当读取完成时,块中的所有线程都可以使用整个共享内存中的数据。将全局内存读入共享内存时,请注意同步。Cuc使用线程同步函数__syncthreads)来同步)。与内核函数一起存储在共享内存中的变量是用修饰符__shared__修饰的。常量内存:要用修饰符__constant__限定,它必须在全局空间和所有内核函数之外声明。所有具有相同编译单元的线程内核函数将显示只读纹理内存。只读适用于二维数据访问全局内存。它是GPU中最大、最延迟、最常用的内存,在整个程序生命周期中都在使用。在全局内存访问中,内存访问的特性需要注意内存访问的对齐和集成。如果一个线程包中的32个线程都访问一个连续的内存块,那么满足合并访问是非常高效的。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。