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

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

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

如何用Python語法加速C+的數(shù)值計算

星星科技指導(dǎo)員 ? 來源:NVIDIA ? 作者:NVIDIA ? 2022-04-10 10:41 ? 次閱讀

Rob Smallshire 曾經(jīng)說過,“你可以在 C ++中編寫更快的代碼,但是在 Python 中編寫代碼更快。”自從它發(fā)布超過十年前, CUDA 已經(jīng)給 C 和 C ++程序員提供了在 Nvidia GPU 上最大化其代碼性能的能力。

最近, CuPy 和 PyTorch 等庫允許解釋語言的開發(fā)人員利用其他語言優(yōu)化的 CUDA 庫的速度。這些解釋語言有許多優(yōu)秀的特性,包括易于閱讀的語法、自動內(nèi)存管理和所有函數(shù)的通用類型。

然而,有時擁有這些功能意味著由于內(nèi)存管理和其他超出您控制范圍的因素而付出性能代價。為了節(jié)省開發(fā)時間,性能的降低通常是值得的。不過,當(dāng)性能成為一個問題時,它最終可能需要重寫應(yīng)用程序的某些部分。

如果你仍然可以使用 C ++來獲得最大的性能,同時仍然能從解釋語言中獲得所有好處呢?

MatX 概述

Matx 是一個實驗性的 GPU 加速的數(shù)值計算 C ++庫,旨在跨越用戶之間可能需要的最高性能之間的差距,在所有 CUDA 庫中使用相同的簡單語法和類型。使用 CUDA 11.0 中添加的 C ++ 17 支持, MatX 允許您編寫與 Python 這樣的高級語言相同的自然代數(shù)表達式,而不會帶來性能損失。

張量類型

MatX 包括許多流行數(shù)學(xué)庫的接口,如 cuBLAS 、 CUTLASS 、 cuFFT 和 CUB ,但在所有這些庫中使用一種通用數(shù)據(jù)類型(tensor_t)。這大大簡化了這些庫的 API ,方法是推斷出它知道的關(guān)于張量類型的信息,并在此基礎(chǔ)上調(diào)用正確的 API 。

下面的代碼示例顯示了一個基于 FFT 的重采樣器。

python

N = min(ns, ns_resamp)
nyq = N // 2 + 1 # Create an empty vector
sv = np.empty(ns) # Real to complex FFT
svc = np.fft.rfft(sv) # Slice
sv = svc[0:nyq] # Complex to real IFFT
rsv = np.fft.irfft(sv, ns_resamp)

馬特克斯

uint32_t N = std::min(ns, ns_resamp); uint32_t nyq = N / 2 + 1; auto sv = make_tensor({ns}); auto svc = make_tensor({ns / 2 + 1}); auto rv = make_tensor({ns_resamp}); // Real to complex FFT
fft(svc, sv, stream); // Slice the vector
auto sv = svc.Slice({0}, {nyq}); // Complex to real IFFT

ifft(rsv, sv, stream);雖然代碼長度和可讀性相似,但 A100 上的 MatX 版本比 CPU 上運行的 NumPy 版本快約 2100 倍。與直接使用 CUDA 庫相比, MatX 版本還有許多隱藏的好處,例如類型檢查、輸入和輸出大小檢查,以及在沒有指針操作的情況下切片張量。

不過,張量類型并不限于 FFT ,同樣的變量也可以在其他庫和表達式中使用。例如,如果您想在重采樣器輸出上使用 Cutslass 執(zhí)行 GEMM ,可以編寫以下代碼:

matmul(resampOut, resampView, B, stream);

在這段代碼中, resampOut 和 B 是 GEMM 操作的適當(dāng)大小的張量。與前面的 FFT 示例一樣,類型、大小、批次和步幅都由張量元數(shù)據(jù)推斷。使用強類型的 C ++ API 也意味著許多運行時和編譯時錯誤可以在不進行附加調(diào)試的情況下捕獲。

除了支持優(yōu)化的 CUDA 庫作為后端,這些相同的張量類型還可以用于代數(shù)表達式中,以執(zhí)行元素操作:

(C = A * B + (D / 5.0) + cos(E)).run(stream);

惰性評估

MatX 使用惰性計算在編譯時創(chuàng)建一個 GPU 內(nèi)核,表示括號中的表達式。只有在表達式上調(diào)用 run 函數(shù)時,操作才會在 GPU 上執(zhí)行。支持 40 多種不同類型的運算符,可以在不同大小和類型的張量之間混合匹配,并具有兼容的參數(shù)。如果你看一下之前作為 CUDA 內(nèi)核編寫的表達式,它看起來像這樣:

