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”的异常,看来还需要等它完善之后才能使用吧。

初探 C# GPU 通用计算技术相关推荐

  1. 基于CUDA的GPU并行计算技术实现网课课表编排

    这篇文章是用来填这个坑的:https://blog.csdn.net/xinew4712/article/details/108276264 上篇文末设想的是用天灾和定向改造机制来提高排课运算的效率, ...

  2. 使用 OpenCL.Net 进行 C# GPU 并行编程

    在 初探 C# GPU 通用计算技术 中,我使用 Accelerator 编写了一个简单的 GPU 计算程序.也简单看了一些 Brahma 的代码,从它的 SVN 最新代码看,Brahma 要转移到使 ...

  3. volta架构 微型计算机,性能大爆炸 NVIDIA新GPU架构曝光

    一年一度的GTC大会目前正在大洋彼岸的美国加利福尼亚州圣何塞市召开,这是由NVIDIA主办的GPU通用计算技术大会,号称是"图形技术巫师"们的聚会. 几乎每次GTC大会上NVIDI ...

  4. GPU图形处理器与CPU区别

    显卡的处理器称为图形处理器(GPU),它是显卡的"心脏",与CPU类似,只不过GPU是专为执行复杂的数学和几何计算而设计的,这些计算是图形渲染所必需的.某些最快速的GPU集成的晶体 ...

  5. gpu超算算法_GPU: 超算加速

    在2010年5月份出炉的一份世界超级计算机500强的榜单中,美国Cray的美洲豹"Jaguar",凭借每秒1750万亿次的实测计算能力傲视群雄,排名榜首.但是时隔不久,由中国国防科 ...

  6. GPU通用计算调研报告

    摘要:NVIDIA公司在1999年发布GeForce256时首先提出GPU(图形处理器)的概念,随后大量复杂的应用需求促使整个产业蓬勃发展至今.GPU在这十多年的演变过程中,我们看到GPU从最初帮助C ...

  7. 异构计算(CPU + GPU)编程简介

    异构计算(CPU + GPU)编程简介 1.概念 所谓异构计算,是指CPU+ GPU或者CPU+ 其它设备(如FPGA等)协同计算.一般我们的程序,是在CPU上计算.但是,当大量的数据需要计算时,CP ...

  8. CPU+GPU异构计算编程简介

    异构计算(CPU + GPU)编程简介 1. 概念 所谓异构计算,是指CPU+ GPU或者CPU+ 其它设备(如FPGA等)协同计算.一般我们的程序,是在CPU上计算.但是,当大量的数据需要计算时,C ...

  9. GPU和CUDA基础介绍

    转载自http://blog.csdn.net/fengbingchun/article/details/54691225 一.GPU简介 1985年8月20日ATi公司成立,同年10月ATi使用AS ...

最新文章

  1. 棋盘上的孙子兵法之我见
  2. CommonsMultipartFile 转为 File 类型
  3. 【Nginx】错误: [emerg] “proxy_pass“ cannot have URI part in location given by regular expression,...
  4. AuthFailed at /social-auth/complete/facebook/
  5. ipad iphone开发_如何在iPhone或iPad上更改应用程序的语言
  6. Cache工作原理,Cache一致性,你想知道的都在这里
  7. 21 个 curl 命令练习 | Linux 中国
  8. laravel sql多个orWhere条件时数据查询错误
  9. 卷积神经网络处理猫和狗图片(改进网络)
  10. centos 编译Qt5 mysql驱动_centos7安装编译mysql的驱动的问题
  11. maskrcnn配置 模块‘keras.engine‘没有属性“Layer”
  12. 使用allegro画PCB的基本流程:
  13. python车牌识别使用训练集_TensorFlow基于MNIST数据集实现车牌识别(初步演示版)
  14. 用continue计算100以内奇数和_一分钟明白break和continue
  15. 最优模型选择的准则:AIC、BIC准则
  16. 创建mysql视图索引_mysql 创建索引和视图
  17. ICCV2021 | TOOD:任务对齐的单阶段目标检测
  18. 自适应QP(Adaptive QP)
  19. 从零开始修炼电脑维修秘籍
  20. SAM/BAM相关的进阶知识

热门文章

  1. 【中国版Office 365 应用程序注册】
  2. a.pop啥意思python_python中pop什么意思
  3. Python 数据分析三剑客之 Pandas(四):函数应用、映射、排序和层级索引
  4. REVERSE-PRACTICE-BUUCTF-23
  5. oracle sparc 服务器系统,OracleSPARC服务器基础.PDF
  6. mysql一对一级联_MySQL 表的一对一、一对多、多对多问题
  7. 服务器怎么控制忽略样式_使用JavaScript来编写你的CSS样式代码——JSS
  8. CCNA-第八篇-OSPF-上
  9. 【HDU - 5468】Puzzled Elena(容斥原理,dfs序,数学,素因子分解,有坑)
  10. linux监控命令执行,你可能不知道的 即时监控 Linux 使用者执行指令的三种方法...