在C#中的GPU加速——AleaGPU學(xué)習(xí)筆記(一)

最近一直在想,C++中有CUDA硬鞍,但是寫(xiě)代碼有時(shí)候會(huì)覺(jué)得過(guò)于麻煩贰镣,再加上筆者經(jīng)常在一個(gè)三維設(shè)計(jì)軟件Rhinoceros上做網(wǎng)格算法開(kāi)發(fā)呜象,C#相較于C++顯得更為友好。因此筆者就在尋找支持C#的GPU加速庫(kù)碑隆,結(jié)果最終找到了AleaGPU恭陡,這個(gè)庫(kù)看上去已經(jīng)做的非常完善了,基于.Net上煤,安裝配置十分方便休玩,并且也支持CUDA編程。因此我就打算寫(xiě)本系列筆記記錄自己的學(xué)習(xí)過(guò)程劫狠。

Alea GPU簡(jiǎn)介

這里直接Google翻譯簡(jiǎn)介部分了:
使用Alea GPU拴疤,您可以利用這種處理能力在Windows,Linux和Mac OS X上以簡(jiǎn)單有效的方式來(lái)加速.NET和Mono應(yīng)用程序独泞。您可以使用.NET語(yǔ)言和已知工具來(lái)開(kāi)發(fā)GPU代碼呐矾。Alea GPU運(yùn)行時(shí)系統(tǒng)可有效處理GPU上的執(zhí)行以及所有內(nèi)存管理。

簡(jiǎn)單來(lái)說(shuō)Alea GPU的關(guān)鍵字是: 高效懦砂、易學(xué)蜒犯、快速、跨平臺(tái)
具體來(lái)說(shuō):

  • 跨平臺(tái):無(wú)論是Windows, Linux和Mac OS X上都能用荞膘。
  • 具有自動(dòng)化內(nèi)存管理的功能:這對(duì)于GPU編程初學(xué)者較友好
  • 支持CUDA生態(tài):也就是說(shuō)那些cuBlas罚随,cuRand和cuDNN在Alea GPU里都能用
  • 安裝簡(jiǎn)單:不必多說(shuō)了,NuGet軟件包一鍵安裝
  • 統(tǒng)一了CPU和GPU類(lèi)型:.NET數(shù)組和許多.NET類(lèi)型可以直接在GPU代碼中使用羽资,包括諸如數(shù)組長(zhǎng)度之類(lèi)的屬性
  • 高性能:速度與CUDA C/C++一樣快
  • 文檔和示例豐富(不過(guò)就筆者目前來(lái)看淘菩,這一點(diǎn)必須吐槽,因?yàn)楣倬W(wǎng)上的文檔資料并不多屠升,其他論壇上幾乎沒(méi)有資料潮改,stack overflow上也只有寥寥幾個(gè)相關(guān)問(wèn)題)

想看更多深入了解Alea GPU可以直接訪問(wèn)Alea GPU

兩種編程模型

Parallel-For and Parallel Aggregation

Alea GPU Parallel-For可以對(duì)集合中的每個(gè)元素或有序區(qū)間的每個(gè)索引并行地執(zhí)行l(wèi)ambda表達(dá)式腹暖、委托或在GPU上執(zhí)行的函數(shù)汇在。Alea GPU Parallel Aggregation是用于借助二進(jìn)制函數(shù),委托或lambda表達(dá)式將多個(gè)輸入聚合為最終值微服。結(jié)合Alea GPU自動(dòng)化內(nèi)存管理趾疚,開(kāi)發(fā)人員可以編寫(xiě)并行GPU代碼,就像編寫(xiě)串行循環(huán)一樣以蕴。
說(shuō)白了糙麦,這是為沒(méi)有接觸過(guò)GPU編程的用戶(hù)設(shè)計(jì)的,用戶(hù)可以像使用CPU上的并行Parallel.For()一樣來(lái)使用Gpu.For()來(lái)實(shí)現(xiàn)GPU并行丛肮,需要注意的是赡磅,GPU上的并行傳入傳出只能為數(shù)組和指針。

CUDA

為了獲得最大的靈活性宝与,Alea GPU還提供了CUDA編程模型焚廊。它旨在通過(guò)大量線程執(zhí)行數(shù)據(jù)并行工作負(fù)載冶匹。CUDA 向程序員提出了諸如線程(Threads),線程塊(Thread Blocks)或網(wǎng)格(Grid)之類(lèi)的并行概念咆瘟,以便用靈活而抽象的方式將并行計(jì)算映射到GPU線程嚼隘。CUDA還向程序員給出了GPU內(nèi)存層次結(jié)構(gòu)。他可以利用不同的內(nèi)存類(lèi)型來(lái)優(yōu)化內(nèi)存訪問(wèn)和IO帶寬袒餐。
通過(guò)筆者近期一個(gè)月的使用體驗(yàn)來(lái)看飞蛹,一部分的CUDA功能已經(jīng)被移植到Alea GPU,但是仍有一小部分功能沒(méi)有灸眼,比如僅在設(shè)備端拷貝一個(gè)數(shù)組中的某一個(gè)元素卧檐,這在Alea GPU中沒(méi)有提供對(duì)應(yīng)的方法,它只能一次拷貝出所有的數(shù)據(jù)焰宣,由于對(duì)于GPU編程而言霉囚,當(dāng)數(shù)據(jù)量足夠大時(shí),計(jì)算所花費(fèi)的時(shí)間要小于Device與Host之間的傳輸速度匕积,因此這一點(diǎn)會(huì)非常影響程序的效率盈罐。

