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