CUDA Samples

最近準備再挖個坑,翻譯下cuda_samples,給入門想看代碼又不知道看點啥的小同學提供一些指引(順便指引下自己)。本文簡要介紹samples裏的項目的主要功能。

簡介

  1. Simple Reference
    基礎CUDA示例,適用於初學者, 反映了運用CUDA和CUDA runtime APIs的一些基本概念.
  2. Utilities Reference
    演示如何查詢設備能力和衡量GPU/CPU 帶寬的實例程序。
  3. Graphics Reference
    圖形化示例展現的是 CUDA, OpenGL, DirectX 之間的互通性
  4. Imaging Reference
    圖像處理,壓縮,和數據分析
  5. Finance Reference
    金融計算的並行處理
  6. Simulations Reference
    展現一些運用CUDA的模擬算法
  7. Advanced Reference
    用CUDA實現的一些先進的算法
  8. Cudalibraries Reference
    這類示例主要告訴我們該如何使用CUDA各種函數庫(NPP, CUBLAS, CUFFT,CUSPARSE, and CURAND).

Simple Reference

  1. asyncAPI
    使用CUDA stream和events重疊CPU和GPU的執行
  2. cdpSimplePrint - Simple Print (CUDA Dynamic Parallelism)
    展示了使用CUDA Dynamic Parallelism進行簡單輸出,需要3.5以上。依賴於CDP
  3. cdpSimpleQuicksort - Simple Quicksort (CUDA DynamicParallelism)
    使用CUDA DynamicParallelism進行快速排序。也要求3.5以上
  4. clock - Clock
    如何使用clock函數去精確測量block的性能
  5. clock_nvrtc - Clock libNVRTC
    使用libNVRTC裏的clock_nvtrc函數精確測量blokc性能
  6. cppIntegration - C++ Integration
    展示如何將CUDA程序整合進一個現成的C++應用中。CUDA的入口指針在主機端就是個函數,只有包含這個函數的時候纔會用nvcc編譯。也展示了向量類型也可以被CUDA使用。
  7. cppOverload
    展示如何在GPU上重載C++函數
  8. cudaOpenMP
    如何使用cudaOpenMP API來寫多GPU程序
  9. fp16ScalarProduct - FP16 Scalar Product
    計算兩個FP16類型標量的乘積
  10. inlinePTX - Using Inline PTX
    展示在CUDA代碼中嵌入ptx代碼
  11. inlinePTX_nvrtc - Using Inline PTX with libNVRTC
    同上
  12. matrixMul - Matrix Multiplication (CUDA Runtime API Version)
    實現了矩陣乘法。爲了清楚地展示CUDA編程的規則而不是致力於優化矩陣乘法。爲了展示GPU矩陣乘的性能,也使用了CUBLAS這個庫去展示高性能的矩陣乘。
  13. matrixMul_nvrtc - Matrix Multiplication with libNVRTC
    同上
  14. matrixMulCUBLAS - Matrix Multiplication (CUBLAS)
    同上
  15. matrixMulDrv - Matrix Multiplication (CUDA Driver API Version)
    這個是使用驅動API實現的矩陣乘。
  16. simpleAssert
    如何使用Assert函數
  17. simpleAssert_nvrtc - simpleAssert with libNVRTC
    同上
  18. simpleAtomicIntrinsics - Simple Atomic Intrinsics
    原子操作
  19. simpleAtomicIntrinsics_nvrtc - Simple Atomic Intrinsics with libNVRTC
    同上
  20. simpleCallback - Simple CUDA Callbacks
    CUDA5.0的新功能。使用CPU回調CUDA流和事件的多線程異步計算。
  21. simpleCubemapTexture - Simple Cubemap Texture
    CUDA4.1的新功能,如何在代碼中使用cubemap Textures
  22. simpleIPC
    展示進程間通訊(Inter Process Communication,IPC),需要Linux系統
  23. simpleLayeredTexture - Simple Layered Texture
    CUDA4.0支持層次紋理操作
  24. simpleMPI
    如何使用信息傳遞接口(Message Passing Interface,MPI)
  25. simpleMultiCopy - Simple Multi Copy and Compute
    1.1以上,將計算和數據傳輸重疊。在2.0的機器上,在PCIe上任意方向的全速重疊都是可能的。這個例子展示了使用CUDA stream來重疊數據傳輸和Kernel執行。
  26. simpleMultiGPU - Simple Multi-GPU
    CUDA4.0對於CUDA上下文的管理和多GPU上的多線程併發
  27. simpleOccupancy
    通過利用配置程序啓動一個Kernel來說明CUDA佔用計算器(occupancy calculator)和佔用啓動配置器的使用(這特麼都是啥。。。),並檢測不同配置下的使用率。
  28. simpleP2P - Simple Peer-to-Peer Transfers with Multi-GPU
    展示P2P的數據傳輸。也就是設備之間的數據傳輸。
  29. simplePitchLinearTexture - Pitch Linear Texture
    這翻譯成等步長紋理。
  30. simplePrintf
    如何在設備中使用輸出語句。在2.0之前,要用cuPrintf,之後可以直接printf。
  31. simpleSeparateCompilation - Simple Static GPU Device Library
    5.0特性,創建一個GPU靜態庫並在其他的Kernel中使用。這個例子展示瞭如何把一個(靜態庫中的)設備函數作爲函數指針被調用。
  32. simpleStreams
    使用CUDA流重疊數據傳輸和Kernel執行。使用了頁鎖定內存
  33. simpleSurfaceWrite - Simple Surface Write
    2D表面引用
  34. simpleTemplates - Simple Templates
    就是講講模板怎麼用,特別的,如何使用模板動態申請共享內存。
  35. simpleTemplates_nvrtc - Simple Templates with libNVRTC
    同上
  36. simpleTexture - Simple Texture
    使用紋理內存
  37. simpleTextureDrv - Simple Texture (Driver Version)
    使用驅動API操作紋理內存
  38. simpleVoteIntrinsics - Simple Vote Intrinsics
    如何使用Vote Intrinsics(不知道是啥)
  39. simpleVoteIntrinsics_nvrtc - Simple Vote Intrinsics with libNVRTC
    同上並且要使用NVRTC 接口。
  40. simpleZeroCopy
    零拷貝內存的使用,利用零拷貝可以直接從地址中讀取而不用傳遞。
  41. systemWideAtomics - System wide Atomics
    原子操作
  42. template - Template
    一個零碎的模板工程,可以被用於創建一個粗大工程。
  43. UnifiedMemoryStreams - Unified Memory Streams
    使用統一內存的OpenMP和流。
  44. vectorAdd - Vector Addition
    運行時API實現的向量加法
  45. vectorAdd_nvrtc - Vector Addition with libNVRTC
    同上
  46. vectorAddDrv - Vector Addition Driver API
    同上

