使用 OpenCL.Net 进行 C# GPU 并行编程
2010-05-24 20:47
756 查看
在 初探 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 的程序代码如下:
代码
很长时间不用 C,有很多像函数声明顺序等规则都忘了,好的一点是 OpenCL.Net 中还提供了 OpenCLCodeChecker,用来进行代码检测,同时也在侧边栏里提供了语言帮助,只是它的检测稍嫌弱智,代码稍微复杂,提示的错误位置很奇怪,有时候告知编译出错,Log 里面却没有任何错误信息。不过总体来说,帮助还是很大就是了。
这个 Life 程序,有一个小 Bug,在于没有判断超出右边界的代码,所以如果左边有生物,右边虽然原来没有生物,也会无中生有 :)
总的来说,用 OpenCL.Net 编程,感觉还是很愉快的。
看了一些它的代码,颇像 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 的程序代码如下:
代码
#define width 512 #define length 262144 int 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 并行编程
- 使用 OpenCL.Net 进行 C# GPU 并行编程
- 使用C#+ASP.NET来进行RSA(非对称)加密.
- android c#.net使用socket进行局域网多文件传输
- .Net平台 C# 程序, 使用DILE(Dotnet IL Editor) 进行动态调试
- Asp.net C# 使用Newtonsoft.Json 进行通信
- ASP.NET(C#)使用证书进行SSL安全通信
- 【原创】开源Math.NET基础数学类库使用(08)C#进行数值积分
- 开源Math.NET基础数学类库使用(10)C#进行基本数据统计
- 【原创】开源Math.NET基础数学类库使用(10)C#进行基本数据统计
- 详解如何使用C#.NET进行注册表项和键值的创建、删除、修改、获取等操作
- 开源Math.NET基础数学类库使用(08)C#进行数值积分
- 【原创】开源Math.NET基础数学类库使用(10)C#进行基本数据统计
- android 平台上使用opencl 调用gpu 进行加速
- 安卓下使用OpenCL进行PowerVR GPU编程
- Windows Mobile 下使用C#进行GPRS、CDMA开发- Visual Studio.NET
- C#实现多级子目录Zip压缩解压实例 NET4.6下的UTC时间转换 [译]ASP.NET Core Web API 中使用Oracle数据库和Dapper看这篇就够了 asp.Net Core免费开源分布式异常日志收集框架Exceptionless安装配置以及简单使用图文教程 asp.net core异步进行新增操作并且需要判断某些字段是否重复的三种解决方案 .NET Core开发日志
- HOW TO:使用 C# .NET 进行 GET 请求
- ASP.NET(C#)使用证书进行SSL安全通信
- C# 使用ffmpeg.exe进行音频转换完整demo-asp.net转换代码