精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

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

星星科技指導員 ? 來源:NVIDIA ? 作者:NVIDIA ? 2022-04-24 17:04 ? 次閱讀

擬或 合成數據 生成是人工智能工具發展的一個重要趨勢。傳統上,這些數據集可用于解決低數據問題或邊緣情況場景,而或許現在存在于可用的實際數據集中。

合成數據的新興應用包括建立模型性能水平、量化適用領域,以及下一代系統工程,其中人工智能模型和傳感器是串聯設計的。

pYYBAGJlEruAAaZdAABmyZg_tPc927.png

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

Blender 是生成這些數據集的一個常用且引人注目的工具。它是免費使用和開源的,但同樣重要的是,它可以通過強大的 Python API 完全擴展。 Blender 的這一特性使其成為視覺圖像渲染的一個有吸引力的選擇。因此,它已被廣泛用于此目的,有 18 +渲染引擎選項可供選擇。

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

GPU 科學計算功能可直接從 Blender 中獲得,允許使用簡單的統一工具,利用 Blender 強大的幾何體創建功能以及尖端計算環境。對于 blender2 。 83 +的最新變化,可以使用 CuPy (一個專門用于數組計算的 GPU 加速 Python 庫)直接從 Python 腳本中完成。

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

矩陣乘法算法

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

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

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

[B]是一個[n*p]matrix.

產品[C=A.B]結果是[m*p]matrix.

如果[C],[A],和[B]使用數字 1 (即基于 1 的索引)進行索引,然后是的第 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

麻木加速度

通過使用 Numba 。 jit decorator ,可以將 Numba 編譯器應用于 Python 腳本中的函數。通過預編譯到 C 中,在 Python 代碼中使用 numba 。 jit decorator 可以顯著減少循環的運行時間。由于直接轉換為代碼的矩陣乘法需要嵌套 for 循環,因此使用 numba 。 jit decorator 可以顯著減少用 Python 編寫的矩陣乘法函數的運行時間。 matmulnumba.py Python 腳本實現矩陣乘法并使用 numba 。 jit decorator 。

CUDA 加速度

在討論使用 CUDA 加速矩陣乘法的方法之前,我們應該大致概述 CUDA 內核的并行結構。內核啟動中的所有并行進程都屬于一個網格。網格由塊數組組成,每個塊由線程數組組成。網格中的線程組成了由 CUDA 內核啟動的基本并行進程。圖 2 概述了這類并行結構的示例。

pYYBAGJlEsSABbfvAADCrQ__-iQ419.png

圖 2 。 一個由 2 組成的 CUDA 核網格的并行結構× 2 塊數組。每個塊由一個 2 × 2 個線程陣列。

既然已經詳細說明了 CUDA 內核啟動的并行結構,那么在 matmulcuda.py Python 腳本中用于并行化矩陣乘法的方法可以描述如下。

假設以下由一個由塊的二維數組組成的 CUDA 內核網格計算,每個塊由線程的一維數組組成:

矩陣積[C=A.B]

[A]and[m*n]matrix

[B]and[n*p]matrix

[C]and[m*p]matrix

此外,進一步假設如下:

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

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

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