注意事項(xiàng):

  • 在CUDA中我們稱(chēng)GPU為Device,稱(chēng)CPU為Host闸天,以此來(lái)強(qiáng)調(diào)一個(gè)事實(shí)暖呕,即 GPU 是一個(gè)物理上獨(dú)立的設(shè)備斜做,是主機(jī)的一個(gè)協(xié)同處理器苞氮。
  • Alea GPU不支持CUDA 9.0以上版本

關(guān)于CUDA GPU編程的相關(guān)知識(shí)可以看我之前的筆記:CUDA筆記

安裝Alea

Alea的安裝配置非常方便,只需要右鍵單擊引用->管理NuGet程序包瓤逼,在瀏覽里搜索Alea笼吟,點(diǎn)擊安裝即可。


Alea安裝

不過(guò)需要注意的是霸旗,由于AleaGPU是F#寫(xiě)的贷帮,因此還需要安裝一個(gè)FSharp.Core,同樣在NuGet包管理那里搜索FSharp.Core安裝即可诱告。


記得安裝FSharp.Core

第一個(gè)案例文件

從官網(wǎng)上下載下來(lái)了第一個(gè)案例文件撵枢,這段代碼是用來(lái)反饋gpu設(shè)備信息的

using System;
using System.Linq;
using Alea;

namespace DeviceQuery
{
    class Program
    {
        static void Main()
        {
            var devices = Device.Devices;
            var numGpus = devices.Length;
            foreach (var device in devices)
            {
                device.Print();

                // note that device ids for all GPU devices in a system does not need to be continuous
                var id = device.Id;
                var arch = device.Arch;
                var numMultiProc = device.Attributes.MultiprocessorCount;
            }

            // all device ids
            var deviceIds = devices.Select(device => device.Id);

            Console.ReadKey();
        }
    }
}
案例程序一的輸出結(jié)果
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
禁止轉(zhuǎn)載,如需轉(zhuǎn)載請(qǐng)通過(guò)簡(jiǎn)信或評(píng)論聯(lián)系作者精居。
  • 序言:七十年代末锄禽,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子靴姿,更是在濱河造成了極大的恐慌沃但,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,539評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件佛吓,死亡現(xiàn)場(chǎng)離奇詭異宵晚,居然都是意外死亡垂攘,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評(píng)論 3 396
  • 文/潘曉璐 我一進(jìn)店門(mén)淤刃,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)晒他,“玉大人,你說(shuō)我怎么就攤上這事逸贾∫敲ⅲ” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,871評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵耕陷,是天一觀的道長(zhǎng)掂名。 經(jīng)常有香客問(wèn)我,道長(zhǎng)哟沫,這世上最難降的妖魔是什么饺蔑? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,963評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮嗜诀,結(jié)果婚禮上猾警,老公的妹妹穿的比我還像新娘。我一直安慰自己隆敢,他們只是感情好发皿,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,984評(píng)論 6 393
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著拂蝎,像睡著了一般穴墅。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上温自,一...
    開(kāi)封第一講書(shū)人閱讀 51,763評(píng)論 1 307
  • 那天玄货,我揣著相機(jī)與錄音,去河邊找鬼悼泌。 笑死松捉,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的馆里。 我是一名探鬼主播隘世,決...
    沈念sama閱讀 40,468評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼鸠踪!你這毒婦竟也來(lái)了丙者?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤慢哈,失蹤者是張志新(化名)和其女友劉穎蔓钟,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體卵贱,經(jīng)...
    沈念sama閱讀 45,850評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡滥沫,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,002評(píng)論 3 338
  • 正文 我和宋清朗相戀三年侣集,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片兰绣。...
    茶點(diǎn)故事閱讀 40,144評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡世分,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出缀辩,到底是詐尸還是另有隱情臭埋,我是刑警寧澤,帶...
    沈念sama閱讀 35,823評(píng)論 5 346
  • 正文 年R本政府宣布臀玄,位于F島的核電站瓢阴,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏健无。R本人自食惡果不足惜荣恐,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,483評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望累贤。 院中可真熱鬧叠穆,春花似錦、人聲如沸臼膏。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,026評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)渗磅。三九已至嚷硫,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間夺溢,已是汗流浹背论巍。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,150評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工烛谊, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留风响,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,415評(píng)論 3 373
  • 正文 我出身青樓丹禀,卻偏偏與公主長(zhǎng)得像状勤,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子双泪,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,092評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容