CUDA 11功能展示


CUDA 11功能展示

CUDA 11 Features Revealed

新的NVIDIA A100 GPU基於NVIDIA安培GPU架構,實現了加速計算的最大一代飛躍。A100 GPU具有革命性的硬件功能,我們很高興宣布CUDA11與A100結合使用。              CUDA11使您能夠利用新的硬件功能來加速HPC、基因組學、5G、渲染、深度學習、數據分析、數據科學、機器人和許多更多樣化的工作負載。             

CUDA11包含了從平台系統軟件到開始開發GPU加速應用程序所需的所有功能。本文概述了此版本中的主要軟件功能:             

支持NVIDIA安培GPU體系結構,包括新的NVIDIA A100 GPU,用於加速擴展和擴展AI和HPC數據中心;具有NVSwitch結構的多GPU系統,如DGX A100和HGX A100。             

多實例GPU(MIG)分區功能,特別有利於雲服務提供商(csp)提高GPU利用率。             

新的第三代張量核加速混合精度,矩陣運算對不同數據類型,包括TF32和Bfloat16。             

用於任務圖、異步數據移動、細粒度同步和二級緩存駐留控制的編程和API。             

CUDA庫中線性代數、FFT和矩陣乘法的性能優化。             

對Nsight產品系列工具的更新,這些工具用於跟蹤、分析和調試CUDA應用程序。             

完全支持所有主要的CPU體系結構,包括x86_64、Arm64服務器和電源體系結構。

CUDA and NVIDIA Ampere microarchitecture GPUs

NVIDIA安培GPU微體系結構采用TSMC 7nm N7制造工藝,包含更多流式多處理器(SMs)、更大更快的內存以及與第三代NVLink互連的帶寬,以提供巨大的計算吞吐量。             

A100的40gb(5站點)高速HBM2內存的帶寬為1.6tb/sec,比V100快1.7x以上。A100上的40 MB二級緩存幾乎比Tesla V100大7倍,提供了2倍以上的二級緩存讀取帶寬。CUDA11在A100上提供了新的專用二級緩存管理和駐留控制API。A100中的短消息包括更大更快的組合一級緩存和共享內存單元(每短消息192 KB),以提供Volta V100 GPU總容量的1.5倍。             

A100配備了專用硬件單元,包括第三代張量核心、更多視頻解碼器(NVDEC)單元、JPEG解碼器和光流加速器。所有這些都被各種CUDA庫用來加速HPC和AI應用程序。             

接下來的幾節將討論NVIDIA A100中引入的主要創新,以及CUDA 11如何使您能夠充分利用這些功能。CUDA 11為每個人都提供了一些東西,無論您是管理集群的平台DevOps工程師還是編寫GPU加速應用程序的軟件開發人員。有關NVIDIA安培GPU微體系結構的更多信息,請參閱NVIDIA安培體系結構深入文章。

Multi-Instance GPU 

MIG功能可以在物理上將一個A100 GPU分成多個GPU。它允許多個客戶端(如vm、容器或進程)同時運行,同時在這些程序之間提供錯誤隔離和高級服務質量(QoS)。

 

Figure 1. New MIG feature in A100.

A100是第一個可以通過NVLink擴展到完整GPU的GPU,或者通過降低每個GPU實例的成本來擴展到許多用戶的MIG的GPU。MIG支持多個用例來提高GPU的利用率。這可以讓CSPs租用單獨的GPU實例,在GPU上運行多個推理工作負載,托管多個Jupyter筆記本會話以進行模型探索,或者在組織中的多個內部用戶(單租戶、多用戶)之間共享GPU的資源。             

MIG對CUDA是透明的,現有的CUDA程序可以在MIG不變的情況下運行,以最小化編程工作量。CUDA 11使用NVIDIA管理庫(NVML)或其命令行接口NVIDIA smi(NVIDIA smi MIG子命令)在Linux操作系統上啟用MIG實例的配置和管理。             

使用NVIDIA容器工具包和啟用MIG的A100,還可以使用Docker運行GPU容器(使用從Docker 19.03開始的--gpus選項)或使用NVIDIA設備插件擴展Kubernetes容器平台。             