矩陣積的元素[C=A.B]可以通過為每個塊分配一個元素的計算來并行計算[C],[C[i,j].

您可以通過將指定給要執行的塊的每個線程來獲得進一步的并行增強[C],[C[i,j]分配,計算[n]和等于[C],[C[i,j].

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

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

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 總結了兩個樣本矩陣乘法的并行排列[2*2].

2x2-grid-parallelized-625x275.png

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

提速

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

pYYBAGJlEtWACGWcAABSgX0TnGI314.png

圖 4 。兩個 NxN 矩陣相乘時 CUDA 加速矩陣相乘相對于 Numba 加速矩陣相乘的加速比。

今后的工作

考慮到 Blender 作為計算機圖形工具的作用,一個適用于 CUDA 加速的相關應用領域涉及到通過光線跟蹤解決可見性問題。可見性問題可以概括如下: 相機存在于空間的某個點上,并且正在觀察由三角形元素組成的網格。可見性問題的目標是確定哪些網格元素對攝影機可見,哪些網格元素被其他網格元素遮擋。

光線跟蹤可以用來解決可見性問題。您試圖確定其可見性的網格由[N]網格元素。那樣的話,[N]可以生成以場景中的攝影機為原點的光線。這些端點位于[N]網格元素。

每條光線在不同的網格元素上都有一個端點。如果光線到達其端點時未被其他網格元素遮擋,則可以從攝影機中看到端點網格元素。圖 5 顯示了這個過程。

poYBAGJlEteADqybAACIB87vL5Y171.png

圖 5 。 從相機向場景中的人臉發射的兩條光線;一個面可見,另一個面被遮擋。

使用光線跟蹤來解決可見性問題的本質使其成為

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

作為直接計算實現時的問題。幸運的是, NVIDIA 開發了一個光線跟蹤庫,名為 NVIDIA OptiX ,它使用 GPU 并行性來實現顯著的加速。在 Blender Python 環境中使用 NVIDIA OptiX 將帶來實實在在的好處。

概括

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

因為前面描述的 CUDA 加速代碼可以作為 Blender Python 腳本運行,所以可以在 Blender Python 環境中使用 CUDA 加速任意數量的算法。這大大提高了 blenderpython 作為科學計算工具的有效性。

關于作者

Eric Leonard 博士獲得了博士學位。在馬里蘭大學機械工程系,他專門從事理論和計算流體力學。研究生畢業后,他在馬薩諸塞州劍橋市的三菱 Ele CTR ic 研究實驗室實習,致力于開發一種替代傳統計算流體力學算法的方法。在 Rendered 。 AI ,他使用 CUDA 加速了合成孔徑雷達仿真代碼庫。

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

Ethan Sharratt 是 Rendered.AI 的軟件工程總監。他有一個學士學位,在華盛頓大學的 EDE CTR 工程,目前正在一個碩士。他擁有 10 年在具有挑戰性的環境中構建軟件和固件解決方案的經驗,包括開發空間等級軟件定義的無線電、信號和圖像處理以及實時計算機視覺管道。

Steven Forsyth 是 NVIDIA 的解決方案架構師,專注于支持聯邦生態系統。他在激光干涉儀引力波天文臺工作了幾年,在那里他獲得了信號處理和高性能計算方面的經驗。在 NVIDIA ,他將從 LIGO 獲得的知識與深度學習的知識結合起來,專門從事深度學習應用,涉及廣泛的領域,包括計算機視覺和網絡安全。史蒂文最近從喬治亞理工學院畢業,在那里他獲得了物理學學士學位。

審核編輯:郭婷

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • NVIDIA
    +關注

    關注

    14

    文章

    4949

    瀏覽量

    102828
  • CUDA
    +關注

    關注

    0

    文章

    121

    瀏覽量

    13600
收藏 人收藏

    評論

    相關推薦

    Mali GPU編程特性及二維浮點矩陣運算并行優化詳解

    本文針對Mali-T604 GPU論述了基于OpenCL的Linux平臺上進行通用計算并行優化的方法,論述了Mali-T604 GPU的硬件特點,并基于OpenCL設計了二維矩陣乘法并行
    發表于 08-07 17:12 ?2543次閱讀
    Mali GPU編程特性及二維浮點<b class='flag-5'>矩陣</b>運算<b class='flag-5'>并行</b>優化詳解

    #硬聲創作季 cuda_lecture3_part5_2_掃描并行實例

    并行編程語言CUDA
    Mr_haohao
    發布于 :2022年09月03日 15:02:11

    請問Mali GPU的并行計算模型是怎樣構建的?

    Mali T604 GPU的結構是由哪些部分組成的?Mali T604 GPU的編程特性有哪些?Mali GPU的并行計算模型是怎樣構建的?基于Mali-T604 GPU的快速浮點矩陣乘法
    發表于 04-19 08:06

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

    乘法的快速算法對科學計算有著極為重要的意義。 使用KV260硬件加速矩陣乘法運算,會帶來以下好處: KV260中PL(FPGA)是一種可編程的邏輯器件,能夠實現高度定制
    發表于 10-13 20:11

    支持優化分塊策略的矩陣加速

    存儲器容量十分有限,計算大規模矩陣乘法時往往需要將矩陣劃分成細粒度的子塊計算任務。當加速非均勻矩陣乘法
    發表于 11-25 10:38 ?3次下載
    支持優化分塊策略的<b class='flag-5'>矩陣</b>乘<b class='flag-5'>加速</b>器

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

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

    基于深度學習的矩陣乘法加速器設計方案

    為滿足深度學習推理中對不同規模矩陣乘法的計算需求,提出一種基于 Zynq soc平臺的整數矩陣乘法加速器。采用基于總線廣播的
    發表于 05-25 16:26 ?3次下載

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

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

    面向數組計算任務而設計的Numba具有CUDA加速功能

    Numba 為 Python 開發人員提供了一個進入 GPU 加速計算的簡單入口,并為使用日益復雜的 CUDA 代碼提供了一條路徑,只需使用最少的新語法和行話。
    的頭像 發表于 04-11 09:58 ?1534次閱讀

    一行Python代碼如何實現并行

    Python 在程序并行方面多少有些聲名狼藉。撇開技術上的問題,例如線程的實現和 GIL,我覺得錯誤的教學指導才是主要問題。
    的頭像 發表于 04-19 17:09 ?1008次閱讀

    使用map函數實現Python程序并行

    Python 在程序并行方面多少有些聲名狼藉。撇開技術上的問題,例如線程的實現和 GIL,我覺得錯誤的教學指導才是主要問題。常見的經典 Python 多線程、多進程教程多顯得偏"重"
    的頭像 發表于 06-12 16:31 ?1669次閱讀

    如何在OpenCV中實現CUDA加速

    OpenCV4.x中關于CUDA加速的內容主要有兩個部分,第一部分是之前OpenCV支持的圖像處理與對象檢測傳統算法的CUDA加速;第二部分是OpenCV4.2版本之后開始支持的針對深
    的頭像 發表于 09-05 10:03 ?5018次閱讀

    CUDA矩陣乘法優化手段詳解

    單精度矩陣乘法(SGEMM)幾乎是每一位學習 CUDA 的同學繞不開的案例,這個經典的計算密集型案例可以很好地展示 GPU 編程中常用的優化技巧。本文將詳細介紹 CUDA SGEMM
    的頭像 發表于 09-28 09:46 ?1887次閱讀

    CUDA與Jetson Nano:并行Pollard Rho測試

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

    FPGA加速神經網絡的矩陣乘法

    電子發燒友網站提供《FPGA加速神經網絡的矩陣乘法.pdf》資料免費下載
    發表于 09-15 14:50 ?0次下載
    FPGA<b class='flag-5'>加速</b>神經網絡的<b class='flag-5'>矩陣</b><b class='flag-5'>乘法</b>