0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

使用CUDA并行化矩陣乘法加速Blender Python

星星科技指導(dǎo)員 ? 來(lái)源:NVIDIA ? 作者:NVIDIA ? 2022-04-24 17:04 ? 次閱讀

擬或 合成數(shù)據(jù) 生成是人工智能工具發(fā)展的一個(gè)重要趨勢(shì)。傳統(tǒng)上,這些數(shù)據(jù)集可用于解決低數(shù)據(jù)問(wèn)題或邊緣情況場(chǎng)景,而或許現(xiàn)在存在于可用的實(shí)際數(shù)據(jù)集中。

合成數(shù)據(jù)的新興應(yīng)用包括建立模型性能水平、量化適用領(lǐng)域,以及下一代系統(tǒng)工程,其中人工智能模型和傳感器是串聯(lián)設(shè)計(jì)的。

pYYBAGJlEruAAaZdAABmyZg_tPc927.png

圖 1 。 船舶合成孔徑雷達(dá)渲染: 相位圖 ( left ) ,壓縮圖像 ( right )。

Blender 是生成這些數(shù)據(jù)集的一個(gè)常用且引人注目的工具。它是免費(fèi)使用和開(kāi)源的,但同樣重要的是,它可以通過(guò)強(qiáng)大的 Python API 完全擴(kuò)展。 Blender 的這一特性使其成為視覺(jué)圖像渲染的一個(gè)有吸引力的選擇。因此,它已被廣泛用于此目的,有 18 +渲染引擎選項(xiàng)可供選擇。

集成到 Blender 中的渲染引擎(如 Cycles )通常具有緊密集成的 GPU 支持,包括最先進(jìn)的 NVIDIA RTX 支持。但是,如果在可視化渲染引擎之外需要高性能級(jí)別,例如合成 SAR 圖像的渲染,那么 Python 環(huán)境對(duì)于實(shí)際應(yīng)用程序來(lái)說(shuō)可能過(guò)于遲緩。加速這段代碼的一個(gè)選擇是使用流行的 Numba 包將 Python 代碼的部分預(yù)編譯成 C 。然而,這仍有改進(jìn)的余地,特別是在采用領(lǐng)先的 GPU 體系結(jié)構(gòu)進(jìn)行科學(xué)計(jì)算方面。

GPU 科學(xué)計(jì)算功能可直接從 Blender 中獲得,允許使用簡(jiǎn)單的統(tǒng)一工具,利用 Blender 強(qiáng)大的幾何體創(chuàng)建功能以及尖端計(jì)算環(huán)境。對(duì)于 blender2 。 83 +的最新變化,可以使用 CuPy (一個(gè)專門用于數(shù)組計(jì)算的 GPU 加速 Python 庫(kù))直接從 Python 腳本中完成。

根據(jù)這些想法,下面的教程將比較兩種不同的加速矩陣乘法的方法。第一種方法使用 Python 的 Numba 編譯器,而第二種方法使用 NVIDIA GPU-compute API, CUDA 。這些方法的實(shí)現(xiàn)可以在 rleonard1224/matmul GitHub repo 中找到,還有一個(gè) Dockerfile ,它設(shè)置了 anaconda 環(huán)境,從中可以運(yùn)行 CUDA – 加速的 Blender Python 腳本。

矩陣乘法算法

作為討論用于加速矩陣乘法的不同方法的前奏,我們簡(jiǎn)要回顧了矩陣乘法本身。

對(duì)于兩個(gè)矩陣的乘積[A*B]為了更好地定義[A]必須等于[B].

[A]然后是一個(gè)矩陣[m]行和[n]列,即[m*n]matrix.

[B]是一個(gè)[n*p]matrix.

產(chǎn)品[C=A.B]結(jié)果是[m*p]matrix.

如果[C],[A],和[B]使用數(shù)字 1 (即基于 1 的索引)進(jìn)行索引,然后是的第 i 行和第 j 列中的元素[C],[C[i,j]],

