GPU并行計算版函數圖像生成器

前幾天技術大牛Vczh同學開發了一個函數圖像繪制程序,可以畫出方程f(x,y)=0的圖像。他的原理是用圖像上每一點的坐標帶入函數f得到針對x和y的兩個方程,再用牛頓迭代法求解得到一組點集,然后畫到圖像上。用他的程序可以畫出各種各樣令人驚嘆的方程圖形。但是他的程序非常慢,因為對每一個點坐標都用牛頓迭代法求解是一項很費時的任務,即使采用了Parallel.For,CPU算起來也很吃力。我研究了他的程序之后覺得可以用擅長并行計算的顯卡來加速迭代法求解的過程。用OpenCL來完成這個任務再合適不過了。

?

整個過程還是相當順利的,完全在Vczh原始程序的基礎上改成。僅稍微改變了策略。步驟如下:

  1. 解析輸入函數f之后,分別生成?f/?x和?f/?y兩個偏導數,然后將這三個二元函數轉化為合法的OpenCL表達式。
  2. 用OpenCL實現牛頓迭代法。
  3. 將圖像上的每一點分派到一個OpenCL線程,然后由無數并行的OpenCL線程計算自己的點。

?

其中OpenCL代碼如下:

fp_t func(fp_t x, fp_t y) 
{   return {動態生成}; 
}fp_t df_dx(fp_t x, fp_t y)
{return {動態生成};
}fp_t df_dy(fp_t x, fp_t y)
{return {動態生成};
}fp_t solvex(fp_t start, const fp_t consty)
{for (int i = 0; i < MAX_ITER; ++i){fp_t result = func(start, consty);if (result <= EPSILON && result >= -EPSILON){return start;}fp_t d = df_dx(start, consty);if (d <= EPSILON && d >= -EPSILON){return NAN;}else{start -= result / d;}}return NAN;
}kernel void ComputeX(global write_only fp_t* points,int unit,int width,int cx,int cy,float origin_x,float origin_y)
{int gx = get_global_id(0);int gy = get_global_id(1);uint write_loc = gx + gy * width;fp_t py = origin_y + (fp_t)(gy + 1 - cy) / unit;fp_t px = origin_x + (fp_t)(cx - gx - 1) / unit;points[write_loc] = solvex(px, py);
}

這是求解f(x, a) = 0部分的代碼,求解f(b, y) = 0的與之基本一樣。其中fp_t是根據情況定義的typedef,可能是float或double。因為不是所有的OpenCL設備都支持雙精度浮點,所以要寫成通用類型的算法,用宏來控制。

?

在.NET中使用OpenCL,最容易的方法當然是使用Cloo庫。Coo庫完整地封裝了OpenCL(1.1)的所有函數,并且是.NET非常容易使用的對象模型。我只使用了一次Cloo和OpenCL就再也不想忍受DirectX ComputeShader那麻煩的要死的類庫。。

?

我的程序源代碼已經完全上傳到github。地址是:https://github.com/Ninputer/opencl-plot 點擊Download即可打包下載所有代碼。想直接運行的朋友可以點擊此處下載二進制文件包。

?

要想運行這個程序,你必須安裝了OpenCL的實現平臺。目前Windows上的OpenCL主要有NVidia、AMD和Intel幾家提供的實現平臺。如果你有一塊比較新的NVidia或AMD顯卡,那么只需要裝了最新的驅動包就自帶了OpenCL。以下顯卡支持雙精度浮點:NVidia GeForce 200系列、400系列、500系列顯卡;AMD Radeon HD 5800、5900、6900系列。其中Radeon 6900系列尚不支持官方雙精度浮點數(cl_khr_fp64)擴展,所以本程序也支持cl_amd_fp64雙精度浮點擴展,功能上完全一樣。G80和RV770等架構的顯卡以及AMD中低端顯卡只能支持單精度浮點數,繪制時的精度可能會略差。

?

沒有支持OpenCL顯卡的同學也可以用多核CPU來進行OpenCL計算,仍然要比原始的C#版本快一些。如果使用Intel Core i3、i5、i7系列CPU,可以使用Intel OpenCL SDK,下載地址:http://software.intel.com/en-us/articles/opencl-sdk/ 其他多核CPU都可以使用AMD APP SDK,下載地址:http://developer.amd.com/sdks/AMDAPPSDK/downloads/Pages/default.aspx

?

啟動程序后允許先選擇OpenCL計算平臺和設備,如果安裝了多個OpenCL平臺可以任意選擇。目前本程序暫時不支持多顯卡并聯技術(SLI、Crossfire)。NVidia CUDA平臺界面示例:

image

?

AMD APP平臺界面示例:

image

?

Intel OpenCL平臺界面示例:

image

?

現在,輸入方程,充分發揮你的想象力吧!

image

image

image

image

注意采用顯卡計算時,最好不要進行游戲,用IE9瀏覽網頁等,負荷過重時可能會導致GPU重置。如果某些公式運算量太大,或顯卡較為低端,也容易導致GPU重置,請務必用Windows 7和Vista來進行實驗,因為WDDM驅動模型更加穩定(用XP容易藍屏)。

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

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

相關文章

完全平方公式、平方差公式、一個數負次方

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…

幸福秘訣 男女必須要看哦

女人說&#xff1a;這一輩子最大的成功是什么?我認為是找到一個真正疼自己的老公,有了老公的支持才可以把事業做得有聲有色,有一個幸福的家和一個可愛的寶寶。 男人說&#xff1a;我的成功是在我的人生之中&#xff0c;是妻子和我形影相隨&#xff0c;朝夕相伴。她是我身邊…

解決:If the number of processors is expected to increase from one, then you should configure the numbe

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 1. 按官方說明用 docker 部署 rocketmq ,啟動 broker 報錯&#xff1a; OpenJDK 64-Bit Server VM warning: If the number of processo…

JAVA-緩存機制

本地緩存 繼承AbstractBaseLocalCache&#xff0c;并實現相應的抽象方法&#xff1b;適用于單實例項目或不會經常變化的數據&#xff1b;代碼示例&#xff1a;/*** 倉庫信息緩存類*/ Service public class WarehouseCache extends AbstractBaseLocalCache<Long, Warehouse&g…

騰訊QQ團隊開源分布式后臺毫秒服務引擎全解析:引擎架構、RPC、灰度……

騰訊QQ團隊將于12月4日開源一個服務開發運營框架&#xff0c;叫做毫秒服務引擎&#xff08;Mass Service Engine in Cluster&#xff0c;MSEC&#xff09;&#xff0c;它集RPC、名字發現服務、負載均衡、業務監控、灰度發布、容量管理、日志管理、Key-Value存儲于一體&#xff…