使用 OpenCL.Net 進行 C# GPU 并行編程

在 初探 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 編程,感覺還是很愉快的。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/448761.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/448761.shtml
英文地址,請注明出處:http://en.pswp.cn/news/448761.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

模擬真實環境之內網漫游

0x00 前言 目標ip&#xff1a;192.168.31.55&#xff08;模擬外網&#xff09; 目的&#xff1a;通過一個站點滲透至內網&#xff0c;發現并控制內網全部主機 0x01 信息收集 用nmap進行端口探測 瀏覽站點時查看元素發現該站點是DotNetCMS v2.0 該版本cms存在SQL注入漏洞&#x…

iOS開發之普通網絡異步請求與文件下載方法

先來說說普通異步下載方法&#xff0c;分為POST、GET兩種 /** GET請求獲取數據*/(void)getDataWithUrl:(NSString *)strUrl finishBlock:(ECGNCNSDictionaryAndNSErrorBlock)finishBlock {if (strUrl.length 0) {return;}NSURL *url [NSURL URLWithString:strUrl];NSMutableU…

超簡單:解析 yml 類型(application.yml)配置文件 、springboot 工程讀取 yml 文件中的值

方法三是我覺得最簡單的。 前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 1. 工程結構&#xff1a; 2. 我要讀取 application.yml 中屬性 &#xff1a;spring.rocketmq.namesrvAddr …

初探 C# GPU 通用計算技術

GPU 的并行計算能力高于 CPU&#xff0c;所以最近也有很多利用 GPU 的項目出現在我們的視野中&#xff0c;在 InfoQ 上看到這篇介紹 Accelerator-V2 的文章&#xff0c;它是微軟研究院的研究項目&#xff0c;需要注冊后才能下載&#xff0c;感覺作為我接觸 GPU 通用運算的第一…

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