由以下公式確定:

latex.php?latex=%5BC%5Bi%2Cj%5D+%3D+%5CSigma_%7Br+%3D+1%7D%5E%7Bn%7D+A%5Bi%2Cr%5D+%5Ccdot+B%5Br%2Cj%5D%5D&bg=ffffff&fg=000&s=0&c=20201002

麻木加速度

通過(guò)使用 Numba 。 jit decorator ,可以將 Numba 編譯器應(yīng)用于 Python 腳本中的函數(shù)。通過(guò)預(yù)編譯到 C 中,在 Python 代碼中使用 numba 。 jit decorator 可以顯著減少循環(huán)的運(yùn)行時(shí)間。由于直接轉(zhuǎn)換為代碼的矩陣乘法需要嵌套 for 循環(huán),因此使用 numba 。 jit decorator 可以顯著減少用 Python 編寫(xiě)的矩陣乘法函數(shù)的運(yùn)行時(shí)間。 matmulnumba.py Python 腳本實(shí)現(xiàn)矩陣乘法并使用 numba 。 jit decorator 。

CUDA 加速度

在討論使用 CUDA 加速矩陣乘法的方法之前,我們應(yīng)該大致概述 CUDA 內(nèi)核的并行結(jié)構(gòu)。內(nèi)核啟動(dòng)中的所有并行進(jìn)程都屬于一個(gè)網(wǎng)格。網(wǎng)格由塊數(shù)組組成,每個(gè)塊由線程數(shù)組組成。網(wǎng)格中的線程組成了由 CUDA 內(nèi)核啟動(dòng)的基本并行進(jìn)程。圖 2 概述了這類并行結(jié)構(gòu)的示例。

pYYBAGJlEsSABbfvAADCrQ__-iQ419.png

圖 2 。 一個(gè)由 2 組成的 CUDA 核網(wǎng)格的并行結(jié)構(gòu)× 2 塊數(shù)組。每個(gè)塊由一個(gè) 2 × 2 個(gè)線程陣列。

既然已經(jīng)詳細(xì)說(shuō)明了 CUDA 內(nèi)核啟動(dòng)的并行結(jié)構(gòu),那么在 matmulcuda.py Python 腳本中用于并行化矩陣乘法的方法可以描述如下。

假設(shè)以下由一個(gè)由塊的二維數(shù)組組成的 CUDA 內(nèi)核網(wǎng)格計(jì)算,每個(gè)塊由線程的一維數(shù)組組成:

矩陣積[C=A.B]

[A]and[m*n]matrix

[B]and[n*p]matrix

[C]and[m*p]matrix

此外,進(jìn)一步假設(shè)如下:

網(wǎng)格 x 維中的塊數(shù) ([nblocksx]) 大于或等于[m]([nblocksx≥m])。

網(wǎng)格 y 維中的塊數(shù) ([nblocksy]) 大于或等于[p]([nblocksy≥p])。

每個(gè)塊中的線程數(shù) ([ntheads]) 大于或等于[n]([ntheads≥n])。