Utilities Reference

  1. bandwidthTest - Bandwidth Test
    檢測GPU之間內存複製的帶寬和PCIe帶寬。可以檢測各種帶寬。
  2. deviceQuery - Device Query
    設備信息。
  3. deviceQuery - Device Query
    使用驅動API檢測設備信息。
  4. p2pBandwidthLatencyTest - Peer-to-Peer Bandwidth Latency Test with Multi-GPUs
    用來檢測設備之間的數據計算時延和帶寬。使用P2P和沒使用都檢測了。
  5. topologyQuery - Topology Query
    多GPU下請求的拓補結構。

Graphics Reference

  1. bindlessTexture - Bindless Texture
    展示對cudaSurfaceObject, cudaTextureObject和MipMap的使用
  2. Mandelbrot
    展示Mandelbrot 或者 Julia集。同時也展示如何使用”double single”算法提高放大精度。
  3. marchingCubes - Marching Cubes Isosurfaces
    嗯。。。實在不知道是在講啥,只能直譯了。使用marching cubes算法從一堆數據中抽象出來幾何等值面。
  4. simpleD3D10 - Simple Direct3D10 (Vertex Array)
    展示CUDA和Direct3D10的互操作性,通過CUDA產生了定點數組使用Direct3D10給出幾何結構(?)
  5. simpleD3D10RenderTarget - Simple Direct3D10 Render Target
    CUDA和Direct3D10中渲染目標(rendertargets)的互操作性。使用CUDA對渲染目標的位置產生一個可視化直方圖。
  6. simpleD3D10Texture - Simple D3D10 Texture
    展示CUDA和Direct3D10的紋理互操作性。
  7. simpleD3D11Texture - Simple D3D11 Texture
    吶,不出所料是展示CUDA和Direct3D11的紋理互操作性咯。
  8. simpleD3D9 - Simple Direct3D9 (Vertex Arrays)
    見條目4
  9. simpleD3D9Texture - Simple D3D9 Texture
    見條目6
  10. simpleGL - Simple OpenGL
    這是CUDA和OpenGL的互操作性。通過CUDA修改定點位置,然後用OpenGL渲染。
  11. simpleGLES - Simple OpenGLES
    展示CUDA和OpenGLES的數據交換。改變頂點位置並用OpenGL ES渲染。
  12. simpleGLES_EGLOutput - Simple OpenGLES EGLOutput
    展示CUDA和OpenGLES的數據交換。改變頂點位置並用OpenGL ES渲染。並展示使用EGLOutput機制和DRM庫如何直接渲染顯示。(然後顯示在屏幕上)
  13. simpleGLES_screen - Simple OpenGLES on Screen
    展示CUDA和OpenGLES的數據交換。改變頂點位置並用OpenGL ES渲染。
  14. simpleTexture3D - Simple Texture 3D
    使用3維紋理
  15. SLID3D10Texture - SLI D3D10 Texture
    展示帶有Direct3D10紋理的SLI與CUDA的互操作性。創建了一個從CUDAKernel寫入的D3D10紋理。之後Direct3D在屏幕上渲染了結果
  16. volumeFiltering - Volumetric Filtering with 3D Textures and Surface Writes
    使用3D紋理和3D表面寫進行3D體積過濾
  17. volumeRender - Volume Rendering with 3D Textures
    使用3D紋理進行基礎的體積渲染

