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

前几天技术大牛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://www.mzph.cn/news/448753.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

完全平方公式、平方差公式、一个数负次方

1.完全平方公式&#xff1a; 两数和&#xff08;或差&#xff09;的平方&#xff0c;等于它们的平方和&#xff0c;加上&#xff08;或减去&#xff09;它们的积的2倍即完全平方公式 (ab)2a2b22ab 两数和的完全平方公式&#xff08;完全平方和&#xff09; 与(a-b)2a2b2-2ab …

WSS连接服务器端报错

错误&#xff1a; 1. Firefox 和 Chrome 浏览器对SSL证书拒绝的错误提示是不一样的&#xff1a; &#xff08;1&#xff09; Chrome报错&#xff1a;WebSocket connection failed: Error in connection establishment: net::ERR_CERT_AUTHORITY_INVALID &#xff08;2&#xff…

LogBack 入门实践

一、简介 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 LogBack是一个日志框架&#xff0c;它是Log4j作者Ceki的又一个日志组件。 LogBack,Slf4j,Log4j之间的关系 slf4j是The Simp…

20个公司绝对不会告诉你的潜规则

1.入职时的工资高低不重要&#xff0c;只要你努力工作你会得到相应待遇的    我估计几乎找过工作的人都听过这句话&#xff0c;当我们确定被聘用跟公司谈工资时&#xff0c;他们都会说“如果以后你业绩突出、努力工作&#xff0c;你的报酬也会相应增加的”&#xff0c;特别是…

java 复制文件

2019独角兽企业重金招聘Python工程师标准>>> public class copyFIle { public static void main(String[] args) throws IOException { File source new File("d:/test/1.xml");File des new File("d:/test/ma.txt");InputStream input null;…

Quartz学习资料地址记录 、Quartz 学习的博客地址记录

Quartz专栏系列 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 1.Quartz学习——Quartz大致介绍&#xff08;一&#xff09; 2.Quartz学习——Quartz简单入门Demo&#xff08;二&#…

民间75个不传之密 ,医院都不知道的秘密

1、头痛&#xff08;各种头痛均可&#xff09;&#xff1a; 生白萝卜汁&#xff0c;每次滴鼻孔两滴(两鼻孔都滴)&#xff0c;一日两次&#xff0c;连用4-5天&#xff0c;可除根。忌吃花椒、胡椒。 2、头晕&#xff08;头昏眼花、晕眩&#xff09;&#xff1a; 鸭蛋一个、赤豆2…

Docker最全教程之MySQL容器化 (二十四)

Docker最全教程之MySQL容器化 &#xff08;二十四&#xff09; 原文:Docker最全教程之MySQL容器化 &#xff08;二十四&#xff09;前言 MySQL是目前最流行的开源的关系型数据库&#xff0c;MySQL的容器化之前有朋友投稿并且写过此块&#xff0c;本篇仅从笔者角…

CODING 受邀参加《腾讯全球数字生态大会》

近日&#xff0c;腾讯全年最重要的一场活动——《腾讯全球数字生态大会》于昆明滇池国际会展中心正式举办。此次全球数字生态大会是腾讯战略升级后&#xff0c;整合互联网数字经济峰会、云未来峰会、腾讯全球合作伙伴三大行业大会&#xff0c;全新升级打造的行业创新大会。大会…

解决 dockerfile 构建镜像报错: [WARNING]: Empty continuation lines will become errors in a future release.

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 1. 只是想自己写个 dockerfile 用 docker 来部署 rocketmq 的服务。 dockerfile 中要运行多行命令 于是我写成 RUN 命令a \&&…

第二章:08运算符[比较运算符]

①比较运算符②实例/* 运算符之三&#xff1a;比较运算符 ! > < > < instanceof 结论&#xff1a; 1.比较运算符的结果是boolean类型 2.区分 和 */ class CompareTest { public static void main(String[] args) { int i 10; int j 20; System.out.pr…

Apache版本兼容性问题

Apache 版本2.2.31 版本对于谷歌浏览器不兼容、IE8版本可以正常使用 当使用了Apache 高版本的话就解决了 出现以下现象 转载于:https://www.cnblogs.com/tzhyy/p/10931084.html

王淮经验谈:我的码农原则

摘要&#xff1a;王淮是Facebook第二位中国籍工程师&#xff0c;也是第一位中国籍研发经理&#xff0c;他一手开创了Facebook的支付安全和客服工具领域。2011年他离开Facebook&#xff0c;回国成为天使投资人。本文是王淮以前写代码和做代码审查时候的一些原则&#xff0c;供大…

centos uwsgi自动调用python2环境,指定uwsgi调用版本

将自己开发好的django项目用uwsgi部署到Linux服务器、当运行uwsgi时出现了uwsgi选择python版本的问题。因为本机器是在原来的机器上安装了python3环境和pip3&#xff0c; 使用命令安装uwsgi: pip3 install uwsgi 一点问题也没有&#xff0c;使用uwsgi部署项目时 uwsgi --http :…

docker build Dockfile ---- RUN 中 cd 切换路径失败 的原因、解决

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 1. 我只是想 直接切换到对应目录下 执行后续命令。 ​​​​​写法如下&#xff1a; FROM openjdk:8-jre-alpineMAINTAINER JiangYuRU…

米尔电子Zynq UltraScale MPSoC核心板资料介绍

米尔Zynq UltraScale MPSoC核心板&#xff08;MYC-CZU3EG&#xff09;是采用Xilinx新一代Zynq处理器。该核心板是业界最小尺寸Zynq UltraScale 核心板&#xff0c;采用16纳米制程&#xff0c;相比Znyq7000系列每瓦性能提升5倍&#xff0c;且单芯片融合4核心Cortex-A53&#xff…

幸福秘诀 男女必须要看哦

女人说&#xff1a;这一辈子最大的成功是什么?我认为是找到一个真正疼自己的老公,有了老公的支持才可以把事业做得有声有色,有一个幸福的家和一个可爱的宝宝。 男人说&#xff1a;我的成功是在我的人生之中&#xff0c;是妻子和我形影相随&#xff0c;朝夕相伴。她是我身边…

解决:If the number of processors is expected to increase from one, then you should configure the numbe

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 1. 按官方说明用 docker 部署 rocketmq ,启动 broker 报错&#xff1a; OpenJDK 64-Bit Server VM warning: If the number of processo…

JAVA-缓存机制

本地缓存 继承AbstractBaseLocalCache&#xff0c;并实现相应的抽象方法&#xff1b;适用于单实例项目或不会经常变化的数据&#xff1b;代码示例&#xff1a;/*** 仓库信息缓存类*/ Service public class WarehouseCache extends AbstractBaseLocalCache<Long, Warehouse&g…

腾讯QQ团队开源分布式后台毫秒服务引擎全解析:引擎架构、RPC、灰度……

腾讯QQ团队将于12月4日开源一个服务开发运营框架&#xff0c;叫做毫秒服务引擎&#xff08;Mass Service Engine in Cluster&#xff0c;MSEC&#xff09;&#xff0c;它集RPC、名字发现服务、负载均衡、业务监控、灰度发布、容量管理、日志管理、Key-Value存储于一体&#xff…