最近准备再挖个坑,翻译下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库