Imaging Reference

暫略

Finance Reference

暫略

Simulations Reference

  1. fluidsD3D9 - Fluids (Direct3D Version)
    利用CUDA和CUFFT進行流體模擬,利用Direct3D 9渲染。
  2. fluidsGL - Fluids (OpenGL Version)
    利用CUDA和CUFFT進行流體模擬,利用OpenGL渲染。
  3. fluidsGLES - Fluids (OpenGLES Version)
    利用CUDA和CUFFT進行流體模擬,利用OpenGL渲染。
  4. nbody - CUDA N-Body Simulation
    模擬了N體問題(對的,包括三體)。通過參數可以控制N的大小,並且能夠控制使用多少GPU設備。體的位置和速度使用零拷貝內存存儲,對於設備數量少於4和有大量體的情況,帶寬不再是運行瓶頸我們可以實現大規模的數據。
  5. nbody_opengles - CUDA N-Body Simulation with GLES
    這個模擬不提供用戶交互。
  6. nbody_screen - CUDA N-Body Simulation on Screen
    在屏幕上模擬?
  7. oceanFFT - CUDA FFT Ocean Simulation
    使用CUFFT庫模擬海洋高度場(Ocean height field),並用OpenGL渲染。
  8. particles - Particles
    模擬大量粒子的相互作用。可以控制參數粒子的個數。這個粒子實現了一種統一數據結構,利用原子操作或者Thrust庫的快速基數排序。
  9. smokeParticles - Smoke Particles
    煙霧的光影體積模擬,用CUDA實現的一些先進的算法,使用半張角切片(half-angle slicing)技術。使用CUDA模擬,Thrust庫排序,OpenGL渲染。
  10. VFlockingD3D10
    這個是模擬什麼大鳥的V型絨毛的(V-shaped flocks by big birds)。。。有GPU和CPU實現版本,使用g去開關這兩者。

