调用定义的和函数时采用类似于下面的形式:
kernel<<<1,1>>>(param1,param2,...)
“<<< >>>”中参数的作用是告诉我们该如何启动核函数(比如如何设置线程)。 下面我们先直接介绍参数概念,然后详细说明其意义。
当我们使用 gloabl 声明核函数后:
__global__ void kernel(param list){ }
在主机端(Host)调用时采用如下的形式:
kernel<<>>(param list);
参数解释:
关于CUDA的线程结构,有着三个重要的概念: Grid, Block, Thread
下图是一个结构关系图:
此外,Block, Thread的组织结构可以是可以是一维,二维或者三维。以上图为例,Block, Thread的结构分别为二维和三维。
CUDA中每一个线程都有一个唯一标识ThreadIdx,这个ID随着组织结构形式的变化而变化。 (注意:ID的计算,同计算行优先排列的矩阵元素ID思路一样。)
回顾之前我们的矢量加法:
Block是一维的,Tread是一维的:
// Block是一维的,Thread也是一维的
__global__ void addKernel(int *c, const int *a, const int *b)
{
int i = blockIdx.x *blockDim.x + threadIdx.x;
c[i] = a[i] + b[i];
}
Block是一维的,Tread是二维的:
// Block是一维的,Thread是二维的
__global__ void addKernel(int *c, int *a, int *b)
{
int i = blockIdx.x * blockDim.x * blockDim.y + threadIdx.y * blockDim.x + threadIdx.x;
c[i] = a[i] + b[i];
}
Block是二维的,Tread是三维的:
// Block是二维的,Thread是三维的
__global__ void addKernel(int *c, int *a, int *b)
{
int blockId = blockIdx.x + blockIdx.y * gridDim.x;
int i = blockId * (blockDim.x * blockDim.y * blockDim.z)
+ (threadIdx.z * (blockDim.x * blockDim.y))
+ (threadIdx.y * blockDim.x) + threadIdx.x;
c[i] = a[i] + b[i];
}
下表是不同计算能力的GPU的技术指标(更多可参见 CUDA Toolkit Documentation)
也可以通过下面的代码来直接查询自己GPU的具体指标:
#include "cuda_runtime.h"
#include
int main()
{
cudaError_t cudaStatus;
// 初获取设备数量
int num = 0;
cudaStatus = cudaGetDeviceCount(&num);
std::cout << "Number of GPU: " << num << std::endl;
// 获取GPU设备属性
cudaDeviceProp prop;
if (num > 0)
{
cudaGetDeviceProperties(&prop, 0);
// 打印设备名称
std::cout << "Device: " <
其中 cudaDeviceProp是一个定义在driver_types.h中的结构体。
如下图所示,每个 thread 都有自己的一份 register 和 local memory 的空间。同一个 block 中的每个 thread 则有共享的一份 share memory。此外,所有的 thread(包括不同 block 的 thread)都共享一份 global memory、constant memory、和 texture memory。不同的 grid 则有各自的 global memory、constant memory 和 texture memory。
这种特殊的内存结构直接影响着我们的线程分配策略,因为需要通盘考虑资源限制及利用率。 这些后续再进行讨论。
如下图所示,是常见的GPU程序的处理流程,其实是一种异构程序,即CPU和GPU的协同。
主机上执行串行代码,设备上则执行并行代码。
参考资料:
https://blog.csdn.net/shuzfan/article/details/76679378
https://blog.csdn.net/canhui_wang/article/details/51730264