在 初探 C# GPU 通用计算技术 中,我使用 Accelerator 编写了一个简单的 GPU 计算程序。也简单看了一些 Brahma 的代码,从它的 SVN 最新代码看,Brahma 要转移到使用 OpenCL.Net 作为底层了,于是也去网上搜索了一下,发现了 OpenCL.Net 和另一个相关的项目 OpenCLTemplate。

看了一些它的代码,颇像 DirectCompute 的风格,其 GPU 程序是标准 C 代码,所以编写和阅读也容易一些,而 Host 程序是 C# 的,把 GPU 代码字符串传给编译器进行编译,然后就可以在 C# 对它进行调用,并且取回结果了。

安装了 ati-stream-sdk-v2.1-vista-win7-64,折腾了一下它的例子程序 FirstOpenCLProgram,运行时会抛出一个 InvalidContext 的异常,到它的论坛去问,版主建议我安装 ati 最新 driver 先,虽然觉得本本刚买没几天,应该驱动比较新,还是去安装了最新的驱动,果然不再报异常了。只是如果直接引用 OpenCLTemplate 下的 OpenCL.NET.dll 和 OpenCLTemplate.dll 的话,在初始化的时候会报空指针;而引用 FirstOpenCLProgram 下的这两个 dll 的话,则初始化时会闪现好几个控制台窗口,但是后续都是正常的。

既然正常了,就还是以上次那个程序,来看看 OpenCL 的方式,会不会有更大的速度提升。

使用 OpenCL 的程序代码如下:

代码

private const int GridSize = 1024; private readonly float[] _map;private const string Code = @" __kernel void Test(__global float* v1) {int i = get_global_id(0);float p = v1[i];v1[i] = p * p * p / 4 + 194; }"; private readonly CLCalc.Program.Kernel _test; private readonly CLCalc.Program.Variable _vmap; private readonly CLCalc.Program.Variable[] _args; private readonly int[] _workers;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;}}CLCalc.InitCL();CLCalc.Program.Compile(new[] { Code });_test = new CLCalc.Program.Kernel("Test");_vmap = new CLCalc.Program.Variable(_map);_args = new[] { _vmap };_workers = new[] { GridSize * GridSize };Render(); }private void Start_Click(object sender, EventArgs e) {var stopwatch = new Stopwatch();stopwatch.Start();_test.Execute(_args, _workers);_vmap.ReadFromDeviceTo(_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 * GridSize + y * 2]));}}pictureBox1.Image = workingBitmap; }

运行程序,点击 4 次按钮,显示图形和前两个程序相同,说明程序运算正常,4 次时间为:8、8、7、8。比使用 Accelerator 的程序速度也快了 5 倍以上。

因为是标准 C 程序,所以我们的自由度很大,我也在 OpenCL 下实现了一下 Life 游戏,C# 部分的代码就不贴了,GPU 代码如下:

代码

#define width 512 #define length 262144int GetValue(__global int* v, int index) {if(index < 0 || index >= length){return 0;}return v[index] == 0 ? 0 : 1; };__kernel void Test(__global int* v) {int i = get_global_id(0);int topLeft = GetValue(v, i - width - 1);int top = GetValue(v, i - width);int topRight = GetValue(v, i - width + 1);int left = GetValue(v, i - 1);int current = GetValue(v, i);int right = GetValue(v, i + 1);int bottomLeft = GetValue(v, i + width - 1);int bottom = GetValue(v, i + width);int bottomRight = GetValue(v, i + width + 1);int liveNeighbors = topLeft + top + topRight + left + right + bottomLeft + bottom + bottomRight;if(current > 0){v[i] = ((liveNeighbors < 2) || (liveNeighbors > 3)) ? 0 : 255;}else{v[i] = (liveNeighbors == 3) ? 255 : 0;} };

很长时间不用 C,有很多像函数声明顺序等规则都忘了,好的一点是 OpenCL.Net 中还提供了 OpenCLCodeChecker,用来进行代码检测,同时也在侧边栏里提供了语言帮助,只是它的检测稍嫌弱智,代码稍微复杂,提示的错误位置很奇怪,有时候告知编译出错,Log 里面却没有任何错误信息。不过总体来说,帮助还是很大就是了。

这个 Life 程序,有一个小 Bug,在于没有判断超出右边界的代码,所以如果左边有生物,右边虽然原来没有生物,也会无中生有 :)

