GPU并行计算版函数图像生成器

标签: gpu 并行计算 函数图像 | 发表时间:2011-08-18 23:48 | 作者:装配脑袋 Lionheart
出处:http://www.cnblogs.com/Ninputer/

前几天技术大牛Vczh同学开发了一个函数图像绘制程序,可以画出方程f(x,y)=0的图像。他的原理是用图像上每一点的坐标带入函数f得到针对x和y的两个方程,再用牛顿迭代法求解得到一组点集,然后画到图像上。用他的程序可以画出各种各样令人惊叹的方程图形。但是他的程序非常慢,因为对每一个点坐标都用牛顿迭代法求解是一项很费时的任务,即使采用了Parallel.For,CPU算起来也很吃力。我研究了他的程序之后觉得可以用擅长并行计算的显卡来加速迭代法求解的过程。用OpenCL来完成这个任务再合适不过了。

 

整个过程还是相当顺利的,完全在Vczh原始程序的基础上改成。仅稍微改变了策略。步骤如下:

  1. 解析输入函数f之后,分别生成∂f/∂x和∂f/∂y两个偏导数,然后将这三个二元函数转化为合法的OpenCL表达式。
  2. 用OpenCL实现牛顿迭代法。
  3. 将图像上的每一点分派到一个OpenCL线程,然后由无数并行的OpenCL线程计算自己的点。

 

其中OpenCL代码如下:

fp_t func(fp_t x, fp_t y) 
{   
    return {动态生成}; 
}

fp_t df_dx(fp_t x, fp_t y)
{
    return {动态生成};
}

fp_t df_dy(fp_t x, fp_t y)
{
    return {动态生成};
}

fp_t solvex(fp_t start, const fp_t consty)
{
    for (int i = 0; i < MAX_ITER; ++i)
    {
        fp_t result = func(start, consty);
        
        if (result <= EPSILON && result >= -EPSILON)
        {
            return start;
        }

        fp_t d = df_dx(start, consty);
        if (d <= EPSILON && d >= -EPSILON)
        {
            return NAN;
        }
        else
        {
            start -= result / d;
        }
    }
    return NAN;
}

kernel void ComputeX(
    global write_only fp_t* points,
    int unit,
    int width,
    int cx,
    int cy,
    float origin_x,
    float origin_y)
{
    int gx = get_global_id(0);
    int gy = get_global_id(1);

    uint write_loc = gx + gy * width;
    
    fp_t py = origin_y + (fp_t)(gy + 1 - cy) / unit;
    fp_t px = origin_x + (fp_t)(cx - gx - 1) / unit;

    points[write_loc] = solvex(px, py);
}

这是求解f(x, a) = 0部分的代码,求解f(b, y) = 0的与之基本一样。其中fp_t是根据情况定义的typedef,可能是float或double。因为不是所有的OpenCL设备都支持双精度浮点,所以要写成通用类型的算法,用宏来控制。

 

在.NET中使用OpenCL,最容易的方法当然是使用Cloo库。Coo库完整地封装了OpenCL(1.1)的所有函数,并且是.NET非常容易使用的对象模型。我只使用了一次Cloo和OpenCL就再也不想忍受DirectX ComputeShader那麻烦的要死的类库。。

 

我的程序源代码已经完全上传到github。地址是:https://github.com/Ninputer/opencl-plot 点击Download即可打包下载所有代码。想直接运行的朋友可以点击此处下载二进制文件包。

 

要想运行这个程序,你必须安装了OpenCL的实现平台。目前Windows上的OpenCL主要有NVidia、AMD和Intel几家提供的实现平台。如果你有一块比较新的NVidia或AMD显卡,那么只需要装了最新的驱动包就自带了OpenCL。以下显卡支持双精度浮点:NVidia GeForce 200系列、400系列、500系列显卡;AMD Radeon HD 5800、5900、6900系列。其中Radeon 6900系列尚不支持官方双精度浮点数(cl_khr_fp64)扩展,所以本程序也支持cl_amd_fp64双精度浮点扩展,功能上完全一样。G80和RV770等架构的显卡以及AMD中低端显卡只能支持单精度浮点数,绘制时的精度可能会略差。

 

没有支持OpenCL显卡的同学也可以用多核CPU来进行OpenCL计算,仍然要比原始的C#版本快一些。如果使用Intel Core i3、i5、i7系列CPU,可以使用Intel OpenCL SDK,下载地址:http://software.intel.com/en-us/articles/opencl-sdk/ 其他多核CPU都可以使用AMD APP SDK,下载地址:http://developer.amd.com/sdks/AMDAPPSDK/downloads/Pages/default.aspx

 

启动程序后允许先选择OpenCL计算平台和设备,如果安装了多个OpenCL平台可以任意选择。目前本程序暂时不支持多显卡并联技术(SLI、Crossfire)。NVidia CUDA平台界面示例:

image

 

AMD APP平台界面示例:

image

 

Intel OpenCL平台界面示例:

image

 

现在,输入方程,充分发挥你的想象力吧!

image

image

image

image

注意采用显卡计算时,最好不要进行游戏,用IE9浏览网页等,负荷过重时可能会导致GPU重置。如果某些公式运算量太大,或显卡较为低端,也容易导致GPU重置,请务必用Windows 7和Vista来进行实验,因为WDDM驱动模型更加稳定(用XP容易蓝屏)。

 

