CUDA学习笔记1——核函数与线程

CUDA安装并配置环境后,使用VS新建工程时会出现对应选项:
CUDA学习笔记1——核函数与线程_第1张图片

CUDA核函数调用

  1. CUDA核函数必须用限定词 global 修饰,返回类型必须为void,二者次序随意。
  2. 函数名与()之间用三括号<<<网格大小,线程块大小>>>指明核函数中线程数目与排列情况;
  3. cudaDeviceSynchronize()函数用于同步主机与设备;
#include 
#include "cuda_runtime.h"

//如何调用cuda核函数
__global__ void first_kernel()
{
	printf("Hellow World GPU...\n");
}

int main()
{
	printf("Hellow World CPU  \n");

	first_kernel<<<2, 3>>>();
	cudaDeviceSynchronize();
	return 0;
}

CUDA学习笔记1——核函数与线程_第2张图片

CUDA核函数线程索引

  1. 每个核函数允许指派多个线程,线程的组织结构为:<<>>,乘积为线程总数
一维网络

网格、线程块为一维

  • gridDim.x:数值为grid_size的数值
  • blockDim.x:数值为block_size的数值
  • blockIdx.x:线程在网格中的线程块ID,取值范围 0 ~ gridDim.x - 1;
  • threadIdx.x:线程在线程块中的线程ID,取值范围 0 ~ blockDim.x - 1;
多维网络

网格、线程块为多维
dim3 grid_size(Gx,Gy,Gz);
dim3 block_size(Bx,By,Bz);

  • blockIdx.x:取值范围 0 ~ gridDim.x - 1;
  • blockIdx.y:取值范围 0 ~ gridDim.y - 1;
  • blockIdx.z:取值范围 0 ~ gridDim.z - 1;
  • threadIdx.x:取值范围 0 ~ blockDim.x - 1;
  • threadIdx.y:取值范围 0 ~ blockDim.y - 1;
  • threadIdx.z:取值范围 0 ~ blockDim.z - 1;

网格大小限制:x、y、z方向最大值为2^31-1、65535、65535

线程块大小限制:x、y、z方向最大值为1024、1024、64

#include 
#include "cuda_runtime.h"

//cuda核函数线程索引
__global__ void first_kernel()
{
	int tidx = threadIdx.x;
	int tidy = threadIdx.y;
	int tidz = threadIdx.z;
	int bidx = blockIdx.x;
	int bidy = blockIdx.y;
	int bidz = blockIdx.z;
	printf("GPU Kernel...thread index: (%d,%d), block index: (%d,%d) \n",  tidy, tidx, bidy, bidx);
}


int main()
{

	first_kernel<<<2, 3>>>();
	cudaDeviceSynchronize();
	return 0;
}


CUDA学习笔记1——核函数与线程_第3张图片

CUDA核函数要求总结

  1. 核函数返回类型必须是void;
  2. 必须使用限定符 _global_ ;
  3. 核函数支持重载;
  4. 不支持可变数量参数列表;
  5. 可向核函数传递非指针变量;
  6. 核函数不能为类的成员;
  7. 无论主机调用还是设备调用,核函数都是在设备中执行,调用时需指定执行配置;
  8. 计算能力3.5之前核函数之间不能相互调用,3.5开始引入动态并行机制,核函数可以相互调用;

你可能感兴趣的:(CUDA,学习,CUDA)