以下命令顯示了使用nvidia smi的MIG管理:

# List gpu instance profiles:

# nvidia-smi mig -i 0 –lgip

 

System software platform support

為了在企業數據中心中使用,NVIDIA A100引入了新的內存錯誤恢復功能,可以提高恢復能力,避免影響正在運行的CUDA應用程序。先前架構上不可糾正的ECC錯誤將影響GPU上的所有運行工作負載,需要重置GPU。             

在A100上,影響僅限於遇到錯誤並被終止的應用程序,而其他正在運行的CUDA工作負載不受影響。GPU不再需要重置才能恢復。NVIDIA驅動程序執行動態頁面黑名單以標記頁面不可用,以便當前和新應用程序不訪問受影響的內存區域。             

當GPU復位時,作為常規GPU/VM服務窗口的一部分,A100配備了一種稱為行重映射的新硬件機制,該機制用備用單元替換內存中降級的單元,並避免在物理內存地址空間中創建任何洞。             

帶CUDA 11的NVIDIA驅動程序現在報告與行重映射有關的各種度量,包括帶內(使用NVML/NVIDIA smi)和帶外(使用系統BMC)。A100包括新的帶外功能,在更多可用的GPU和NVSwitch遙測,控制和改進的總線傳輸數據速率之間的GPU和BMC。             

為了提高多GPU系統(如DGX A100和HGX A100)的彈性和高可用性,系統軟件支持禁用出現故障的GPU或NVSwitch節點的功能,而不是像前幾代系統那樣禁用整個基板。             

CUDA 11是第一個為Arm服務器添加生產支持的版本。通過將Arm的節能CPU體系結構與CUDA結合起來,Arm生態系統將從GPU加速計算中受益,適用於各種用例:從edge、雲和游戲到為超級計算機供電。CUDA 11支持Marvell基於ThunderX2的高性能服務器,並與Arm和生態系統中的其他硬件和軟件合作伙伴密切合作,以快速實現對GPU的支持。

Third-generation, multi-precision Tensor Cores

NVIDIA A100中的每SM四個大張量核(總共432個張量核)為所有數據類型提供了更快的矩陣乘法累加(MMA)操作:Binary、INT4、INT8、FP16、Bfloat16、TF32和FP64。              您可以通過不同的深度學習框架、CUDA C++提供的CULCAS模板抽象或CUDA庫、Cuulover、CursSuror或TunSoRT來訪問張量核。             

CUDA C++使用張量水平矩陣(WMMA)API來獲得張量核。這種便攜式API抽象公開了專門的矩陣加載、矩陣乘法和累加運算以及矩陣存儲操作,以有效地使用CUDA C++程序的張量核。WMMA的所有函數和數據類型都可以在nvcuda::WMMA命名空間中使用。您還可以使用mma_sync PTX指令直接訪問A100(即具有計算能力compute_80及更高版本的設備)的張量核。             

CUDA 11增加了對新輸入數據類型格式的支持:Bfloat16、TF32和FP64。Bfloat16是一種替代的FP16格式,但精度較低,與FP32的數值范圍相匹配。它的使用導致較低的帶寬和存儲需求,因此更高的吞吐量。BFLAT16作為一個新的CUDA C++ ++ NVBBFLAT16數據類型,通過WMMA暴露在CUAAUBF16.H中,並由各種CUDA數學庫支持。             

TF32是一種特殊的浮點格式,用於張量核。TF32包括8位指數(與FP32相同)、10位尾數(與FP16精度相同)和一個符號位。它是默認的數學模式,允許您在不更改模型的情況下,通過FP32獲得DL訓練的加速比。最后,A100為MMA操作提供了雙精度(FP64)支持,WMMA接口也支持MMA操作。

 

Figure 2. Table of supported data types, configurations, and performance for matrix operations.

Programming NVIDIA Ampere architecture GPUs

為了提高GPU的可編程性並利用NVIDIA A100 GPU的硬件計算能力,CUDA 11包含了新的API操作,用於內存管理、任務圖加速、新指令和線程通信結構。下面我們來看看這些新操作,以及它們如何使您能夠利用A100和NVIDIA安培微體系結構。             

