初探 C# GPU 通用计算技术

GPU 的并行计算能力高于 CPU,所以最近也有很多利用 GPU 的项目出现在我们的视野中,在 InfoQ 上看到这篇介绍 Accelerator-V2 的文章,它是微软研究院的研究项目,需要注册后才能下载,感觉作为我接触 GPU 通用运算的第一步还不错,于是去下载了回来。

 

在安装包里,包含了几个例子程序,比如著名的 Life 游戏,不过,Life 游戏,相对于刚接触 GPU 运算的我,还是稍显复杂了。于是简化一下,只是进行一些简单的计算,发现,DX9Target.ToArray 如果返回参数是 int 数组的话,则会爆出“未支持的操作”的异常,想想也对,显卡确实是精于浮点运算的。

 

本来,我以为,GPU 运算是 DirectX 11 才有的功能,但是 Accelerator 支持的却是 DirectX 9,想来 DirectX 11 支持的运算能力更高、方式更简单吧。

 

为了简单比较一下 CPU 和 GPU 的速度,也写了一个 .net 4 的并行运算的程序,因为 DX9Target 不支持 int,所以这里的数组也用 float,如下:

 

 

复制代码
代码
private const int GridSize = 1024; private float[] _map;public Form1() {InitializeComponent();_map = new float[GridSize * GridSize];for (int y = 0; y < GridSize; y++){for (int x = 0; x < GridSize; x++){_map[x * GridSize + y] = x * y;}}Render(); }private void Start_Click(object sender, EventArgs e) {var stopwatch = new Stopwatch();stopwatch.Start();_map = _map.AsParallel().Select(p => p * p * p / 4 + 194).ToArray();var time = stopwatch.ElapsedMilliseconds;this.Text = time.ToString();Render(); }private void Render() {var workingBitmap = new Bitmap(pictureBox1.Width, pictureBox1.Height);for (int y = 0; y < pictureBox1.Height; y++){for (int x = 0; x < pictureBox1.Width; x++){workingBitmap.SetPixel(x, y, Color.FromArgb(-0x1000000 | (int)_map[x * 2 * GridSize + y * 2]));}}pictureBox1.Image = workingBitmap; }
复制代码

 

 

而使用 Accelerator 的代码如下:

 

 

复制代码
代码
private const int GridSize = 1024; private readonly DX9Target _target; private float[,] _map;public Form1() {InitializeComponent();_target = new DX9Target();_map = new float[GridSize, GridSize];for (int y = 0; y < GridSize; y++){for (int x = 0; x < GridSize; x++){_map[x, y] = x * y;}}Render(); }private void Start_Click(object sender, EventArgs e) {var stopwatch = new Stopwatch();stopwatch.Start();var p = new FloatParallelArray(_map);p = p * p * p / 4 + 194;_target.ToArray(p, out _map);var time = stopwatch.ElapsedMilliseconds;this.Text = time.ToString();Render(); }private void Render() {var workingBitmap = new Bitmap(pictureBox1.Width, pictureBox1.Height);for (int y = 0; y < pictureBox1.Height; y++){for (int x = 0; x < pictureBox1.Width; x++){workingBitmap.SetPixel(x, y, Color.FromArgb(-0x1000000 | (int)_map[x * 2, y * 2]));}}pictureBox1.Image = workingBitmap; }
复制代码

 

 

 

用我的笔记本(CPU 为 Core i5 430, 显卡为 ATI 5650)测试,对它们两个程序,都点击几次 Start 按钮,发现运行 3 次左右,图片框会变成全黑,这时,普通并行程序运算速度变慢,而 GPU 程序运行速度无明显变化,普通并行程序 4 次值为:96,89,277,291,而 GPU 程序 4 次值为:71,40,35,50。单就这个测试来说,在我的电脑上,使用 GPU 的程序,大概比普通并行程序快一倍左右吧。这个测试本身,其实不见得很公平,结果仅供参考。

 

不过,在 Accelerator 中的并行编程,明显感觉受到的约束很大,平常很容易的代码,要改成这种并行模式,需要花费很多力气,有些逻辑甚至无法实现。相对于 Accelerator,Brahma 的代码写起来就容易得多,也更易于阅读,其 Life 游戏的例子程序读起来简单而清晰,可惜我编译了 Brahma v0.1 和 v0.4,在我的电脑上,DirectX 的例子程序没有效果,而 OpenGL 的例子程序则会报一个“The generated GLSL was invalid”的异常,看来还需要等它完善之后才能使用吧。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/448757.shtml

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

相关文章

d3代码如何改造成update结构(恰当处理enter和exit)

d3的enter和exit 网上有很多blog讲解。说的还凑合的见&#xff1a;https://blog.csdn.net/nicolecc/article/details/50786661 如何把自己的rude绘图代码&#xff0c;进行精致化&#xff08;update&#xff09; 不多比比&#xff0c;上代码示例&#xff1a; d3.selectAll(.circ…

退居二线VS在深圳发展,一个十年IT人的选择之难

有的人一直以来&#xff0c;身体里彷佛住着两个灵魂。一个灵魂说&#xff1a;人就要拼搏&#xff0c;要奋斗&#xff0c;要实现理想&#xff0c;要留在中国最繁华的城市&#xff0c;感受大都市的生活&#xff0c;实现个人价值&#xff0c;走上人生巅峰&#xff01;另一个灵魂说…

Jenkins 详细安装、构建部署 使用教程

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 Jenkins是一个开源软件项目&#xff0c;是基于Java开发的一种持续集成工具&#xff0c;用于监控持续重复的工作&#xff0c;功能包括&…

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

前几天技术大牛Vczh同学开发了一个函数图像绘制程序&#xff0c;可以画出方程f(x,y)0的图像。他的原理是用图像上每一点的坐标带入函数f得到针对x和y的两个方程&#xff0c;再用牛顿迭代法求解得到一组点集&#xff0c;然后画到图像上。用他的程序可以画出各种各样令人惊叹的方…

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

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…