很久没有动手了,放个小小的GPGPU的框架上来

很久没有动手了,放个小小的GPGPU的框架上来
-----------------------------------------------------------------------------------------
4月20日5:00pm更新
( 点此下载):
添加了使用多个Color Attachment的方法;
补充了Kernel接口以支持多次迭代运算;
添加了Timer类,使用RDTSC时间戳计时,可以用于Benchmark(注意时间戳可能在多核CPU上存在计时不准的问题)。
-----------------------------------------------------------------------------------------

Blog已经被我荒废了不短的时间,看看名次也理所当然的下降了,呵呵。

最近由于Paper需要,正在写GPGPU的程序。我本来是个GL盲,这任务也确实有点紧迫了。不过好在有GPGPU Math Tutorial和libglsl的帮助,从昨天晚上开始看,到现在终于搞定了。

整体来说这架构也就2个部分,Kernel和GraphicProcessor。前者主要就是设置Shader和Shader里面的参数,后者主要是设置运行时的GL环境。本来GPGPU的Tutorial是可以支持Ping Pong方式的纹理使用,但是考虑到程序复杂度,最终我还是觉得就一个目标纹理来的要舒服一点。至于Ping Pong,可能等需要的时候再支持吧。(4月20日更新已经支持啦~不过需要手工配置如何交叉使用纹理)

源代码 点此下载

额外补充一点的是,最好是将Benchmark工作放置在Kernel的环境创建点之后和环境销毁点之前。这是因为设置FBO的时间实在是太长太长了。在我的慢速版的ATI 9600XT上(175/175MHZ,因为显卡芯片风扇坏了,只能减速运行了。。。 ),对一个RGBA32F的1024×1024的纹理进行运算,逐个浮点求sin(没有做Cache优化),耗时0.11s左右,CPU的版本(当然是Release啦,没有特别的优化),0.9s左右。但是那个可恶的glFramebufferTexture2DEXT调用却吃了我0.8s的时间。。。OTZ。。。。

忘了说了,4-20版的代码,需要有个叫<platform/typedef.h>的头文件。文件因为在其它目录下就没有打到包中。这里给出源代码就是了。
 1 # ifndef _TYPEDEF_H
 2 # define _TYPEDEF_H
 3
 4 # if _MSC_VER >= 1200
 5     
 6 typedef unsigned  __int8         uint8;
 7 typedef unsigned  __int16         uint16;
 8 typedef unsigned  __int32         uint32;
 9 typedef unsigned  __int64         uint64;
10
11 typedef  __int8     int8;
12 typedef  __int16     int16;
13 typedef  __int32     int32;
14 typedef  __int64     int64;
15
16 typedef uint8        byte;
17 typedef uint16    word;
18 typedef uint32    dword;
19 typedef uint64    qword;
20
21 # endif
22
23 # endif

你可能感兴趣的:(很久没有动手了,放个小小的GPGPU的框架上来)