• <xmp id="om0om">
  • <table id="om0om"><noscript id="om0om"></noscript></table>
  • 3 月 19 日下午 2 點,鎖定 NVIDIA AI 網絡中文專場。立即注冊觀看
    模擬/建模/設計

    使用 NVIDIA 數學庫加速 GPU 應用程序

    ?

    加速 GPU 應用程序的主要方法有三種:編譯器指令、編程語言和預編程庫。編譯器指令,例如 OpenACC a 允許您順利地將代碼移植到 GPU 以使用基于指令的編程模型進行加速。雖然它易于使用,但在某些情況下可能無法提供最佳性能。

    編程語言,例如 CUDA C 和 C ++ 在加速應用程序時為您提供更大的靈活性,但用戶也有責任編寫代碼,利用新的硬件功能在最新的硬件上實現最佳性能。這就是預編程庫填補空白的地方。

    除了增強代碼的可重用性外,還可以使用 NVIDIA 數學庫 優化以充分利用 GPU 硬件,獲得最大的性能增益。如果您正在尋找一種簡單的方法來加速應用程序,請繼續閱讀,了解如何使用庫來提高應用程序的性能。

    NVIDIA 數學庫,作為 CUDA 工具包高性能計算( HPC )軟件開發工具包( SDK ) ,提供各種計算密集型應用程序中遇到的函數的高質量實現。這些應用包括機器學習、深度學習、分子動力學、計算流體動力學( CFD )、計算化學、醫學成像和地震勘探等領域。

    這些庫旨在取代常見的 CPU 庫,如 OpenBLAS 、 LAPACK 和 Intel MKL ,并加速上的應用程序 NVIDIA GPU 代碼更改最少。為了展示這個過程,我們創建了一個雙精度通用矩陣乘法( DGEMM )功能的示例,以比較 cuBLAS 與 OpenBLAS 的性能。

    下面的代碼示例演示了 OpenBLAS DGEMM 調用的使用。

    // Init Data
    …
    // Execute GEMM
    cblas_dgemm(CblasColMajor, CblasNoTrans, CblasTrans, m, n, k, alpha, A.data(), lda, B.data(), ldb, beta, C.data(), ldc);
    

    下面的代碼示例 2 顯示了 cuBLAS dgemm 調用。

    // Init Data
    …
    // Data movement to GPU
    …
    // Execute GEMM
    cublasDgemm(cublasH, CUBLAS_OP_N, CUBLAS_OP_T, m, n, k, &alpha, d_A, lda, d_B, ldb, &beta, d_C, ldc));
    

    如上面的示例所示,您可以簡單地添加 OpenBLAS CPU 代碼并用 cuBLAS API 函數替換。 請參閱 cuBLAS 和 OpenBLAS 示例的完整代碼 該 cuBLAS 示例在 NVIDIA ( R ) V100 張量核 GPU 上運行,速度提高了近 20 倍。下圖顯示了運行這些示例時的加速比和規格。

    Bar graph showing the 19.2x speed-up in performance gained by replacing the OpenBLAS CPU code with the cuBLAS API function on the GPU
    圖 1.在 GPU 上用 cuBLAS API 函數替換 OpenBLAS CPU 代碼,在 CPU 和 GPU 上, DGEMM 計算的速度提高了 19.2 倍,其中 a 、 B 和 C 矩陣是 4K x 4K 矩陣。

    有趣的事實:這些庫在更高級別的 Python API 中調用,例如 cuPy?, cuDNNRAPIDS?,因此,如果您有這些方面的經驗,那么您已經在使用這些 NVIDIA 數學庫。

    這篇文章的其余部分涵蓋了所有可用的數學庫。有關最新更新和信息,請觀看 NVIDIA 數學庫的最新發展 .

    與純 CPU 替代方案相比,提供了更好的性能

    有許多 NVIDIA 數學庫可以利用,從 GPU 加速的 BLAS 實現到隨機數生成。請看下面的 NVIDIA 數學庫概述,了解如何開始輕松提高應用程序的性能。

    用 cuBLAS 加速基本線性代數子程序

    廣義矩陣乘法是人工智能和科學計算中最常用的基本線性代數子程序之一。 GEMM 還構成了深度學習框架的基礎模塊。要了解有關在深度學習框架中使用 GEMM 的更多信息,請參閱 為什么 GEMM 是深度學習的核心 .

    這個 cuBLAS?是 BLAS 的一種實現,它利用 GPU 功能實現了極大的速度提升。它包括用于執行向量和矩陣運算的例程,例如點積(級別 1 )、向量加法(級別 2 )和矩陣乘法(級別 3 )。

    此外,如果您想并行化矩陣乘法, cuBLAS 支持多功能批量 GEMM ,可用于張量計算、機器學習和 LAPACK 。有關提高機器學習和張量收縮效率的更多詳細信息,請參閱 CPU 和 GPU 上具有擴展 BLAS 核的張量收縮 .

    古巴文字

    如果問題太大,無法安裝在 GPU 上,或者您的應用程序需要單節點、多 GPU 支持, 古巴文字 是一個很好的選擇。 cuBLASXt 允許混合 CPU- GPU 計算,并支持執行矩陣到矩陣操作的 BLAS 級別 3 操作,例如執行厄米秩更新的herk

    cuBLASLt

    cuBLASLt?是一個覆蓋 GEMM 的輕量級庫。 cuBLASLt 使用融合內核來加速應用程序,將兩個或多個內核“組合”為單個內核,從而允許重用數據并減少數據移動。 cuBLASLt 還允許用戶設置尾聲的后處理選項(應用偏置,然后重新魯變換或對輸入矩陣應用偏置梯度)。

    Cubrasmg : CUDA 數學庫早期訪問程序

    對于大規模問題,請查看 Cubrasmg 以獲得最先進的多 GPU 、多節點矩陣乘法支持。它目前是 CUDA 數學庫早期訪問程序的一部分。 申請訪問權限。

    用 cuSPARSE 處理稀疏矩陣

    稀疏矩陣、密集矩陣乘法( SpMM )是機器學習、深度學習、 CFD 和地震勘探以及經濟、圖形和數據分析中許多復雜算法的基礎。有效處理稀疏矩陣對于許多科學模擬至關重要。

    神經網絡規模的不斷擴大以及由此產生的成本和資源的增加導致了稀疏化的需要。稀疏性在深度學習訓練和推理中都得到了普及,以優化資源的使用。有關這一思想流派的更多信息以及對庫(如 cuSPARSE )的需求,請參閱 深度神經網絡稀疏性的未來 .

    cuSPARSE?提供一組用于處理稀疏矩陣的基本線性代數子程序,這些子程序可用于構建 GPU 加速求解器。庫例程有四類:

    • 級別 1 在稀疏向量和密集向量之間運行,例如兩個向量之間的點積。
    • 級別 2 在稀疏矩陣和密集向量(例如矩陣向量積)之間運行。
    • 第 3 級在稀疏矩陣和一組密集向量(例如矩陣乘積)之間運行。
    • 級別 4 允許不同矩陣格式之間的轉換和壓縮稀疏行( CSR )矩陣的壓縮。

    cusPARSELt 公司

    對于具有計算能力的 cuSPARSE 庫的輕量級版本,可以執行稀疏矩陣密集矩陣乘法以及用于修剪和壓縮矩陣的輔助函數,請嘗試 cusPARSELt?。要更好地了解 CUSPASSELT 庫,請參閱 使用 CUSPASSELT 利用 NVIDIA 安培結構稀疏性。

    使用割傳感器加速張量應用

    這個 cuTENSOR 庫 是一個張量線性代數庫實現。張量是機器學習應用的核心,是推導應用問題控制方程的重要數學工具。 cuTENSOR 提供了直接張量收縮、張量約化和元素級張量運算的例程。 cuTENSOR 用于提高深度學習訓練和推理、計算機視覺、量子化學和計算物理應用中的性能。

    切割傳感器

    如果您仍然想要 cuTENSOR 功能,但支持可以在單個節點中跨多 GPU 分布的大張量,例如 DGX A100 , 切割傳感器 是圖書館的首選。它提供了廣泛的混合精度支持,其主要計算例程包括直接張量收縮、張量約化和元素級張量運算。

    使用 cuSOLVER 的 GPU 加速 LAPACK 功能

    這個 庫索爾弗庫 是一個用于基于 cuBLAS 和 cuSPARSE 庫的線性代數函數的高級軟件包。 cuSOLVER 提供了類似 LAPACK 的功能,例如矩陣分解、密集矩陣的三角形求解例程、稀疏最小二乘解算器和特征值解算器。

    cuSOLVER 有三個獨立的組件:

    • cuSolverDN 用于密集矩陣分解。
    • cuSolverSP 提供了一組基于稀疏 QR 分解的稀疏例程。
    • cuSolverRF 是一個稀疏重分解包,用于求解具有共享稀疏模式的矩陣序列。

    cusOLVERMg 公司

    對于 GPU 加速的 ScaLAPACK 特性,考慮對稱特征求解器、 1-D 列塊循環布局支持以及對 cuSOLVER 特性的單節點多 GPU 支持 cusOLVERMg?.

    庫索爾文普

    求解大型線性方程組需要多節點、多 GPU 支持。以其上下分解和 Cholesky 分解特性而聞名, 庫索爾文普 是一個很好的解決方案。

    用 cuRAND 大規模生成隨機數

    這個 cuRAND 庫 重點介紹通過主機( CPU ) API 或設備( GPU ) API 上的偽隨機或準隨機數生成器生成隨機數。主機 API 可以純粹在主機上生成隨機數并將其存儲在主機內存中,也可以在主機上調用庫的設備上生成隨機數,但隨機數生成發生在設備上并存儲在全局內存中。

    設備 API 定義了用于設置隨機數生成器狀態和生成隨機數序列的函數,用戶內核可以立即使用這些函數,而無需對全局內存進行讀寫。一些基于物理的問題表明需要大規模隨機數生成。

    蒙特卡洛模擬是 GPU 上隨機數生成器的一種用例。 在 CUDA Fortran 中開發基于 GPU 的蒙特卡洛并行偽隨機神經網絡 重點介紹了 cuRAND 在大規模生成隨機數中的應用。

    使用 cuFFT 計算快速傅立葉變換

    cuFFT CUDA 快速傅立葉變換( FFT )庫為在 NVIDIA GPU 上計算 FFT 提供了一個簡單的接口。 FFT 是一種分治算法,用于有效計算復數或實值數據集的離散傅立葉變換。它是計算物理和一般信號處理中應用最廣泛的數值算法之一。

    cuFFT 可用于廣泛的應用,包括醫學成像和流體動力學。 光聲顯微鏡定量血流成像的并行計算 說明了 cuFFT 在基于物理的應用程序中的使用。具有現有 FFTW 應用程序的用戶應該使用 cuFFTW 輕松地將代碼移植到 NVIDIA GPU 上,只需很少的努力。 cuFFTW 庫提供了 FFTW3 API ,以便于移植現有的 FFTW 應用程序。

    cuFFTXt

    要在單個節點中跨 GPU 分布 FFT 計算,請檢查 cuFFTXt .該庫包括幫助用戶在多個 GPU 上操作數據和跟蹤數據順序的功能,從而可以以最有效的方式處理數據。

    cuFFTMp

    不僅在單個系統中有多 GPU 支持, cuFFTMp 提供跨多個節點的多 GPU 支持。該庫可用于任何 MPI 應用程序,因為它獨立于 MPI 實現的質量。它使用 NVSHMEM?這是一個基于 OpenSHMEM 標準的通信庫,專為 NVIDIA GPU 設計。

    cuFFTDx

    要通過避免不必要的全局內存訪問并允許 FFT 內核與其他操作融合來提高性能,請查看 cuFFT 設備擴展( cuFFTDx ) 作為數學庫設備擴展的一部分,它允許應用程序在用戶內核內計算 FFT 。

    使用 CUDA 數學 API 優化標準數學函數

    CUDA 數學 API 是為每種 NVIDIA GPU 架構優化的標準數學函數的集合。所有 CUDA 庫都依賴于 CUDA 數學庫。 CUDA 數學 API 支持所有 C99 標準浮點和雙精度數學函數、浮點、雙精度和全舍入模式,以及不同的函數,如三角函數和指數函數(cospisincos)和其他逆誤差函數(erfinverfcinv)。

    使用帶彎刀的 C ++模板自定義代碼

    矩陣乘法是許多科學計算的基礎。這些乘法在深度學習算法的有效實現中尤為重要。與庫布拉斯類似, CUDA Templates for Linear Algebra Subroutines (CUTLASS) 包含一組線性代數例程,用于執行有效的計算和縮放。

    它結合了分層分解和數據移動的策略,類似于用于實現 cuBLAS 和 cuDNN 的策略。然而,與 cuBLAS 不同的是,彎刀越來越模塊化和可重新配置。它將 GEMM 的運動部分分解為基本組件或塊,作為 C ++模板類可用,從而為您定制算法提供了靈活性。

    該軟件是流水線的,以隱藏延遲并最大限度地提高數據重用。無沖突地訪問共享內存,以最大限度地提高數據吞吐量,消除內存占用,并完全按照您想要的方式設計應用程序。要了解有關使用 Cutslass 提高應用程序性能的更多信息,請參閱 CUDA C 中的快速線性代數++ .

    使用 AmgX 計算微分方程

    AmgX?提供 GPU 加速的 AMG (代數多重網格)庫,在分布式節點上的單個 GPU 或多 GPU 上受支持。它允許用戶創建復雜的嵌套解算器、平滑器和預條件器。該庫使用不同的平滑器(如塊 Jacobi 、 Gauss-Seidel 和稠密 LU )實現了經典和基于聚合的代數多重網格方法。

    該庫還包含預條件 Krylov 子空間迭代方法,如 PCG 和 BICGStab 。 AmgX 為模擬的計算密集型線性求解器部分提供高達 10 倍的加速度,非常適合隱式非結構方法。

    AmgX 是專門為 CFD 應用開發的,可用于能源、物理和核安全等領域。 AmgX 庫的一個實際示例是求解小規模到大規模計算問題的泊松方程。

    這個 飛蛇模擬示例 顯示了在 GPU 上使用 AmgX 包裝器加速 CFD 代碼時所花費的時間和成本的減少。與一個 12 核 CPU 節點相比,一個 K20 GPU 節點上有 300 萬個網格點,速度提高了 21 倍。

    開始使用 NVIDIA 數學庫

    我們繼續努力改進 NVIDIA 數學庫。如果您有任何問題或新功能請求,請聯系產品經理 馬修很好 .

    致謝

    我們非常感謝 Matthew 的指導和積極反饋。特別感謝安妮塔·維梅斯的所有反饋和她在整個過程中的持續支持。

    ?

    +1

    標簽

    人人超碰97caoporen国产