CUDA安装并配置环境后,使用VS新建工程时会出现对应选项:
CUDA核函数调用
- CUDA核函数必须用限定词 global 修饰,返回类型必须为void,二者次序随意。
- 函数名与()之间用三括号<<<网格大小,线程块大小>>>指明核函数中线程数目与排列情况;
- cudaDeviceSynchronize()函数用于同步主机与设备;
#include <stdio.h>
#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核函数线程索引
- 每个核函数允许指派多个线程,线程的组织结构为:<<<grid_size, block_size>>>,乘积为线程总数
一维网络
网格、线程块为一维
- 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 <stdio.h>
#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;
}