总的来说,用 OpenCL.Net 编程,感觉还是很愉快的。

使用 OpenCL.Net 进行 C# GPU 并行编程相关推荐

  1. openacc的Linux安装教程,科学网—opensuse 13.1 系统 openACC编译器使用及GPU并行编程环境配置 - 马小军的博文...

    本文讲述opensuse13.1系统openACC编译器使用及GPU并行编程环境配置. 这里以笔记本显卡驱动为NVIDIA为例 在安装前,请确保系统已经安装kernel-devel ,kernel-s ...

  2. matlab gpuarray是什么,MATLAB GPU并行编程

    gpuArray MATLAB中的gpuArray表示存储在GPU上的数据.使用gpuArray函数可以将数据从MATLAB工作空间传送到GPU.例如: A = data(10); G = gpuAr ...

  3. GPU 并行编程- Inclusive Scan 全面扫描算法

    定义 扫描操作采用二进制关联运算符 ⨁\bigoplus⨁(circle plus)和一个有n个元素的数组组成. 数组为 [x0,x1,......,xn−1][x_0,x_1,......,x_{n ...

  4. CPU并行与GPU并行联系及区别

    主要参考博文:https://blog.csdn.net/ustcbob/article/details/38677603 应用特点:GPU并行吞吐量大,适合大数据并行处理:CPU适合逻辑处理和串行计 ...

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

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

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

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

  7. 从头开始进行CUDA编程:Numba并行编程的基本概念

    作者 | CarlosCosta 编辑 | 极市平台 点击下方卡片,关注"自动驾驶之心"公众号 ADAS巨卷干货,即可获取 点击进入→自动驾驶之心[模型部署]技术交流群 后台回复[ ...

  8. GPU及GPU通用计算编程模型简介

    以下内容来自网络总结: NVIDIA公司在1999年发布GeForce256时首先提出GPU(图形处理器)的概念,随后大量复杂的应用需求促使整个产业蓬勃发展至今. GPU英文全称Graphic Pro ...

  9. C++ AMP异构并行编程解析

    C++ AMP异构并行编程解析 原文发表于<程序员>杂志2012年第4期,略有改动. 文 / 陈冠诚 微软在今年2月份的GoingNative大会上正式对外发布了C++ AMP(Accel ...

最新文章

  1. 深入浅出WPF——附加事件(Attached Event)
  2. 编译Linux内核的详细过程
  3. sql 按时间二段排序
  4. 利用melendy插入参考文献_四苯基卟啉在改性磷酸锆层间的插入及荧光增强
  5. [Node.js] 模块化 -- 中间件和跨域
  6. MVC 使用Jquery实现AJax
  7. MssqlOnLinux 主从集群【2】
  8. win11beta版如何升级正式版 Windows11beta升级正式版的步骤方法
  9. Oracle 11g vs 12c 内存、优化器等默认参数对比
  10. 2011年国庆老家记录
  11. 商城购物车php代码,php网上商城购物车代码一例
  12. OD调试初体验—关闭x86版winrar广告弹窗
  13. Windows 7安装超级终端连接COM口设备
  14. linux syslinux u盘,如何使用syslinux做一个开启U盘?
  15. 万字长文深度剖析面向对象的javascript
  16. C#如何遍历文件夹下的所有文件
  17. SAP ABAP——数据类型(一)【数据类型概要及分类】
  18. python如何期货交易_能用python的期货交易软件
  19. easyuefi只能在基于uefi启动的_只需2个命令,就能将win10 BIOS启动方式转换为UEFI,你见过吗!...
  20. 遇到爬虫、接口盗刷怎么办?反爬虫组件来助你

热门文章

  1. 深入解析java web_java进阶--深入分析java Web
  2. 您需要来自pc的权限才能_微信电脑版还是鸡肋吗?微信PC版3.0内测体验
  3. 超好的Git学习网站
  4. 【HDU - 5012】Dice(模拟,bfs)
  5. 【HDU - 5883】The Best Path(判断欧拉回路)
  6. *【HDU - 1517】【POJ - 2505】A Multiplication Game(博弈,递推找规律或SG函数)
  7. 两组的数据平均值合并_不要进入数据陷进
  8. oracle导出建表主键,oracle主键自动生成 配合hibernate的生成策略详解
  9. mysql爆内存_线上MySQL数据库机器内存爆掉原因分析与解决
  10. 编译安装mysql5.6.36_MySQL5.6.36编译安装