內存管理             

最大化GPU內核性能的優化策略之一是最小化數據傳輸。如果內存駐留在全局內存中,則將數據讀入二級緩存或共享內存的延遲可能需要幾百個處理器周期。             

例如,在GV100上,共享內存提供的帶寬比全局內存快17倍或比L2快3倍。因此,一些具有生產者-消費者范式的算法可以觀察到在內核之間的L2中持久化數據的性能優勢,從而獲得更高的帶寬和性能。             

在A100上,CUDA 11提供API操作,以留出40-MB L2緩存的一部分來持久化對全局內存的數據訪問。持久化訪問優先使用二級緩存的這一預留部分,而對全局內存的正常或流式訪問只能在持久化訪問未使用二級緩存的這一部分時使用。             

二級持久性可以設置為在CUDA流或CUDA圖內核節點中使用。在設置二級緩存區域時需要考慮一些因素。例如,多個CUDA內核在不同的流中並發執行,同時具有不同的訪問策略窗口,共享二級備用緩存。下面的代碼示例顯示了為持久性預留二級緩存比率。

cudaGetDeviceProperties( &prop, device_id);

// Set aside 50% of L2 cache for persisting accesses

size_t size = min( int(prop.l2CacheSize * 0.50) , prop.persistingL2CacheMaxSize );

cudaDeviceSetLimit( cudaLimitPersistingL2CacheSize, size);

// Stream level attributes data structure

cudaStreamAttrValue attr ;​

attr.accessPolicyWindow.base_ptr = /* beginning of range in global memory */ ;​

attr.accessPolicyWindow.num_bytes = /* number of bytes in range */ ;​

// hitRatio causes the hardware to select the memory window to designate as persistent in the area set-aside in L2

attr.accessPolicyWindow.hitRatio = /* Hint for cache hit ratio */

// Type of access property on cache hit

attr.accessPolicyWindow.hitProp = cudaAccessPropertyPersisting;​

// Type of access property on cache miss

attr.accessPolicyWindow.hitProp = cudaAccessPropertyStreaming;

cudaStreamSetAttribute(stream,cudaStreamAttributeAccessPolicyWindow,&attr);

虛擬內存管理API操作已經擴展,以支持對固定GPU內存的壓縮,從而減少二級到DRAM的帶寬。這對於深入學習訓練和推理用例非常重要。使用cuMemCreate創建可共享內存句柄時,將向API操作提供分配提示。             

諸如3D模板或卷積等算法的有效實現涉及內存復制和計算控制流模式,其中數據從全局內存傳輸到線程塊的共享內存中,然后是使用該共享內存的計算。全局到共享內存的拷貝被擴展成從全局內存讀取到寄存器,然后寫入共享內存。              

CUDA 11允許您利用新的異步復制(async copy)范式。它本質上與將數據從全局復制到共享內存與計算重疊,並避免使用中間寄存器或一級緩存。異步復制的好處是:控制流不再兩次遍歷內存管道,並且不使用中間寄存器可以減少寄存器壓力,增加內核占用率。在A100上,異步復制操作是硬件加速的。             

下面的代碼示例顯示了一個使用異步復制的簡單示例。生成的代碼雖然性能更高,但可以通過多批異步復制操作的流水線進一步優化。這種額外的流水線可以消除代碼中的一個同步點。              異步拷貝在CUDA 11中作為一個實驗特性提供,並使用協作組集合公開。CUDA C++編程指南包括使用A級副本和多級加速流水線的AAA副本和A100中硬件加速的屏障操作的更高級示例。

//Without async-copy
 
using namespace nvcuda::experimental;
__shared__ extern int smem[];
 
