GPU编程
GPU编程,现在主要有两个API接口:OpenGL和DirectX。这也意味着,你必须将编码翻译成OpenGL或者DirectX。这可不是一项轻松的工作,你必须充分了解算法和编码。就算是用了较简单的流处理概念,用GPU API写代码仍旧还是一件困难的事情。
打个比方,我们不能写存储(memory),而只能写纹理。我们不能写计算Kernel,只能写片段程序(fragment program)。我们也不能写数据流的foreach loop,而只能写render pass。其实现在,能够透彻的理解算法和GPU代码的程序员数量并不多。因此,我们就面临了又一个问题,GPU程序员的高门槛很可能会阻碍GPU的健康发展。因此,为GPU程序员构建一个更简单的程序解决方案迫在眉睫。
理想中的解决方案,是一种高级别的程序语言,它应该将很多GPU底层代码抽象出来,以更加简单的方式,更加友好的界面,让那些非显卡程序员也能顺利的编写程序。其实,现在也有一些这样的GPU语言,这些GPU语言主要包括了:
*Sh
*Brook
*Shallows
*CUDA (Compute Unified Device Architecture)
*RapidMind
这些GPU语言各有不同,但它们都很类似于C或者C++,并且包含了流概念。例如,Brook就将GPU看做一个协处理器。Brook语言自己也有衍生的语言——Brooktran。Brooktran更接近Fortran,但大体上,还是基于Brook。Brook可以运行于ATI、NVIDIA的GPU,OpenGL和DirectX接口,Windows和Linux操作系统。
说到GPU编程,最近的GPU程序平台CUDA被炒得火热。CUDA是NVIDIA创建的一个全新的GPU编程平台。在CUDA上,最关键的好处在于你可以用最通用的C语言直接编写代码。这个特点,可以让程序员专注于他想实现的功能,而编程语言不再是瓶颈。CUDA主要有以下几个扩展:
*函数类型限定
*可变类型限定
*Kernel在GPU上如何具体的工作的指示
*4个variables可以分辨来自CPU 的grid和block的维度。
编译器nvcc会把CPU code和GPU code分开,CPU代码还需要使用传统的编译器编译,而GPU代码通过nvcc编译。
CUDA 拥有一个run-time library,run-time library运行在CPU(主机端),可以提供访问多个GPU,并且控制这些GPU的功能。CUDA有跑在GPU之上,嵌入式的vector数据类型,还有同时跑在CPU和GPU上的Standard C Library 子集。CUDA还拥有预置的BLAS libraries (Basic Linear Algebra Subprograms平行的基本线性代数副程序),和FFT libraries(Fast Fourier Transforms快速傅里叶转换)。CUDA这些技术的优点在于,CUDA可以合并CPU和GPU的编程工作,暂时只适用于NVIDIA的 GPU。而且就像开源软件一样,CUDA是完全免费的。