欢迎关注我的微薄获取最新动态 http://weibo.com/ninputer

作者: 装配脑袋 发表于 2011-08-18 23:48 原文链接

评论: 16 查看评论 发表评论


最新新闻:
· webOS浴火重生(2011-08-28 19:13)
· 为什么说windows8平板将是ipad最有力的竞争对手(2011-08-28 15:54)
· 还原乔布斯:最伟大的“小偷”(2011-08-28 15:53)
· 对Web开发人员很有帮助的7款免费Android应用(2011-08-28 15:52)
· 施密特称将有更多公司支持Google TV(2011-08-28 11:39)

编辑推荐:菜鸟CLR VIA C#之旅(1):品味细节,CLR的执行模型

网站导航:博客园首页  我的园子  新闻  闪存  小组  博问  知识库

相关 [gpu 并行计算 函数图像] 推荐:

GPU并行计算版函数图像生成器

- Lionheart - 博客园-装配中的脑袋
前几天技术大牛Vczh同学开发了一个函数图像绘制程序,可以画出方程f(x,y)=0的图像. 他的原理是用图像上每一点的坐标带入函数f得到针对x和y的两个方程,再用牛顿迭代法求解得到一组点集,然后画到图像上. 用他的程序可以画出各种各样令人惊叹的方程图形. 但是他的程序非常慢,因为对每一个点坐标都用牛顿迭代法求解是一项很费时的任务,即使采用了Parallel.For,CPU算起来也很吃力.

函数图像(二)

- DreamToTrue - C++博客-λ-calculus(惊愕到手了欧耶)
    今天终于把雏形给做出来了. 主要的方法是牛顿迭代法,把屏幕上的所有点都收敛到函数图像上面. 为了提速,我是用了ThreadTool.QueueUserWorkItem和Parallel.For,还把那颗函数的语法树用Linq.Expression编译成了机器码. 下面的这些图都是二十秒钟左右就可以画出来的了.

并行计算的解药

- chengdujin - 牛博山寨 编辑推荐
前几天看到 reddit.com 的 programming 类别第一名是《 Parallelism is Not Concurrency 》. 读完之后发现和我去年的《多核与锁》有很多观点上的共通之处. 《 Parallelism is Not Concurrency 》的开篇行文更流畅幽默,对并发( concurrency )和并行( parallelism )有更精辟的总结.

廉价GPU时代的密码策略

- Riku - delphij&#39;s Chaos
很久以前我曾经建议过别人使用足够长的一大串英文单词作为密码,现时这样做已经完全不能保障安全了. Colin Percival最近在 一篇文章 中提到了这样的数据:使用价值 $10k 的 GPU 破解使用MD5的34位英文密码(例如"You will never guess this password")所需要的时间仅为两小时(如果使用专用的硬件,以$1M投资的ASIC可以在一秒之内完成破解).

GPU对战CPU,试验出真知

- nasachn - IFLONELY
MythBusters的两个科学怪才的牛做. 新奇图片搜索引擎Sprixi.

IDF前瞻:Ivy Bridge的GPU和TDP

- 洞箫 - cnBeta.COM
将于当地时间本周二在旧金山开幕的Intel开发者论坛大会IDF 2011上,定于2012年3月或4月发布的下一代CPU"Ivy Bridge"具体细节将得到揭晓. 在大会开幕前,著名硬件网站Anandtech的站长已经掌握了Ivy Bridge两方面的具体规格:集成的新一代GPU和可变TDP.

Intel:Ivy Bridge GPU 將支援 4K 解析度

- SotongDJ - Engadget 中文版
我們已經知道 Ivy Bridge 處理器將比上一代更加小巧且運行速度更快,不過我們對於其 GPU 架構性能還鮮有耳聞,這次終於有了答案. 根據消息來源指出,Ivy Bridge GPU 將支援 4K 解析度(也就是說最高達到 4,096 x 4,096 解析度),而上代的 Sandy Bridge 最高支援 WQXGA(2,560 x 1,600)解析度,相比之下有了大幅度的提升.

02.手动安装NVIDIA GPU驱动--Linux

- - 操作系统 - ITeye博客
    (1) 执行命令:cat /etc/redhat-release 查看CentOS版本. 执行命令:cat /proc/version  . 内核:4.8.5 (后面会用到). (1)安装对应版本内核源码包、gcc编译器. #sudo yum install -y gcc (或者:sudo yum install  -y gcc-c++  或者 yum install .

几个令人惊叹的函数图像

- armgod - Matrix67: My Blog
    国外有人发现一个鲜为人知的古董级函数作图软件—— GrafEq. 这个软件只有 2M 大小,它的功能就只有一个:作出形如 x2 + y2 = 1 的二元等式或者不等式的图像. 令人惊叹的是,这个软件的图像绘制能力异常强大, Mathematica 等大型专业数学软件完全不是它的对手.     这个软件早就没再更新了.

你的密码安全吗?来用 GPU 暴力破解密码

- 小筱 - Engadget 中国版
[作者:Fox Mulder]. 这是一个相当有趣的小工具,能够让你用 GPU 暴力破解密码,从新闻中的描述,Radeon HD 5770 每秒可以进行33亿次的运算. Radeon HD 5770能够在一秒钟之内破解一个五位数的密码 "fjR8n" ....... 引用来源 | 引用来源 | 此文章网址 | 转寄此文章 | 回应.