矩陣積的元素[C=A.B]可以通過(guò)為每個(gè)塊分配一個(gè)元素的計(jì)算來(lái)并行計(jì)算[C],[C[i,j].

您可以通過(guò)將指定給要執(zhí)行的塊的每個(gè)線程來(lái)獲得進(jìn)一步的并行增強(qiáng)[C],[C[i,j]分配,計(jì)算[n]和等于[C],[C[i,j].

為了避免競(jìng)爭(zhēng)條件,這些[n]積和結(jié)果的賦值[C],[C[i,j]可以使用 CUDA atomicAdd 函數(shù)處理。 atomicAdd 函數(shù)簽名由作為第一個(gè)輸入的指針和作為第二個(gè)輸入的數(shù)值組成。該定義將輸入的數(shù)值與第一個(gè)輸入所指向的值相加,然后將該和存儲(chǔ)在第一個(gè)輸入所指向的位置。

假設(shè)[C]初始化為零[tid(i,j)]表示屬于塊的線程的線程索引,其索引在塊的網(wǎng)格中[(i,j)]. 上述平行排列可通過(guò)以下方程式進(jìn)行總結(jié):

latex.php?latex=%5BC%5Bi%2Cj%5D+%3D+%5Ctextrm%7BatomicAdd%7D%28C%5Bi%2Cj%5D%2C+A%5Bi%2C+%5Ctextrm%7Btid%7D%28i%2Cj%29%5D+%5Ccdot+B%5B%5Ctextrm%7Btid%7D%28i%2Cj%29%2C+j%5D%29%5D&bg=ffffff&fg=000&s=0&c=20201002

圖 3 總結(jié)了兩個(gè)樣本矩陣乘法的并行排列[2*2].

2x2-grid-parallelized-625x275.png

圖 3 。兩個(gè) 2 的乘法的并行化方法× 2 個(gè)矩陣。每個(gè)塊被分配兩個(gè)矩陣乘積的一個(gè)元素,一個(gè)線程塊中的線程并行地計(jì)算乘積,以確定分配給塊的矩陣元素的值。

提速

圖 4 顯示了 CUDA 加速矩陣乘法相對(duì)于不同大小矩陣的 Numba 加速矩陣乘法的加速比。在該圖中,繪制了加速比以計(jì)算兩個(gè)[N*N]兩個(gè)矩陣的所有元素都等于一的矩陣。[N]范圍從一百到一千,增量為一百。

pYYBAGJlEtWACGWcAABSgX0TnGI314.png

圖 4 。兩個(gè) NxN 矩陣相乘時(shí) CUDA 加速矩陣相乘相對(duì)于 Numba 加速矩陣相乘的加速比。

今后的工作

考慮到 Blender 作為計(jì)算機(jī)圖形工具的作用,一個(gè)適用于 CUDA 加速的相關(guān)應(yīng)用領(lǐng)域涉及到通過(guò)光線跟蹤解決可見(jiàn)性問(wèn)題??梢?jiàn)性問(wèn)題可以概括如下: 相機(jī)存在于空間的某個(gè)點(diǎn)上,并且正在觀察由三角形元素組成的網(wǎng)格??梢?jiàn)性問(wèn)題的目標(biāo)是確定哪些網(wǎng)格元素對(duì)攝影機(jī)可見(jiàn),哪些網(wǎng)格元素被其他網(wǎng)格元素遮擋。

光線跟蹤可以用來(lái)解決可見(jiàn)性問(wèn)題。您試圖確定其可見(jiàn)性的網(wǎng)格由[N]網(wǎng)格元素。那樣的話,[N]可以生成以場(chǎng)景中的攝影機(jī)為原點(diǎn)的光線。這些端點(diǎn)位于[N]網(wǎng)格元素。

每條光線在不同的網(wǎng)格元素上都有一個(gè)端點(diǎn)。如果光線到達(dá)其端點(diǎn)時(shí)未被其他網(wǎng)格元素遮擋,則可以從攝影機(jī)中看到端點(diǎn)網(wǎng)格元素。圖 5 顯示了這個(gè)過(guò)程。

poYBAGJlEteADqybAACIB87vL5Y171.png

圖 5 。 從相機(jī)向場(chǎng)景中的人臉發(fā)射的兩條光線;一個(gè)面可見(jiàn),另一個(gè)面被遮擋。

使用光線跟蹤來(lái)解決可見(jiàn)性問(wèn)題的本質(zhì)使其成為

latex.php?latex=%5B%5Cmathcal%7BO%7D%28N%5E%7B2%7D%29%5D&bg=ffffff&fg=000&s=0&c=20201002

作為直接計(jì)算實(shí)現(xiàn)時(shí)的問(wèn)題。幸運(yùn)的是, NVIDIA 開(kāi)發(fā)了一個(gè)光線跟蹤庫(kù),名為 NVIDIA OptiX ,它使用 GPU 并行性來(lái)實(shí)現(xiàn)顯著的加速。在 Blender Python 環(huán)境中使用 NVIDIA OptiX 將帶來(lái)實(shí)實(shí)在在的好處。

概括

這篇文章描述了兩種不同的加速矩陣乘法的方法。第一種方法使用 Numba 編譯器來(lái)減少 Python 代碼中與循環(huán)相關(guān)的開(kāi)銷。第二種方法使用 CUDA 并行化矩陣乘法。速度比較證明了 CUDA 在加速矩陣乘法方面的有效性。

因?yàn)榍懊婷枋龅?CUDA 加速代碼可以作為 Blender Python 腳本運(yùn)行,所以可以在 Blender Python 環(huán)境中使用 CUDA 加速任意數(shù)量的算法。這大大提高了 blenderpython 作為科學(xué)計(jì)算工具的有效性。

關(guān)于作者

Eric Leonard 博士獲得了博士學(xué)位。在馬里蘭大學(xué)機(jī)械工程系,他專門從事理論和計(jì)算流體力學(xué)。研究生畢業(yè)后,他在馬薩諸塞州劍橋市的三菱 Ele CTR ic 研究實(shí)驗(yàn)室實(shí)習(xí),致力于開(kāi)發(fā)一種替代傳統(tǒng)計(jì)算流體力學(xué)算法的方法。在 Rendered 。 AI ,他使用 CUDA 加速了合成孔徑雷達(dá)仿真代碼庫(kù)。

Nathan Kundtz 博士是物理學(xué)家、工程師和企業(yè)家。他與建筑公司、杜克大學(xué)以及眾多其他組織合作,尋找并建立大公司。 Kundtz 博士擁有電子工程碩士學(xué)位和博士學(xué)位。來(lái)自杜克大學(xué)物理系。他的工作涵蓋了人工智能、超材料、微波器件和低溫凝聚態(tài)物理。著有或合著專利及專利申請(qǐng) 40 余項(xiàng),同行評(píng)議出版物 30 余篇;包括獲獎(jiǎng)的博士研究。 Kundtz 博士被 LinkedIn 評(píng)為 40 歲以下十大科技專業(yè)人士之一。他是高盛 100 位最具吸引力的企業(yè)家之一, 40 歲以下的 Puget Sound ,并入選杜克大學(xué)研究生院為數(shù)不多的 Glasson 社團(tuán)。

Ethan Sharratt 是 Rendered.AI 的軟件工程總監(jiān)。他有一個(gè)學(xué)士學(xué)位,在華盛頓大學(xué)的 EDE CTR 工程,目前正在一個(gè)碩士。他擁有 10 年在具有挑戰(zhàn)性的環(huán)境中構(gòu)建軟件和固件解決方案的經(jīng)驗(yàn),包括開(kāi)發(fā)空間等級(jí)軟件定義的無(wú)線電、信號(hào)和圖像處理以及實(shí)時(shí)計(jì)算機(jī)視覺(jué)管道。

Steven Forsyth 是 NVIDIA 的解決方案架構(gòu)師,專注于支持聯(lián)邦生態(tài)系統(tǒng)。他在激光干涉儀引力波天文臺(tái)工作了幾年,在那里他獲得了信號(hào)處理和高性能計(jì)算方面的經(jīng)驗(yàn)。在 NVIDIA ,他將從 LIGO 獲得的知識(shí)與深度學(xué)習(xí)的知識(shí)結(jié)合起來(lái),專門從事深度學(xué)習(xí)應(yīng)用,涉及廣泛的領(lǐng)域,包括計(jì)算機(jī)視覺(jué)和網(wǎng)絡(luò)安全。史蒂文最近從喬治亞理工學(xué)院畢業(yè),在那里他獲得了物理學(xué)學(xué)士學(xué)位。

審核編輯:郭婷

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • NVIDIA
    +關(guān)注

    關(guān)注

    14

    文章

    4855

    瀏覽量

    102711
  • CUDA
    +關(guān)注

    關(guān)注

    0

    文章

    121

    瀏覽量

    13585
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    Mali GPU編程特性及二維浮點(diǎn)矩陣運(yùn)算并行優(yōu)化詳解

    本文針對(duì)Mali-T604 GPU論述了基于OpenCL的Linux平臺(tái)上進(jìn)行通用計(jì)算并行優(yōu)化的方法,論述了Mali-T604 GPU的硬件特點(diǎn),并基于OpenCL設(shè)計(jì)了二維矩陣乘法并行
    發(fā)表于 08-07 17:12 ?2529次閱讀
    Mali GPU編程特性及二維浮點(diǎn)<b class='flag-5'>矩陣</b>運(yùn)算<b class='flag-5'>并行</b>優(yōu)化詳解

    #硬聲創(chuàng)作季 cuda_lecture3_part5_2_掃描并行實(shí)例

    并行編程語(yǔ)言CUDA
    Mr_haohao
    發(fā)布于 :2022年09月03日 15:02:11

    請(qǐng)問(wèn)Mali GPU的并行計(jì)算模型是怎樣構(gòu)建的?

    Mali T604 GPU的結(jié)構(gòu)是由哪些部分組成的?Mali T604 GPU的編程特性有哪些?Mali GPU的并行計(jì)算模型是怎樣構(gòu)建的?基于Mali-T604 GPU的快速浮點(diǎn)矩陣乘法
    發(fā)表于 04-19 08:06

    【KV260視覺(jué)入門套件試用體驗(yàn)】硬件加速之—使用PL加速矩陣乘法運(yùn)算(Vitis HLS)

    乘法的快速算法對(duì)科學(xué)計(jì)算有著極為重要的意義。 使用KV260硬件加速矩陣乘法運(yùn)算,會(huì)帶來(lái)以下好處: KV260中PL(FPGA)是一種可編程的邏輯器件,能夠?qū)崿F(xiàn)高度定制
    發(fā)表于 10-13 20:11

    支持優(yōu)化分塊策略的矩陣加速

    存儲(chǔ)器容量十分有限,計(jì)算大規(guī)模矩陣乘法時(shí)往往需要將矩陣劃分成細(xì)粒度的子塊計(jì)算任務(wù)。當(dāng)加速非均勻矩陣乘法
    發(fā)表于 11-25 10:38 ?3次下載
    支持優(yōu)化分塊策略的<b class='flag-5'>矩陣</b>乘<b class='flag-5'>加速</b>器

    基于Spark的矩陣分解并行算法

    針對(duì)傳統(tǒng)矩陣分解算法在處理海量數(shù)據(jù)信息時(shí)所面臨的處理速度和計(jì)算資源的瓶頸問(wèn)題,利用Spark在內(nèi)存計(jì)算和迭代計(jì)算上的優(yōu)勢(shì),提出了Spark框架下的矩陣分解并行算法。首先,依據(jù)歷史數(shù)據(jù)
    發(fā)表于 01-02 11:31 ?0次下載
    基于Spark的<b class='flag-5'>矩陣</b>分解<b class='flag-5'>并行</b><b class='flag-5'>化</b>算法

    基于深度學(xué)習(xí)的矩陣乘法加速器設(shè)計(jì)方案

    為滿足深度學(xué)習(xí)推理中對(duì)不同規(guī)模矩陣乘法的計(jì)算需求,提出一種基于 Zynq soc平臺(tái)的整數(shù)矩陣乘法加速器。采用基于總線廣播的
    發(fā)表于 05-25 16:26 ?3次下載

    新型的分布式并行稠密矩陣乘算法

    并行矩陣乘法是線性代數(shù)中最重要的基本運(yùn)算之一,同時(shí)也是許多科學(xué)應(yīng)用的基石。隨著高性能計(jì)算(HPC)向E級(jí)計(jì)算發(fā)展,并行矩陣
    發(fā)表于 06-01 14:33 ?5次下載

    面向數(shù)組計(jì)算任務(wù)而設(shè)計(jì)的Numba具有CUDA加速功能

    Numba 為 Python 開(kāi)發(fā)人員提供了一個(gè)進(jìn)入 GPU 加速計(jì)算的簡(jiǎn)單入口,并為使用日益復(fù)雜的 CUDA 代碼提供了一條路徑,只需使用最少的新語(yǔ)法和行話。
    的頭像 發(fā)表于 04-11 09:58 ?1518次閱讀

    一行Python代碼如何實(shí)現(xiàn)并行

    Python 在程序并行方面多少有些聲名狼藉。撇開(kāi)技術(shù)上的問(wèn)題,例如線程的實(shí)現(xiàn)和 GIL,我覺(jué)得錯(cuò)誤的教學(xué)指導(dǎo)才是主要問(wèn)題。
    的頭像 發(fā)表于 04-19 17:09 ?998次閱讀

    使用map函數(shù)實(shí)現(xiàn)Python程序并行

    Python 在程序并行方面多少有些聲名狼藉。撇開(kāi)技術(shù)上的問(wèn)題,例如線程的實(shí)現(xiàn)和 GIL,我覺(jué)得錯(cuò)誤的教學(xué)指導(dǎo)才是主要問(wèn)題。常見(jiàn)的經(jīng)典 Python 多線程、多進(jìn)程教程多顯得偏"重"
    的頭像 發(fā)表于 06-12 16:31 ?1662次閱讀

    如何在OpenCV中實(shí)現(xiàn)CUDA加速

    OpenCV4.x中關(guān)于CUDA加速的內(nèi)容主要有兩個(gè)部分,第一部分是之前OpenCV支持的圖像處理與對(duì)象檢測(cè)傳統(tǒng)算法的CUDA加速;第二部分是OpenCV4.2版本之后開(kāi)始支持的針對(duì)深
    的頭像 發(fā)表于 09-05 10:03 ?4992次閱讀

    CUDA矩陣乘法優(yōu)化手段詳解

    單精度矩陣乘法(SGEMM)幾乎是每一位學(xué)習(xí) CUDA 的同學(xué)繞不開(kāi)的案例,這個(gè)經(jīng)典的計(jì)算密集型案例可以很好地展示 GPU 編程中常用的優(yōu)化技巧。本文將詳細(xì)介紹 CUDA SGEMM
    的頭像 發(fā)表于 09-28 09:46 ?1869次閱讀

    CUDA與Jetson Nano:并行Pollard Rho測(cè)試

    電子發(fā)燒友網(wǎng)站提供《CUDA與Jetson Nano:并行Pollard Rho測(cè)試.zip》資料免費(fèi)下載
    發(fā)表于 06-15 09:30 ?0次下載
    <b class='flag-5'>CUDA</b>與Jetson Nano:<b class='flag-5'>并行</b>Pollard Rho測(cè)試

    FPGA加速神經(jīng)網(wǎng)絡(luò)的矩陣乘法

    電子發(fā)燒友網(wǎng)站提供《FPGA加速神經(jīng)網(wǎng)絡(luò)的矩陣乘法.pdf》資料免費(fèi)下載
    發(fā)表于 09-15 14:50 ?0次下載
    FPGA<b class='flag-5'>加速</b>神經(jīng)網(wǎng)絡(luò)的<b class='flag-5'>矩陣</b><b class='flag-5'>乘法</b>