这是好久没写博客,花一个多小时写的博客,本人一些心得体会,等做完项目再完善在整个项目中的应用,再会发出后续一篇关于多线程,队列,usrp,gpu等一篇比较综合的解析==================hhhhh 随便看看
Linux下利用cuda对代码加速处理的实现
1. 应用cuda的原因:
CUDA ®是NVIDIA发明了一种并行计算平台和编程模型。通过利用图形处理单元(GPU)的功能,可以显着提高计算性能。
在cpu中对于程序的加速运行一般会考虑几个方面:
1)语言上使用的区别,会影响程序执行的效率。越靠近底层的语言越会使整个程序执行的时间越短。除了硬件描述设计的语言(如verilog,vhdl)这些语言会贴近于硬件电路的实现来加速运行,这种语言使整个代码是并行处理架构(和设计芯片,电路模块的并行架构是相对应的),这种是效率最高的。其次就是汇编语言了,它也是属于低级语言,其他语言一般在编译阶段都会解析成汇编语言之后才会进一步变为机器语言,因此对于汇编语言处理程序来说效率也会明显很高,但就是代码复杂。下一个就是c++,c++是除上面之外的运行效率最高的代码了,写操作系统的人一般都是以c++和汇编语言交织一起,就是考虑到其贴近底层,效率高的特点。相比以上语言,执行时间最长的语言当属python和Java了,但其含有丰富的库资源,在对效率或者时间要求不是特别高的情况下,使用这两种代码是最合适不过了,而且简单容易上手,且这两种语言可以直接调库函数实现加速。
2)对于c++或者c代码来说,加速处理代码的第二种方法是利用openmp库来实现,openmp库来实现并行编程,是实现了程序的加快执行,但这种库的缺点在于没办法知道其能否继续改进实现更快,只能实现部分的循环代码加速起来,这部分循环代码处理速度大约提升5-6倍。
3)对于c或c++代码实现加速处理的另一种方法就是利用指令集加速处理,但对于指令集来说(如SSE指令集),其处理方式更类似于汇编语言,实现对寄存器进行操作,很明显对寄存器进行操作的速度会明显优于对于内存的操作。
4)对于cpu中最为普遍加速程序执行的方式就是多进程,多线程,多协程。但进程不易开的过多,因为一个进程占用的资源非常度。一般考虑的就是多线程和多协程。多线程一般在代码实现过程中涉及手动开线程,调用相应的run方法,线程的互斥(如互斥锁的实现),资源的共享,以及线程的优先级方面取开相应和设置函数。最大优势在于你可以自由的去控制。但其实多线程并没有做到真正的并行,其实是处于并发状态。只有当你运行的cpu核数多于运行的线程数量,才是真正的并行处理。否则就是并发状态,一般主要这种情况对于我来说最常用的就是考虑到时间片轮转和优先级调度这两种情形。
而对于利用gpu来加速处理程序来说,其相比于上面的几种方法,效率是最高的,通常能加速到相比最初的几十倍或几百倍的速度。因此,利用GPU来实现加速程序代码实现,就是除了利用像fpga并行硬件处理平台之外的最好的一种方式。
CUDA的开发考虑了几个设计目标:
• 提供对标准编程语言(例如c,c++)的一小部分扩展,这些扩展可实现并行算法的直接实现。借助cuda c/c++,程序员可以专注于算法的并行化任务,而不必花时间在其实现上。
• 在应用程序同时使用cpu和gpu的情况下支持异构计算。应用程序的串行部分在cpu上运行,并行部分放到gpu。此配置还允许在cpu和gpu上同时进行计算,而不会争用内存资源。我在写代码时,也会考虑两者综合。Cpu开多线程实现不同逻辑功能,gpu开多线程实现每一功能的耗时操作处理。这样效率会更高。
具有cuda功能的GPU具有数百个内核,这些内核可以共同运行数千个计算线程。这些内核具有共享资源,包括寄存器文件和共享内存。片上共享内存允许在这些内核上运行的并行任务共享数据,而无需通过系统内存总线发送数据。
综上,对于GPU以及无论是GPU还是cpu多线程的使用开启都是非常重要的实现程序加速处理效率较高的方式。