// algorithm loop iteration
while ( ... ) {
 
  __syncthreads(); 
  
  // load element into shared mem
  for ( i = ... ) {
    // uses intermediate register
    // {int tmp=g[i]; smem[i]=tmp;}
    smem[i] = gldata[i]; 
  }
//With async-copy
 
using namespace nvcuda::experimental;
__shared__ extern int smem[];
 
pipeline pipe;
 
// algorithm loop iteration
while ( ... ) {
 
  __syncthreads(); 
  
  // load element into shared mem
  for ( i = ... ) {
    // initiate async memory copy
    memcpy_async(smem[i], 
                 gldata[i], 
                 pipe); 
  }
 
  // wait for async-copy to complete
  pipe.commit_and_wait();
 
  __syncthreads();
 
  /* compute on smem[] */
 
}

任務圖加速             

CUDA圖在CUDA 10中引入,代表了一種使用CUDA提交工作的新模型。一個圖由一系列操作組成,如內存拷貝和內核啟動,這些操作通過依賴關系連接起來,並與執行分開定義。             

任務圖允許定義一次重復運行的執行流。它們可以減少累計的發射開銷,並提高應用程序的總體性能。這尤其適用於深度學習應用程序,這些應用程序可能會在任務大小和運行時減少的情況下啟動多個內核,或者在任務之間具有復雜的依賴關系。             

從A100開始,GPU提供任務圖硬件加速來預取網格啟動描述符、指令和常量。與以前的gpu(如V100)相比,這改善了在A100上使用CUDA圖的內核啟動延遲。

CUDAGraphAPI操作現在有一個輕量級機制來支持對實例化的圖的就地更新,而不需要重建圖。在圖的重復實例化過程中,節點參數(如內核參數)通常會在圖拓撲保持不變的情況下更改。圖形API操作提供了一種更新整個圖形的機制,在該機制中,您可以提供具有更新的節點參數的拓撲上相同的cudaGraph_t對象,或者顯式更新單個節點。             

此外,CUDA圖現在支持協同內核啟動(cuLaunchCooperativeKernel),包括與CUDA流對等的流捕獲。             

線程集             

下面是CUDA 11為協作組添加的一些增強,在CUDA 9中引入。協作組是一種集體編程模式,旨在使您能夠顯式地表示線程可以通信的粒度。這使得CUDA中出現了新的協作並行模式。             

在CUDA 11中,協作組集合公開了新的A100硬件特性,並添加了一些API增強。有關完整的更改列表的更多信息,請參見CUDA C++編程指南。             

A100引入了一個新的reduce指令,它對每個線程提供的數據進行操作。這是一個使用協作組的新集合,它提供了一個可移植的抽象,也可以在舊的架構上使用。reduce操作支持算術(例如add)和邏輯(例如and)操作。下面的代碼示例顯示了reduce集合。

// Simple Reduction Sum
#include <cooperative_groups/reduce.h>
 
   ...
   const int threadId = cta.thread_rank(); 
   int val = A[threadId]; 
   // reduce across tiled partition 
   reduceArr[threadId] = cg::reduce(tile, val, cg::plus<int>()); 
   // synchronize partition 
   cg::sync(cta); 
   // accumulate sum using a leader and return sum

協作組提供了將父組划分為一維子組的集合操作(標記為“分區”),在這些子組中,線程合並在一起。這對於試圖通過條件語句的基本塊跟蹤活動線程的控制流特別有用。             

例如,可以使用標記的分區從一個warp級別組(不受2次方的限制)中形成多個分區,並在原子添加操作中使用。labeled_partition API操作計算條件標簽,並將標簽值相同的線程分配到同一組中。             

以下代碼示例顯示自定義線程分區:

// Get current active threads (that is, coalesced_threads())
cg::coalesced_group active = cg::coalesced_threads();
 
// Match threads with the same label using match_any() 
int bucket = active.match_any(value); 
 
cg::coalesced_group subgroup = cg::labeled_partition(active, bucket);
 
// Choose a leader for each partition (for example, thread_rank = 0)
// 
if (subgroup.thread_rank() == 0) { 
   threadId = atomicAdd(&addr[bucket], subgroup.size()); 
}
 
// Now use shfl to transfer the result back to all threads in partition
return (subgroup.shfl(threadId, 0));

CUDA C++ language and compiler improvements

CUDA 11也是第一個正式包含CUB作為CUDA工具包的一部分的版本。CUB現在是支持的CUDA C++核心庫之一。             

CUDA 11的nvcc的主要特性之一是支持鏈路時間優化(LTO)以提高單獨編譯的性能。LTO使用--dlink time opt或-dlto選項,在編譯期間存儲中間代碼,然后在鏈接時執行高級優化,例如跨文件內聯代碼。             

CUDA 11中的NVCC增加了對ISO C++ 17的支持,並支持PGI、GCC、CLAN、ARM和微軟VisualStudio上的新主機編譯器。如果要嘗試尚未支持的主機編譯器,則在編譯生成工作流期間,nvcc支持一個新的--allow-unsupported-compiler標志。nvcc增加了其他新功能,包括:             

改進的lambda支持             

依賴項文件生成增強功能(-MD,-MMD選項)             

傳遞選項到宿主編譯器

 

Figure 4. Platform support in CUDA 11.  

CUDA libraries

CUDA 11中的庫通過在線性代數、信號處理、基本數學運算和圖像處理中常見的api之后使用最新和最強大的A100硬件特性,繼續突破性能和開發人員生產力的界限。

在線性代數庫中,您將看到A100上所有精度的張量核加速度,包括FP16、Bfloat16、TF32和FP64。這包括cuBLAS中的BLAS3運算、cuSOLVER中的因子分解和稠密線性解算,以及cuTENSOR中的張量收縮。             

除了提高了精度范圍外,還消除了張量核加速度對矩陣尺寸和對准的限制。對於適當的精度,加速度現在是自動的,不需要用戶選擇加入。cuBLAS的啟發式算法在GPU實例上運行時自動適應資源,MIG在A100上運行。

 

Figure 6. Mixed-precision matrix multiply on A100 with cuBLAS.

CurLASS,CUDA C++模板的高性能GEMM抽象,支持A100提供的各種精度模式。有了CUDA11,CUTLASS現在可以實現與cuBLAS 95%以上的性能對等。這允許您編寫自己的自定義CUDA內核,以便在NVIDIA GPU中編程張量內核。

cuFFT利用A100中較大的共享內存大小,從而在較大的批處理大小下為單精度fft帶來更好的性能。最后,在多GPU A100系統上,袖口可伸縮,每GPU的性能是V100的兩倍。             

nvJPEG是一個GPU加速的JPEG解碼庫。與NVIDIA DALI(一個數據增強和圖像加載庫)一起,可以加速對圖像分類模型,特別是計算機視覺的深入學習訓練。圖書館加速了深度學習工作流的圖像解碼和數據擴充階段。             

A100包括一個5核硬件JPEG解碼引擎,nvJPEG利用硬件后端對JPEG圖像進行批量處理。通過專用硬件塊的JPEG加速減輕了CPU上的瓶頸,並允許更好的GPU利用率。             

選擇硬件解碼器由給定圖像的nvjpeg解碼自動完成,或者通過使用nvjpegCreateEx init函數顯式選擇硬件后端來完成。nvJPEG提供了基線JPEG解碼的加速,以及各種顏色轉換格式,例如YUV 420、422和444。             

與僅使用CPU的處理相比,這將使圖像解碼速度提高18倍。如果您使用DALI,您可以直接受益於這種硬件加速,因為nvJPEG是抽象的。

 

Figure 9. nvJPEG Speedup vs. CPU. (Batch 128 with Intel Platinum 8168 @2GHz 3.7GHz Turbo HT on; with TurboJPEG)

CUDA數學庫中的特性比一篇文章所能涵蓋的要多得多。

Developer tools

CUDA 11繼續在現有的開發工具組合中添加豐富的特性。這包括熟悉的Visual Studio插件、NVIDIA Nsight Integration for Visual Studio和Eclipse插件版本。它還包括獨立的工具,如用於內核分析的Nsight Compute和用於系統范圍性能分析的Nsight系統。Nsight Compute和Nsight系統現在在CUDA支持的所有三種CPU體系結構上都受支持:x86、POWER和Arm64。

Nsight Compute for CUDA 11的一個關鍵特性是能夠生成應用程序的屋頂模型。屋頂模型是一種直觀的方法,通過將浮點性能、算術強度和內存帶寬結合到二維圖中,您可以直觀地了解內核特性。             

通過查看屋頂線模型,可以快速確定內核是計算綁定的還是內存綁定的。您還可以了解進一步優化的潛在方向,例如,靠近屋頂線的內核可以優化使用計算資源。             

有關詳細信息,請參見屋頂線性能模型。

 

Figure 11. A Roofline model in Nsight Compute.

CUDA 11包括Compute Sanitizer,這是一個新一代的功能正確性檢查工具,它提供了對越界內存訪問和競爭條件的運行時檢查。Compute Sanitizer是cuda memcheck工具的替代品。              下面的代碼示例顯示了計算清理器檢查內存訪問的示例。

//Out-of-bounds Array Access
__global__ void oobAccess(int* in, int* out)
{
    int bid = blockIdx.x;
    int tid = threadIdx.x;
    if (bid == 4)
    {
        out[tid] = in[dMem[tid]];
    }
}
 
int main()
{
    ...
    // Array of 8 elements, where element 4 causes the OOB
    std::array<int, Size> hMem = {0, 1, 2, 10, 4, 5, 6, 7};
    cudaMemcpy(d_mem, hMem.data(), size, cudaMemcpyHostToDevice);
 
    oobAccess<<<10, Size>>>(d_in, d_out);
    cudaDeviceSynchronize();
    ... 
$ /usr/local/cuda-11.0/Sanitizer/compute-sanitizer --destroy-on-device-error kernel --show-backtrace no basic
========= COMPUTE-SANITIZER
Device: Tesla T4
========= Invalid __global__ read of size 4 bytes
=========     at 0x480 in /tmp/CUDA11.0/ComputeSanitizer/Tests/Memcheck/basic/basic.cu:40:oobAccess(int*,int*)
=========     by thread (3,0,0) in block (4,0,0)
=========     Address 0x7f551f200028 is out of bounds

下面的代碼示例顯示了用於競爭條件檢查的計算清理器示例。

//Contrived Race Condition Example
__global__ void Basic()
{
    __shared__ volatile int i;
    i = threadIdx.x;
}
 
int main()
{
    Basic<<<1,2>>>();
    cudaDeviceSynchronize();
    ...
$ /usr/local/cuda-11.0/Sanitizer/compute-sanitizer --destroy-on-device-error kernel --show-backtrace no --tool racecheck --racecheck-report hazard raceBasic
========= COMPUTE-SANITIZER
========= ERROR: Potential WAW hazard detected at __shared__ 0x0 in block (0,0,0) :
=========     Write Thread (0,0,0) at 0x100 in /tmp/CUDA11.0/ComputeSanitizer/Tests/Racecheck/raceBasic/raceBasic.cu:11:Basic(void)
=========     Write Thread (1,0,0) at 0x100 in /tmp/CUDA11.0/ComputeSanitizer/Tests/Racecheck/raceBasic/raceBasic.cu:11:Basic(void)
=========     Current Value : 0, Incoming Value : 1
=========
========= RACECHECK SUMMARY: 1 hazard displayed (1 error, 0 warnings)

最后,盡管CUDA11不再支持在macOS上運行應用程序,但我們正在為macOS主機上的用戶提供開發工具:

  • Remote target debugging using cuda-gdb
  • NVIDIA Visual Profiler
  • Nsight Eclipse plugins 
  • The Nsight family of tools for remote profiling or tracing 

Summary

CUDA11提供了一個基本的開發環境,用於為NVIDIA安培GPU體系結構構建應用程序,並在NVIDIA A100上為人工智能、數據分析和HPC工作負載構建強大的服務器平台,這兩個平台都用於內部部署(DGX A100)和雲部署(HGX A100)。

 

Figure 12. Different ways to get CUDA 11.

CUDA 11即將上市。與往常一樣,您可以通過多種方式獲得CUDA 11:下載本地安裝程序包、使用包管理器安裝或從各種注冊中心獲取容器。對於企業部署,CUDA11還包括RHEL8的驅動程序打包改進,使用模塊化流來提高穩定性和減少安裝時間。             

要了解有關CUDA 11的更多信息並獲得問題的答案,請注冊以下即將舉行的在線研討會:

另外,請注意以下有關GTC的談話,深入探討本帖中所涉及的A100的功能。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM