惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

G
GRAHAM CLULEY
C
CXSECURITY Database RSS Feed - CXSecurity.com
P
Privacy International News Feed
W
WeLiveSecurity
C
Cybersecurity and Infrastructure Security Agency CISA
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
P
Proofpoint News Feed
WordPress大学
WordPress大学
Blog — PlanetScale
Blog — PlanetScale
Project Zero
Project Zero
H
Help Net Security
B
Blog RSS Feed
T
Threatpost
Microsoft Azure Blog
Microsoft Azure Blog
C
Check Point Blog
Application and Cybersecurity Blog
Application and Cybersecurity Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
阮一峰的网络日志
阮一峰的网络日志
S
SegmentFault 最新的问题
博客园 - 【当耐特】
月光博客
月光博客
Google Online Security Blog
Google Online Security Blog
NISL@THU
NISL@THU
The GitHub Blog
The GitHub Blog
P
Privacy & Cybersecurity Law Blog
N
News | PayPal Newsroom
T
Tenable Blog
Simon Willison's Weblog
Simon Willison's Weblog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
G
Google Developers Blog
小众软件
小众软件
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
GbyAI
GbyAI
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
Jina AI
Jina AI
J
Java Code Geeks
Recent Announcements
Recent Announcements
TaoSecurity Blog
TaoSecurity Blog
MongoDB | Blog
MongoDB | Blog
T
Troy Hunt's Blog
V
Visual Studio Blog
博客园_首页
L
LangChain Blog
SecWiki News
SecWiki News
O
OpenAI News
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
Hacker News: Ask HN
Hacker News: Ask HN
S
Schneier on Security
A
Arctic Wolf
U
Unit 42

博客园 - 装配脑袋

Windows Azure一些小技巧集合 C++ AMP实战:绘制曼德勃罗特集图像 自己动手开发编译器(十二)生成托管代码 自己动手开发编译器(十一)语义分析 自己动手开发编译器(十)miniSharp语法分析器 自己动手开发编译器(九)CPS风格的解析器组合子 自己动手开发编译器(八)用Linq编写解析器组合子 自己动手开发编译器(七)递归下降的语法分析器 自己动手开发编译器(六)上下文无关语言和文法 自己动手开发编译器特别篇——用词法分析器解决背诵圣经问题 自己动手开发编译器(五)miniSharp语言的词法分析器 自己动手开发编译器(四)利用DFA转换表建立扫描器 自己动手开发编译器(三)有穷自动机 自己动手开发编译器(二)正则语言和正则表达式 自己动手开发编译器(一)编译器的模块化工程 自己动手开发编译器(零)序言 DirectCompute & DirectX 11 计算着色器编程简介(翻译) 趣味问题:你能用Reflection.Emit生成这段代码吗?(答案) 趣味问题:你能用Reflection.Emit生成这段代码吗?
GPU并行计算版函数图像生成器
装配脑袋 · 2011-08-18 · via 博客园 - 装配脑袋

前几天技术大牛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