Advanced Reference

  1. alignedTypes - Aligned Types
    展示對齊與非對齊結構體之間傳輸速度
  2. c++11_cuda - C++11 CUDA
    展示CUDA對C++11特性的支持。掃描了輸入文件,輸出x,y,z,w的。
  3. cdpAdvancedQuicksort - Advanced Quicksort (CUDA Dynamic Parallelism)
    實現了高級的快速排序,使用CUDA Dynamic Parallelism。
  4. cdpBezierTessellation - Bezier Line Tessellation (CUDA Dynamic Parallelism)
    嗯,就是,bezier tessellation of lines這個的實現。什麼貝啓爾曲線啥的,中文和英文一樣看不到 (= = )
  5. cdpLUDecomposition - LU Decomposition (CUDA Dynamic Parallelism)
    LU分解是一種將非奇異矩陣進行三角分解的方法,然後CUDA模擬一下。
  6. cdpQuadtree - Quad Tree (CUDA Dynamic Parallelism)
    象限四分樹(哇哦。。。)
  7. concurrentKernels - Concurrent Kernels
    stream中並行執行多個Kernel,並闡明如何處理CUDA stream之間的依賴。
  8. eigenvalues - Eigenvalues
    算特徵值對於線性代數來說十分重要。這個例子實現了一個並行的二分算法,計算一個隨機大小的三對角矩陣的特徵值。
  9. fastWalshTransform - Fast Walsh Transform
    實現快速沃爾什變換
  10. FDTD3d - CUDA C 3D FDTD
    該樣例在3D表面上應用有限差分時域進展模板。(是的你沒看錯)
  11. FunctionPointers - Function Pointers
    教你怎麼使用函數指針並且實現了索貝爾邊緣檢測。
  12. interval - Interval Computing
    實現區間計算。
  13. lineOfSight - Line of Sight
    視線算法的視線。給定一個高度圖和來自一些觀察點的射線,計算從觀察點沿着光線經過的所有的點。
  14. matrixMulDynlinkJIT - Matrix Multiplication (CUDA Driver API version with Dynamic Linking Version)
    使用CUDA驅動API再次實現矩陣乘法。展示瞭如何在運行時鏈接驅動並且即時編譯PTX代碼。主要也是爲了展示CUDA的程序規則而不是優化程序。CUBLAS被用於這個計算。
    15.mergeSort - Merge Sort
    實現了歸併排序。雖然這種排序在大序列的排序上通常效率較低,但是在中等大小的鍵值對排序上是個好的選擇。
  15. newdelete - NewDelete
    展示在設備上動態new 和 delete空間和聲明虛函數。
  16. ptxjit - PTX Just-in-Time compilation
    使用驅動API從PTX即時編譯Kernel。並展示了運行時和驅動API互操作性的無縫銜接。對於CUDA5.5,這個例子展示如何使用cuLink*這樣的函數鏈接PTX。
  17. radixSortThrust - CUDA Radix Sort (Thrust Library)
    使用Thrust庫進行超級快而且高效並行的基數排序。既可以進行鍵值對排序也可以只進行鍵的排序。這個代碼使用了線程束同步,依賴於GPU上的線程都屬於線程束這個規則,所有的線程都同步地執行。當線程束內的線程訪問共享內存時,代碼中不用__syncthreads()。對於這種沒有競爭條件的操作,想要正確執行必須將共享內存定義爲volatile。如果不定義,在缺少__syncthreads()時,編譯器會延遲將數據存到共享內存而是保存到寄存器中(編譯器的優化措施),這樣會導致錯誤。因此要主要這方面的應用。
  18. reduction - CUDA Parallel Reduction
    規約。這裏有一些優化方法。
  19. scalarProd - Scalar Product
    標量相乘。
  20. scan - CUDA Parallel Prefix Sum (Scan)
    並行前綴和(也稱掃描算法)。
  21. segmentationTreeThrust - CUDA Segmentation Tree Thrust Library
    構造圖像分割樹的方法。基於Boruvka的MST算法。
  22. shfl_scan - CUDA Parallel Prefix Sum with Shuffle Intrinsics (SHFL_Scan)
    如何使用shuffle(線程束混洗)來進行掃描。
  23. simpleHyperQ
    流中多個Kernel並行,並且使用了HyperQ技術(這裏竟然有教程)
  24. sortingNetworks - CUDA Sorting Networks
    雙調排序奇偶合並排序。雖然這種排序在大序列的排序上通常效率較低,但是在中等大小的鍵值對排序上是個好的選擇。
  25. StreamPriorities - Stream Priorities
    如何使用流。
  26. threadFenceReduction
    使用thread Fence來進行規約。單步規約需要原子操作和_threadfence()指令
  27. threadMigration - CUDA Context Thread Management
    適合使用CUDA上下文管理和使用新的CUDA4.0的參數傳遞以及CUDA啓動API。CUDA上下文可以被分別創建並且獨立地和不同的線程連接。
  28. transpose - Matrix Transpose
    矩陣轉置。有一些操作用來優化。

