⌚️: 2020年10月23日
📚参考
- 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).
- 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 同上
- 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下请求的拓补结构。
- 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纹理进行基础的体积渲染
暂略
暂略
- 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去开关这两者。
- 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 矩阵转置。有一些操作用来优化。
- 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库