__global__ void Expression( float *C, const float *A, const float *B, const float *D, const float *E, int length)
{ for (int idx = blockIdx.x * blockDim.x + threadIdx.x; idx < length; idx += blockDim.x * gridDim.x) { C[idx] = A[idx] * B[idx] + (D[idx] / 5.0) + cosf(E[idx]); }?

雖然前面的代碼并不復(fù)雜,但它隱藏了幾個問題:

數(shù)據(jù)類型硬編碼為浮動。要更改為其他類型,必須編輯內(nèi)核簽名。精明的讀者會說,使用模板,讓編譯器為您推斷類型。雖然這可能適用于某些類型,但并不適用于您可能想要使用的所有類型。例如, cosf 不是為半精度類型定義的,因此必須使用編譯時條件來處理不同的類型。

對函數(shù)簽名的任何微小更改都需要一個完全不同的函數(shù)。例如,如果您想在某些情況下添加張量 F ,但仍保留原始簽名,該怎么辦?這將是兩個幾乎相同的功能。

雖然 grid-stride loop 是一種很好的實踐,用于處理不同大小的塊和網(wǎng)格,但您仍然必須有代碼來確保在內(nèi)核啟動期間有足夠的線程使 GPU 保持忙碌。

假設(shè)所有輸入為 1D 向量;更高的維度可能會隨著不統(tǒng)一的步伐而斷裂。

還有許多其他缺陷沒有列出,包括無法廣播不同大小的張量、不檢查大小、需要連續(xù)內(nèi)存布局等等。

顯然,這段代碼只在特定條件下工作,而 MatX 版本解決了所有這些問題,而且通常保持與直接編寫內(nèi)核相同的性能。

附加 MatX 功能

MatX 的其他主要功能包括:

通過切片、克隆和置換現(xiàn)有張量創(chuàng)建零拷貝張量視圖。

支持任意維張量。

用于動態(tài)生成數(shù)據(jù)的生成器,無需存儲在內(nèi)存中。常見的例子是創(chuàng)建線性間隔向量、漢明窗或?qū)蔷仃嚒?/p>

支持 CUDA 中使用的幾乎所有類型,包括半精度( FP16 和 BF16 )和復(fù)數(shù)(全精度和半精度)。

線性解算器通過 cuSolver 、使用 CUB 進行排序和掃描、使用 cuRAND 生成隨機數(shù)、減少等功能實現(xiàn)

總結(jié)

MatX 是根據(jù) BSDv3 許可證開源的。

關(guān)于作者

Cliff Burdick 是 NVIDIA 的高級開發(fā)技術(shù)工程師,他專注于優(yōu)化信號處理、數(shù)值計算以及 GPU 和網(wǎng)絡(luò) IO 的 GPU 代碼。

Justin Luitjens 是 NVIDIA 的高級開發(fā)技術(shù)經(jīng)理,致力于加速 GPU 上的應(yīng)用程序。他擁有猶他大學(xué)的科學(xué)計算博士學(xué)位。

Adam Thompson 是 NVIDIA 的高級解決方案架構(gòu)師。他有信號處理方面的背景,他的職業(yè)生涯一直在參與和領(lǐng)導(dǎo)一些項目,這些項目專注于射頻分類、數(shù)據(jù)壓縮、高性能計算、統(tǒng)計信號處理以及管理和設(shè)計針對大數(shù)據(jù)框架的應(yīng)用程序。他擁有喬治亞理工大學(xué)電子與計算機工程碩士學(xué)位和克萊姆森大學(xué)學(xué)士學(xué)位。

審核編輯:郭婷

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

    關(guān)注

    14

    文章

    4793

    瀏覽量

    102427
  • gpu
    gpu
    +關(guān)注

    關(guān)注

    27

    文章

    4591

    瀏覽量

    128143
  • python
    +關(guān)注

    關(guān)注

    53

    文章

    4753

    瀏覽量

    84077