Cudalibraries Reference

  1. batchCUBLAS
    教你怎麼使用批量的CUBLAS的API提高程序性能。
  2. BiCGStab
    使用CUSPARSE和CUBLAS對有限的對稱和非對稱線性系統的穩定雙共軛梯度(Bi-Conjugate Gradient Stabilized)迭代方法。
  3. boxFilterNPP - Box Filter with NPP
    如何使用NPP盒式過濾器函數執行盒式過濾。
  4. cannyEdgeDetectorNPP - Canny Edge Detector NPP
    什麼邊緣檢測過濾器。用這個可以把輸入圖片搞成灰度圖片。
  5. conjugateGradient - ConjugateGradient
    使用CUBLAS and CUSPARSE庫實現共軛梯度計算
  6. conjugateGradientPrecond - Preconditioned Conjugate Gradient
    使用CUBLAS and CUSPARSE庫實現前承條件共軛梯度計算
  7. conjugateGradientUM - ConjugateGradientUM
    使用統一內存和CUBLAS and CUSPARSE庫實現共軛梯度計算
  8. cuHook - CUDA Interception Library
    展示如何編譯和使用一個截距庫。這個庫要通過LD_PRELOAD加載。
    libcuhook.so.1 ./cuHook
  9. cuSolverDn_LinearSolver - cuSolverDn Linear Solver
    實現cuSolverDN的LU, QR和Cholesky因式分解
  10. cuSolverRf - cuSolverRf Refactorization
    重新因子化。
  11. cuSolverSp_LinearSolver - cuSolverSp Linear Solver
    實現cuSolverSP的LU, QR和Cholesky因式分解
  12. cuSolverSp_LowlevelCholesky - cuSolverSp LowlevelCholesky Solver
    使用cuSolverSP底層API實現Cholesky因式分解
  13. cuSolverSp_LowlevelQR - cuSolverSp Lowlevel QR Solver
    使用cuSolverSP底層API實現QR因式分解
  14. FilterBorderControlNPP - Filter Border Control NPP
    如何在常見模式下使用NPP過濾器函數的邊緣版本,可以用來備份NPP的相同的無邊界版本函數的結果,也可以被用來開關不同原圖片邊緣的邊界控制,這些圖片邊緣依賴於被作爲輸入的原圖片的部分。(是是是,你說得都對)
  15. freeImageInteropNPP - FreeImage and NPP Interopability
    使用FreeImage庫
  16. histEqualizationNPP - Histogram Equalization with NPP
    如何使用NNP把圖片數據直方圖均值化
  17. jpegNPP - JPEG encode/decode and resize with NPP
    流水線處理圖片。首先一個JPEG圖片被哈弗曼編碼然後被離散餘弦轉換且去量子化。不同區域被重新調整大小。最後反過來,重新量子化,正向離散餘弦轉換再哈弗曼解碼。
  18. MC_EstimatePiInlineP - Monte Carlo Estimation of Pi(inline PRNG)
    使用蒙特卡羅方法模擬π(內聯PRNG),並使用NVIDIA CURAND庫。
  19. MC_EstimatePiInlineQ - Monte Carlo Estimation of Pi(inline QRNG)
    使用蒙特卡羅方法模擬π(內聯QRNG),並使用NVIDIA CURAND庫。
  20. MC_EstimatePiP - Monte Carlo Estimation of Pi (batch PRNG)
    使用蒙特卡羅方法模擬π(使用批量PRNG).),並使用NVIDIA CURAND庫。
  21. MC_EstimatePiQ - Monte Carlo Estimation of Pi (batch QRNG)
    使用蒙特卡羅方法模擬π(使用批量RRNG).),並使用NVIDIA CURAND庫。
  22. MC_SingleAsianOptionP - Monte Carlo Single Asian Option
    使用蒙特卡羅方法模擬簡單亞式期權,並使用NVIDIA CURAND庫。
  23. MersenneTwisterGP11213
    模擬梅森旋轉算法,使用cuRAND產生隨機數
  24. nvgraph_Pagerank - NVGRAPH Page Rank
    使用NVGRAPH庫進行Page Rank
  25. nvgraph_SemiRingSpmv - NVGRAPH Semi-Ring SpMV
    使用NVGRAPH庫進行半環向量乘法。
  26. nvgraph_SSSP - NVGRAPH Single Source Shortest Path
    使用NVGRAPH庫計算單源最短路徑
  27. randomFog - Random Fog
    演示使用CURAND產生僞隨機和準隨機算法
  28. simpleCUBLAS - Simple CUBLAS
    演示怎麼使用最新的CUBLAS庫
  29. simpleCUBLASXT - Simple CUBLAS XT
    CUBLAS-XT庫使用
  30. simpleCUFFT - Simple CUFFT
    使用CUFFT計算帶有過濾的信號的1維卷積,通過將其轉換入頻域(frequency domain),使其二者相乘,並重新傳回時域。CUFFT計劃是產生於簡單和高級API的需求的。
  31. simpleCUFFT_2d_MGPU - SimpleCUFFT_2d_MGPU
    這個是用CUFFT計算二維卷積。,並且是多個GPU。
  32. simpleCUFFT_callback - Simple CUFFT Callbacks
    這個也是 使用CUFFT計算帶有過濾的信號的1維卷積,通過將其轉換入頻域(frequency domain),使其二者相乘,並重新傳回時域。不同之處在於,多個步驟是由用戶提供的一個CUFFT回調函數實現而不是一個分離的Kernel調用。
  33. simpleCUFFT_MGPU - Simple CUFFT_MGPU
    多GPU的一維卷積。
  34. simpleDevLibCUBLAS - simpleDevLibCUBLAS GPU Device API Library Functions (CUDA Dynamic Parallelism)
    該示例實現了一個簡單的CUBLAS函數調用,調用運行CUBLAS函數的GPU設備API庫
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章