最近准备再挖个坑,翻译下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以上。依赖于CDPcdpSimpleQuicksort - 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 TexturessimpleIPC 展示进程间通讯(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) 见条目4simpleD3D9Texture - Simple D3D9 Texture 见条目6simpleGL - 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 ./cuHookcuSolverDn_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 Ranknvgraph_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库