CUDA学习笔记
网课:加速计算基础 —— CUDA C/C++笔记
基础内容:线程、内存管理和异步流
- 1-3 01-stream-init-solution.cu
|
|
进阶内容:2维和3维的网格和块
可以将网格和线程块定义为最多具有 3 个维度。使用多个维度定义网格和线程块绝不会对其性能造成任何影响,但这在处理具有多个维度的数据时可能非常有用,例如 2D 矩阵。如要定义二维或三维网格或线程块,可以使用 CUDA 的 dim3
类型,即如下所示:
|
|
鉴于以上示例,someKernel
内部的变量 gridDim.x
、gridDim.y
、blockDim.x
和 blockDim.y
均将等于 16
。
- 1-1 01-matrix-multiply-2d-solution.cu:2D矩阵乘法
|
|
- 1-1 01-heat-conduction-solution.cu:模拟金属银二维热传导的应用程序执行加速操作
|
|
- 1-3 01-stream-init-solution.cu
|
|
进阶内容:手动内存分配和复制
尽管 cudaMallocManaged
和 cudaMemPrefetchAsync
函数性能出众并能大幅简化内存迁移,但有时也有必要使用更多手动内存分配方法。这在已知只需在设备或主机上访问数据时尤其如此,并且因免于进行自动按需迁移而能够收回数据迁移成本。
此外,通过手动内存管理,您可以使用非默认流同时开展数据传输与计算工作。在本节中,您将学习一些基本的手动内存分配和拷贝技术,之后会延伸应用这些技术以同时开展数据拷贝与计算工作。
以下是一些用于手动内存管理的 CUDA 命令:
cudaMalloc
命令将直接为处于活动状态的 GPU 分配内存。这可防止出现所有 GPU 分页错误,而代价是主机代码将无法访问该命令返回的指针。cudaMallocHost
命令将直接为 CPU 分配内存。该命令可“固定”内存(pinned memory)或“页锁定”内存(page-locked memory),此举允许将内存异步拷贝至 GPU 或从 GPU 异步拷贝至内存。固定内存过多则会干扰 CPU 性能,因此请勿无端使用该命令。释放固定内存时应使用cudaFreeHost
命令。- 无论是从主机到设备还是从设备到主机,
cudaMemcpy
命令均可拷贝(而非传输)内存。
除了cudaMemcpy
之外,还有cudaMemcpyAsync
,只要固定了主机内存,它就可以从主机到设备或从设备到主机异步复制内存,这可以通过使用cudaMallocHost
分配它来完成。
与核函数的执行类似,cudaMemcpyAsync
在默认情况下仅相对于主机是异步的。默认情况下,它在默认流中执行,因此对于GPU上发生的其他CUDA操作而言,它是阻塞操作。但是,cudaMemcpyAsync
函数将非默认流作为可选的第5个参数。通过向其传递非默认流,可以将内存传输与其他非默认流中发生的其他CUDA操作并发。
一种常见且有用的模式是结合使用固定主机内存,非默认流中的异步内存副本和非默认流中的核函数执行,以使内存传输与核函数的执行重叠。
- 01-overlap-xfer-solution.cu
|
|
PPT笔记
编程模型
变量类型限定词:
变量声明 | 内存 | 域 | 生命周期 |
---|---|---|---|
__device__ __local__ int LocalVar; |
本地 | 线程 | 线程 |
__device__ __shared__ int SharedVar; |
共享 | 块 | 块 |
__device__ int GlobalVar; |
全局 | 网格 | 应用 |
__device__ __constant__ int ConstantVar; |
常量 | 网格 | 应用 |
__local__
,__shared__
,__constant__
的__device__
可省去。
函数声明:
执行位置 | 调用位置 | |
---|---|---|
__device__ |
设备 | 设备 |
__global__ |
设备 | 主机 |
__host__ |
主机 | 主机 |
-
__global__
defines a kernel function- Must return void
-
__device__
and__host__
can be used together
cudaMemcpyAsync()
:异步内存复制
void __syncthreads()
:线程同步
时间函数:
|
|
内存
CUDA编程——GPU架构,由sp,sm,thread,block,grid,warp说起
利用内存结构:数据切片
Typical Structure of a CUDA Program:
-
Global variables declaration
-
__host__
-
__device__
…__global__
,__constant__
,__texture__
-
-
Function prototypes
-
__global__ void kernelOne (…)
-
float handyFunction (…)
-
-
Main ()
-
allocate memory space on the device – cudaMalloc (&d_GlblVarPtr, bytes )
-
transfer data from host to device
- cudaMemCpy (d_GlblVarPtr, h_Gl…)
-
execution configuration setup
-
kernel call – kernelOne«»( args… );
-
transfer results from device to host
- cudaMemCpy (h_GlblVarPtr,…)
-
optional: compare against golden (host computed) solution
-
-
Kernel – void kernelOne (type args,…)
-
variables declaration -
__local__
,__shared__
-
automatic variables transparently assigned to registers or local memory
-
Syncthreads ()…
-
-
Other functions
- float handyFunction (int inVar…);
线程
warp:调度线程束的基本单位,一束线程执行相同操作。
CUDA —- Branch Divergence and Unrolling Loop
调优
-
通用优化策略
-
内存优化策略:CUDA bank 及bank conflict
-
指令优化策略
-
其他策略