收藏 人收藏

    評論

    相關(guān)推薦

    廣成科技USBCAN-II C+型CAN盒是什么

    USBCAN-II C+是沈陽廣成科技有限公司出品的一種集成2個CAN通道的CAN盒工具,你也可以叫它CAN卡、CAN分析儀、USBCAN分析儀。相對于前身USBCAN-II C分析儀,USBCAN-II C+的外殼由金屬轉(zhuǎn)變?yōu)?/div>
    的頭像 發(fā)表于 08-30 11:47 ?392次閱讀

    廣成科技USBCAN II C+可用的GCANtools功能

    USBCAN II C+是沈陽廣成科技有限公司出品的一種雙通道CAN分析儀工具,其搭配的軟件主要廣成科技自己家的GCANTOOLS以及其他廠家的CANPro、CANTEST。相比于USBCAN II
    的頭像 發(fā)表于 08-30 11:45 ?361次閱讀

    Python建模算法與應(yīng)用

    Python作為一種功能強大、免費、開源且面向?qū)ο蟮木幊陶Z言,在科學(xué)計算、數(shù)學(xué)建模、數(shù)據(jù)分析等領(lǐng)域展現(xiàn)出了卓越的性能。其簡潔的語法、對動態(tài)輸入的支持以及解釋性語言的本質(zhì),使得Python
    的頭像 發(fā)表于 07-24 10:41 ?257次閱讀

    c語言,c++,java,python區(qū)別

    C語言、C++、Java和Python是四種常見的編程語言,各有優(yōu)點和特點。 C語言: C語言是一種面向過程的編程語言。它具有底層的特性,能
    的頭像 發(fā)表于 02-05 14:11 ?1364次閱讀

    python計算排列組合的函數(shù)有哪些

    Python中,有多種可以用于計算排列組合的函數(shù)和模塊。下面將詳細介紹一些常用的函數(shù)和模塊,并提供詳實和細致的說明。 math模塊: Python的math模塊提供了一些計算排列組合
    的頭像 發(fā)表于 11-29 16:33 ?3004次閱讀

    python運行完后為什么會閃退

    Python是一種高級編程語言,用于開發(fā)各種應(yīng)用程序和腳本。當(dāng)你運行一個Python程序時,計算機會首先加載并解釋代碼,然后按照代碼的邏輯執(zhí)行相應(yīng)的操作。然而,有時候程序可能會突然閃退,也就是意外
    的頭像 發(fā)表于 11-29 15:14 ?7461次閱讀

    python語言特點有哪些

    、詳實和細致的描述,共計超過1500字。 簡潔優(yōu)雅: Python以簡潔和優(yōu)雅的語法而著稱。相對于其他編程語言,Python代碼通??雌饋砀忧逦鬃x。這得益于Python采用了面向?qū)?/div>
    的頭像 發(fā)表于 11-29 14:29 ?834次閱讀

    python運行程序出現(xiàn)紅色空白

    當(dāng)你運行Python程序時,如果出現(xiàn)紅色空白,這通常意味著有一個錯誤發(fā)生了。這個錯誤可能是由多種原因造成的,本文將詳細介紹可能的原因和解決方法,幫助你解決這個問題。 語法錯誤:Python是一種強
    的頭像 發(fā)表于 11-28 15:30 ?1455次閱讀

    Python2與Python3的差異

    Python2與Python3是兩個不同的版本,它們在語法、功能和性能等方面存在一些差異。下面是對Python2和Python3的詳盡、詳實
    的頭像 發(fā)表于 11-23 16:48 ?709次閱讀

    何用python實現(xiàn)RFM建模

    今天給大家分享的是如何用python實現(xiàn)RFM建模。 RFM模型的含義 RFM模型是衡量客戶價值和客戶創(chuàng)利能力的重要工具和手段。在眾多的客戶關(guān)系管理(CRM)的分析模式中,RFM模型是被廣泛提到
    的頭像 發(fā)表于 11-02 10:36 ?663次閱讀
    如<b class='flag-5'>何用</b><b class='flag-5'>python</b>實現(xiàn)RFM建模

    何用Python自動套用模板批量生成PDF文檔

    辦最高效的事。 今天就給大家講講如何用Python自動套用模板批量生成下方這樣的PDF文檔。 1.準(zhǔn)備 開始之前,你要確保Python和pip已經(jīng)成功安裝在電腦上噢,如果沒有,請訪問這篇文章: 超詳細
    的頭像 發(fā)表于 10-31 10:56 ?1243次閱讀
    如<b class='flag-5'>何用</b><b class='flag-5'>Python</b>自動套用模板批量生成PDF文檔

    何用Python來實現(xiàn)文件系統(tǒng)的操作功能

    就來介紹一下如何用 Python 來實現(xiàn)這些功能 輸出當(dāng)前的路徑 我們可以通過 Python 當(dāng)中的 OS 庫來獲取當(dāng)前文件所在的位置 import os os .getcwd() 路徑的拼接 我們
    的頭像 發(fā)表于 10-30 14:27 ?321次閱讀
    如<b class='flag-5'>何用</b><b class='flag-5'>Python</b>來實現(xiàn)文件系統(tǒng)的操作功能

    C編程中指針的語法和工作原理

    指針對許多 C 編程至關(guān)重要,但它們可能很難理解。本文通過實際示例來復(fù)習(xí)它們的語法以及它們的工作原理。
    發(fā)表于 10-21 17:54 ?693次閱讀

    Python教你用 Rows 快速操作csv文件

    Rows 是一個專門用于操作表格的第三方Python模塊。 只要通過 Rows 讀取 csv 文件,她就能生成可以被計算Python 對象。 相比于 pandas 的 pd.read_csv
    的頭像 發(fā)表于 10-21 10:18 ?447次閱讀

    何用Python自動套用模板批量生成PDF文檔

    今天就給大家講講如何用Python自動套用模板批量生成的PDF文檔。 1.準(zhǔn)備 開始之前,你要確保Python和pip已經(jīng)成功安裝在電腦上噢,如果沒有,請訪問這篇文章: 超詳細Python
    的頭像 發(fā)表于 10-17 10:54 ?791次閱讀
    如<b class='flag-5'>何用</b><b class='flag-5'>Python</b>自動套用模板批量生成PDF文檔