基于GPU的算法并行化

GPU计算的目的即是计算加速。相比于CPU,其具有以下三个方面的优势:

l  并行度高:GPU的Core数远远多于CPU(如G100 GPU有240个Cores),从而GPU的任务并发度也远高于CPU;

l  内存带宽高:GPU的内存系统带宽几十倍高于CPU,如CPU (DDR-400)带宽是3.2GB/秒,而GPU内存系统带宽可达147.1GB/秒;

l  运行速度快:GPU在浮点运算速度上较之CPU也具有绝对优势,如对于一般的硬件,CPU(Intel Core 2 Quad Q8200)是 37 GFLOPS,而GPU(nVIDIA Geforce 8800 Ultra(G80-450 GPU))则可达393.6 GFLOPS。

另一方面,GPU采用的SIMD(Single Instruction Multiple Data)架构,这决定了其对执行的任务具有特定的要求(如不适合判断逻辑过多的任务,数据大小不可控的任务等)。而且,应用程序在GPU上也需有特定的实现,包括算法的GPU并行化,程序的定制等。因此,针对GPU并行处理的研究成为一大研究热点。

目前,CUDA和OpenCL是GPU的两种最为流行的编程语言。它们在程序逻辑方面相似,主要直观的区别在于:

l  OpenCL比CUDA灵活度高:CUDA只支持NVIDIA的设备,而OpenCL支持各种类型的协处理器,包括GPU,FPGA等;

l  CUDA较之OpenCL用户友好性高:CUDA是一个更为高级的抽象,其提供的API更易于使用,而无需编程者对底层设备过多了解;

现有GPU采用SIMD方式执行,即所有线程块在同一时刻执行相同的程序,从而若这些线程块处理的数据量相差大,或计算量分布不均,便会带来线程块的负载不均,进而影响整个任务执行效率。这类问题实则常见的Skew Handling或Load Inbalance问题。

应用算法的GPU并行化之所以成为一个研究问题而不仅仅是工程问题,这其中的主要的问题在于

1)GPU不支持内存的动态分配,从而对于输出结果大小不确定的任务是一个极大的挑战;

2)GPU的SIMD特性使得很多算法不易很好实现,即如何充分利用GPU线程块的并行度;

3)共享数据的竞争读写,共享数据的锁机制带来大量的等待时间消耗。

GPU作为一种协处理器,其的执行受CPU调度。在实际应用中,GPU更多的也是配合CPU工作,从而基于CPU/GPU异构系统的统一任务调度更具实用意义,也是有关GPU的重要研究方面。

GPU采用SIMD架构,各线程块在同一时刻执行相同的Instruction,但对应的是不同的数据。但事实上,GPU线程块具有如下特征:

n  每个线程块只对应于一个的流处理器(SM),即其只能被该对应的SM执行,而一个SM可以对应多个线程块;SM在执行线程块时,线程块中的线程以Warp(每32个线程)为单位调度及并行执行;

n  线程块内的线程可同步,而不同线程块的同步则只能由CPU调用同步命令完成;

n  不同线程块的运行相互独立。

因此,为不同的线程块分配不同的任务,使得GPU做到任务并行,最大化GPU的利用成为可能并具有重要的研究意义。

原文地址:https://www.cnblogs.com/changbosha/p/5713190.html