最近準備再挖個坑,翻譯下cuda_samples,給入門想看代碼又不知道看點啥的小同學提供一些指引(順便指引下自己)。本文簡要介紹samples裏的項目的主要功能。
簡介
- Simple Reference
基礎CUDA示例,適用於初學者, 反映了運用CUDA和CUDA runtime APIs的一些基本概念. - Utilities Reference
演示如何查詢設備能力和衡量GPU/CPU 帶寬的實例程序。 - Graphics Reference
圖形化示例展現的是 CUDA, OpenGL, DirectX 之間的互通性 - Imaging Reference
圖像處理,壓縮,和數據分析 - Finance Reference
金融計算的並行處理 - Simulations Reference
展現一些運用CUDA的模擬算法 - Advanced Reference
用CUDA實現的一些先進的算法 - Cudalibraries Reference
這類示例主要告訴我們該如何使用CUDA各種函數庫(NPP, CUBLAS, CUFFT,CUSPARSE, and CURAND).
Simple Reference
- asyncAPI
使用CUDA stream和events重疊CPU和GPU的執行 - cdpSimplePrint - Simple Print (CUDA Dynamic Parallelism)
展示了使用CUDA Dynamic Parallelism進行簡單輸出,需要3.5以上。依賴於CDP - cdpSimpleQuicksort - Simple Quicksort (CUDA DynamicParallelism)
使用CUDA DynamicParallelism進行快速排序。也要求3.5以上 - clock - Clock
如何使用clock函數去精確測量block的性能 - clock_nvrtc - Clock libNVRTC
使用libNVRTC裏的clock_nvtrc函數精確測量blokc性能 - cppIntegration - C++ Integration
展示如何將CUDA程序整合進一個現成的C++應用中。CUDA的入口指針在主機端就是個函數,只有包含這個函數的時候纔會用nvcc編譯。也展示了向量類型也可以被CUDA使用。 - cppOverload
展示如何在GPU上重載C++函數 - cudaOpenMP
如何使用cudaOpenMP API來寫多GPU程序 - fp16ScalarProduct - FP16 Scalar Product
計算兩個FP16類型標量的乘積 - inlinePTX - Using Inline PTX
展示在CUDA代碼中嵌入ptx代碼 - inlinePTX_nvrtc - Using Inline PTX with libNVRTC
同上 - matrixMul - Matrix Multiplication (CUDA Runtime API Version)
實現了矩陣乘法。爲了清楚地展示CUDA編程的規則而不是致力於優化矩陣乘法。爲了展示GPU矩陣乘的性能,也使用了CUBLAS這個庫去展示高性能的矩陣乘。 - matrixMul_nvrtc - Matrix Multiplication with libNVRTC
同上 - matrixMulCUBLAS - Matrix Multiplication (CUBLAS)
同上 - matrixMulDrv - Matrix Multiplication (CUDA Driver API Version)
這個是使用驅動API實現的矩陣乘。 - simpleAssert
如何使用Assert函數 - simpleAssert_nvrtc - simpleAssert with libNVRTC
同上 - simpleAtomicIntrinsics - Simple Atomic Intrinsics
原子操作 - simpleAtomicIntrinsics_nvrtc - Simple Atomic Intrinsics with libNVRTC
同上 - simpleCallback - Simple CUDA Callbacks
CUDA5.0的新功能。使用CPU回調CUDA流和事件的多線程異步計算。 - simpleCubemapTexture - Simple Cubemap Texture
CUDA4.1的新功能,如何在代碼中使用cubemap Textures - simpleIPC
展示進程間通訊(Inter Process Communication,IPC),需要Linux系統 - simpleLayeredTexture - Simple Layered Texture
CUDA4.0支持層次紋理操作 - simpleMPI
如何使用信息傳遞接口(Message Passing Interface,MPI) - simpleMultiCopy - Simple Multi Copy and Compute
1.1以上,將計算和數據傳輸重疊。在2.0的機器上,在PCIe上任意方向的全速重疊都是可能的。這個例子展示了使用CUDA stream來重疊數據傳輸和Kernel執行。 - simpleMultiGPU - Simple Multi-GPU
CUDA4.0對於CUDA上下文的管理和多GPU上的多線程併發 - simpleOccupancy
通過利用配置程序啓動一個Kernel來說明CUDA佔用計算器(occupancy calculator)和佔用啓動配置器的使用(這特麼都是啥。。。),並檢測不同配置下的使用率。 - simpleP2P - Simple Peer-to-Peer Transfers with Multi-GPU
展示P2P的數據傳輸。也就是設備之間的數據傳輸。 - simplePitchLinearTexture - Pitch Linear Texture
這翻譯成等步長紋理。 - simplePrintf
如何在設備中使用輸出語句。在2.0之前,要用cuPrintf,之後可以直接printf。 - simpleSeparateCompilation - Simple Static GPU Device Library
5.0特性,創建一個GPU靜態庫並在其他的Kernel中使用。這個例子展示瞭如何把一個(靜態庫中的)設備函數作爲函數指針被調用。 - simpleStreams
使用CUDA流重疊數據傳輸和Kernel執行。使用了頁鎖定內存 - simpleSurfaceWrite - Simple Surface Write
2D表面引用 - simpleTemplates - Simple Templates
就是講講模板怎麼用,特別的,如何使用模板動態申請共享內存。 - simpleTemplates_nvrtc - Simple Templates with libNVRTC
同上 - simpleTexture - Simple Texture
使用紋理內存 - simpleTextureDrv - Simple Texture (Driver Version)
使用驅動API操作紋理內存 - simpleVoteIntrinsics - Simple Vote Intrinsics
如何使用Vote Intrinsics(不知道是啥) - simpleVoteIntrinsics_nvrtc - Simple Vote Intrinsics with libNVRTC
同上並且要使用NVRTC 接口。 - simpleZeroCopy
零拷貝內存的使用,利用零拷貝可以直接從地址中讀取而不用傳遞。 - systemWideAtomics - System wide Atomics
原子操作 - template - Template
一個零碎的模板工程,可以被用於創建一個粗大工程。 - UnifiedMemoryStreams - Unified Memory Streams
使用統一內存的OpenMP和流。 - vectorAdd - Vector Addition
運行時API實現的向量加法 - vectorAdd_nvrtc - Vector Addition with libNVRTC
同上 - vectorAddDrv - Vector Addition Driver API
同上
Utilities Reference
- bandwidthTest - Bandwidth Test
檢測GPU之間內存複製的帶寬和PCIe帶寬。可以檢測各種帶寬。 - deviceQuery - Device Query
設備信息。 - deviceQuery - Device Query
使用驅動API檢測設備信息。 - p2pBandwidthLatencyTest - Peer-to-Peer Bandwidth Latency Test with Multi-GPUs
用來檢測設備之間的數據計算時延和帶寬。使用P2P和沒使用都檢測了。 - topologyQuery - Topology Query
多GPU下請求的拓補結構。
Graphics Reference
- bindlessTexture - Bindless Texture
展示對cudaSurfaceObject, cudaTextureObject和MipMap的使用 - Mandelbrot
展示Mandelbrot 或者 Julia集。同時也展示如何使用”double single”算法提高放大精度。 - marchingCubes - Marching Cubes Isosurfaces
嗯。。。實在不知道是在講啥,只能直譯了。使用marching cubes算法從一堆數據中抽象出來幾何等值面。 - simpleD3D10 - Simple Direct3D10 (Vertex Array)
展示CUDA和Direct3D10的互操作性,通過CUDA產生了定點數組使用Direct3D10給出幾何結構(?) - simpleD3D10RenderTarget - Simple Direct3D10 Render Target
CUDA和Direct3D10中渲染目標(rendertargets)的互操作性。使用CUDA對渲染目標的位置產生一個可視化直方圖。 - simpleD3D10Texture - Simple D3D10 Texture
展示CUDA和Direct3D10的紋理互操作性。 - simpleD3D11Texture - Simple D3D11 Texture
吶,不出所料是展示CUDA和Direct3D11的紋理互操作性咯。 - simpleD3D9 - Simple Direct3D9 (Vertex Arrays)
見條目4 - simpleD3D9Texture - Simple D3D9 Texture
見條目6 - simpleGL - Simple OpenGL
這是CUDA和OpenGL的互操作性。通過CUDA修改定點位置,然後用OpenGL渲染。 - simpleGLES - Simple OpenGLES
展示CUDA和OpenGLES的數據交換。改變頂點位置並用OpenGL ES渲染。 - simpleGLES_EGLOutput - Simple OpenGLES EGLOutput
展示CUDA和OpenGLES的數據交換。改變頂點位置並用OpenGL ES渲染。並展示使用EGLOutput機制和DRM庫如何直接渲染顯示。(然後顯示在屏幕上) - simpleGLES_screen - Simple OpenGLES on Screen
展示CUDA和OpenGLES的數據交換。改變頂點位置並用OpenGL ES渲染。 - simpleTexture3D - Simple Texture 3D
使用3維紋理 - SLID3D10Texture - SLI D3D10 Texture
展示帶有Direct3D10紋理的SLI與CUDA的互操作性。創建了一個從CUDAKernel寫入的D3D10紋理。之後Direct3D在屏幕上渲染了結果 - volumeFiltering - Volumetric Filtering with 3D Textures and Surface Writes
使用3D紋理和3D表面寫進行3D體積過濾 - volumeRender - Volume Rendering with 3D Textures
使用3D紋理進行基礎的體積渲染
Imaging Reference
暫略
Finance Reference
暫略
Simulations Reference
- fluidsD3D9 - Fluids (Direct3D Version)
利用CUDA和CUFFT進行流體模擬,利用Direct3D 9渲染。 - fluidsGL - Fluids (OpenGL Version)
利用CUDA和CUFFT進行流體模擬,利用OpenGL渲染。 - fluidsGLES - Fluids (OpenGLES Version)
利用CUDA和CUFFT進行流體模擬,利用OpenGL渲染。 - nbody - CUDA N-Body Simulation
模擬了N體問題(對的,包括三體)。通過參數可以控制N的大小,並且能夠控制使用多少GPU設備。體的位置和速度使用零拷貝內存存儲,對於設備數量少於4和有大量體的情況,帶寬不再是運行瓶頸我們可以實現大規模的數據。 - nbody_opengles - CUDA N-Body Simulation with GLES
這個模擬不提供用戶交互。 - nbody_screen - CUDA N-Body Simulation on Screen
在屏幕上模擬? - oceanFFT - CUDA FFT Ocean Simulation
使用CUFFT庫模擬海洋高度場(Ocean height field),並用OpenGL渲染。 - particles - Particles
模擬大量粒子的相互作用。可以控制參數粒子的個數。這個粒子實現了一種統一數據結構,利用原子操作或者Thrust庫的快速基數排序。 - smokeParticles - Smoke Particles
煙霧的光影體積模擬,用CUDA實現的一些先進的算法,使用半張角切片(half-angle slicing)技術。使用CUDA模擬,Thrust庫排序,OpenGL渲染。 - VFlockingD3D10
這個是模擬什麼大鳥的V型絨毛的(V-shaped flocks by big birds)。。。有GPU和CPU實現版本,使用g去開關這兩者。
Advanced Reference
- alignedTypes - Aligned Types
展示對齊與非對齊結構體之間傳輸速度 - c++11_cuda - C++11 CUDA
展示CUDA對C++11特性的支持。掃描了輸入文件,輸出x,y,z,w的。 - cdpAdvancedQuicksort - Advanced Quicksort (CUDA Dynamic Parallelism)
實現了高級的快速排序,使用CUDA Dynamic Parallelism。 - cdpBezierTessellation - Bezier Line Tessellation (CUDA Dynamic Parallelism)
嗯,就是,bezier tessellation of lines這個的實現。什麼貝啓爾曲線啥的,中文和英文一樣看不到 (= = ) - cdpLUDecomposition - LU Decomposition (CUDA Dynamic Parallelism)
LU分解是一種將非奇異矩陣進行三角分解的方法,然後CUDA模擬一下。 - cdpQuadtree - Quad Tree (CUDA Dynamic Parallelism)
象限四分樹(哇哦。。。) - concurrentKernels - Concurrent Kernels
stream中並行執行多個Kernel,並闡明如何處理CUDA stream之間的依賴。 - eigenvalues - Eigenvalues
算特徵值對於線性代數來說十分重要。這個例子實現了一個並行的二分算法,計算一個隨機大小的三對角矩陣的特徵值。 - fastWalshTransform - Fast Walsh Transform
實現快速沃爾什變換 - FDTD3d - CUDA C 3D FDTD
該樣例在3D表面上應用有限差分時域進展模板。(是的你沒看錯) - FunctionPointers - Function Pointers
教你怎麼使用函數指針並且實現了索貝爾邊緣檢測。 - interval - Interval Computing
實現區間計算。 - lineOfSight - Line of Sight
視線算法的視線。給定一個高度圖和來自一些觀察點的射線,計算從觀察點沿着光線經過的所有的點。 - matrixMulDynlinkJIT - Matrix Multiplication (CUDA Driver API version with Dynamic Linking Version)
使用CUDA驅動API再次實現矩陣乘法。展示瞭如何在運行時鏈接驅動並且即時編譯PTX代碼。主要也是爲了展示CUDA的程序規則而不是優化程序。CUBLAS被用於這個計算。
15.mergeSort - Merge Sort
實現了歸併排序。雖然這種排序在大序列的排序上通常效率較低,但是在中等大小的鍵值對排序上是個好的選擇。 - newdelete - NewDelete
展示在設備上動態new 和 delete空間和聲明虛函數。 - ptxjit - PTX Just-in-Time compilation
使用驅動API從PTX即時編譯Kernel。並展示了運行時和驅動API互操作性的無縫銜接。對於CUDA5.5,這個例子展示如何使用cuLink*這樣的函數鏈接PTX。 - radixSortThrust - CUDA Radix Sort (Thrust Library)
使用Thrust庫進行超級快而且高效並行的基數排序。既可以進行鍵值對排序也可以只進行鍵的排序。這個代碼使用了線程束同步,依賴於GPU上的線程都屬於線程束這個規則,所有的線程都同步地執行。當線程束內的線程訪問共享內存時,代碼中不用__syncthreads()。對於這種沒有競爭條件的操作,想要正確執行必須將共享內存定義爲volatile。如果不定義,在缺少__syncthreads()時,編譯器會延遲將數據存到共享內存而是保存到寄存器中(編譯器的優化措施),這樣會導致錯誤。因此要主要這方面的應用。 - reduction - CUDA Parallel Reduction
規約。這裏有一些優化方法。 - scalarProd - Scalar Product
標量相乘。 - scan - CUDA Parallel Prefix Sum (Scan)
並行前綴和(也稱掃描算法)。 - segmentationTreeThrust - CUDA Segmentation Tree Thrust Library
構造圖像分割樹的方法。基於Boruvka的MST算法。 - shfl_scan - CUDA Parallel Prefix Sum with Shuffle Intrinsics (SHFL_Scan)
如何使用shuffle(線程束混洗)來進行掃描。 - simpleHyperQ
流中多個Kernel並行,並且使用了HyperQ技術(這裏竟然有教程) - sortingNetworks - CUDA Sorting Networks
雙調排序奇偶合並排序。雖然這種排序在大序列的排序上通常效率較低,但是在中等大小的鍵值對排序上是個好的選擇。 - StreamPriorities - Stream Priorities
如何使用流。 - threadFenceReduction
使用thread Fence來進行規約。單步規約需要原子操作和_threadfence()指令 - threadMigration - CUDA Context Thread Management
適合使用CUDA上下文管理和使用新的CUDA4.0的參數傳遞以及CUDA啓動API。CUDA上下文可以被分別創建並且獨立地和不同的線程連接。 - transpose - Matrix Transpose
矩陣轉置。有一些操作用來優化。
Cudalibraries Reference
- batchCUBLAS
教你怎麼使用批量的CUBLAS的API提高程序性能。 - BiCGStab
使用CUSPARSE和CUBLAS對有限的對稱和非對稱線性系統的穩定雙共軛梯度(Bi-Conjugate Gradient Stabilized)迭代方法。 - boxFilterNPP - Box Filter with NPP
如何使用NPP盒式過濾器函數執行盒式過濾。 - cannyEdgeDetectorNPP - Canny Edge Detector NPP
什麼邊緣檢測過濾器。用這個可以把輸入圖片搞成灰度圖片。 - conjugateGradient - ConjugateGradient
使用CUBLAS and CUSPARSE庫實現共軛梯度計算 - conjugateGradientPrecond - Preconditioned Conjugate Gradient
使用CUBLAS and CUSPARSE庫實現前承條件共軛梯度計算 - conjugateGradientUM - ConjugateGradientUM
使用統一內存和CUBLAS and CUSPARSE庫實現共軛梯度計算 - cuHook - CUDA Interception Library
展示如何編譯和使用一個截距庫。這個庫要通過LD_PRELOAD加載。
libcuhook.so.1 ./cuHook - cuSolverDn_LinearSolver - cuSolverDn Linear Solver
實現cuSolverDN的LU, QR和Cholesky因式分解 - cuSolverRf - cuSolverRf Refactorization
重新因子化。 - cuSolverSp_LinearSolver - cuSolverSp Linear Solver
實現cuSolverSP的LU, QR和Cholesky因式分解 - cuSolverSp_LowlevelCholesky - cuSolverSp LowlevelCholesky Solver
使用cuSolverSP底層API實現Cholesky因式分解 - cuSolverSp_LowlevelQR - cuSolverSp Lowlevel QR Solver
使用cuSolverSP底層API實現QR因式分解 - FilterBorderControlNPP - Filter Border Control NPP
如何在常見模式下使用NPP過濾器函數的邊緣版本,可以用來備份NPP的相同的無邊界版本函數的結果,也可以被用來開關不同原圖片邊緣的邊界控制,這些圖片邊緣依賴於被作爲輸入的原圖片的部分。(是是是,你說得都對) - freeImageInteropNPP - FreeImage and NPP Interopability
使用FreeImage庫 - histEqualizationNPP - Histogram Equalization with NPP
如何使用NNP把圖片數據直方圖均值化 - jpegNPP - JPEG encode/decode and resize with NPP
流水線處理圖片。首先一個JPEG圖片被哈弗曼編碼然後被離散餘弦轉換且去量子化。不同區域被重新調整大小。最後反過來,重新量子化,正向離散餘弦轉換再哈弗曼解碼。 - MC_EstimatePiInlineP - Monte Carlo Estimation of Pi(inline PRNG)
使用蒙特卡羅方法模擬π(內聯PRNG),並使用NVIDIA CURAND庫。 - MC_EstimatePiInlineQ - Monte Carlo Estimation of Pi(inline QRNG)
使用蒙特卡羅方法模擬π(內聯QRNG),並使用NVIDIA CURAND庫。 - MC_EstimatePiP - Monte Carlo Estimation of Pi (batch PRNG)
使用蒙特卡羅方法模擬π(使用批量PRNG).),並使用NVIDIA CURAND庫。 - MC_EstimatePiQ - Monte Carlo Estimation of Pi (batch QRNG)
使用蒙特卡羅方法模擬π(使用批量RRNG).),並使用NVIDIA CURAND庫。 - MC_SingleAsianOptionP - Monte Carlo Single Asian Option
使用蒙特卡羅方法模擬簡單亞式期權,並使用NVIDIA CURAND庫。 - MersenneTwisterGP11213
模擬梅森旋轉算法,使用cuRAND產生隨機數 - nvgraph_Pagerank - NVGRAPH Page Rank
使用NVGRAPH庫進行Page Rank - nvgraph_SemiRingSpmv - NVGRAPH Semi-Ring SpMV
使用NVGRAPH庫進行半環向量乘法。 - nvgraph_SSSP - NVGRAPH Single Source Shortest Path
使用NVGRAPH庫計算單源最短路徑 - randomFog - Random Fog
演示使用CURAND產生僞隨機和準隨機算法 - simpleCUBLAS - Simple CUBLAS
演示怎麼使用最新的CUBLAS庫 - simpleCUBLASXT - Simple CUBLAS XT
CUBLAS-XT庫使用 - simpleCUFFT - Simple CUFFT
使用CUFFT計算帶有過濾的信號的1維卷積,通過將其轉換入頻域(frequency domain),使其二者相乘,並重新傳回時域。CUFFT計劃是產生於簡單和高級API的需求的。 - simpleCUFFT_2d_MGPU - SimpleCUFFT_2d_MGPU
這個是用CUFFT計算二維卷積。,並且是多個GPU。 - simpleCUFFT_callback - Simple CUFFT Callbacks
這個也是 使用CUFFT計算帶有過濾的信號的1維卷積,通過將其轉換入頻域(frequency domain),使其二者相乘,並重新傳回時域。不同之處在於,多個步驟是由用戶提供的一個CUFFT回調函數實現而不是一個分離的Kernel調用。 - simpleCUFFT_MGPU - Simple CUFFT_MGPU
多GPU的一維卷積。 - simpleDevLibCUBLAS - simpleDevLibCUBLAS GPU Device API Library Functions (CUDA Dynamic Parallelism)
該示例實現了一個簡單的CUBLAS函數調用,調用運行CUBLAS函數的GPU設備API庫