线程组织基本介绍
线程与进程
进程是程序的一次执行,线程是进程内的一个相对独立的可执行单元。CUDA的并行计算就是通过多线程并行执行实现的。
线程的层次结构
软硬件对应关系
执行流程
线程索引
计算线程索引
(1)多维网格大小、线程块大小定义:dim3 grid_size(gx,gy,gz), block_size(dx,dy,dz)
(2)x维度是最内层(变化最快),z维度是最外层(变化最慢)
(3)线程索引通用公式
线程限制
函数:_host_cudaError_t cudaGetDeviceProperties (cudaDeviceProp* prop, int device)
功能:返回计算机设备信息
device_prop.cu代码:
#include <cuda_runtime.h>
#include <stdio.h>
#include <stdlib.h>
int main (int argc, char *argv[]) {
int decive_id = 0;
if (argc > 1) {
decive_id = atoi(argv[1]);
}
// 设置主机当前所要用的设备
cudaSetDevice(decive_id);
cudaDeviceProp prop;
// 获取设备信息
cudaGetDeviceProperties(&prop, decive_id);
printf("Device id: %d\n", decive_id);
printf("设备名称: %s\n", prop.name);
printf("每个线程块的最大寄存器数: %d\n", prop.regsPerBlock);
printf("一个线程束中包含的最大线程数量: %d\n", prop.warpSize);
printf("一个线程快中可以包含的最大线程数量: %d\n", prop.maxThreadsPerBlock);
printf("在多维线程块数组中,每一维可以包含的最大线程数量: %d, %d, %d\n", prop.maxThreadsDim[0], prop.maxThreadsDim[1], prop.maxThreadsDim[2]);
printf("在一个线程格中,每一维可以包含的线程块数量: %d, %d, %d\n", prop.maxGridSize[0], prop.maxGridSize[1], prop.maxGridSize[2]);
printf("设备上流多处理器的数量(SM): %d\n", prop.multiProcessorCount);
printf("设备上全局内存总量: %g GB\n", prop.totalGlobalMem/(1024.0*1024*1024));
printf("在一个线程块中可使用的最大共享内存数量数量: %g KB\n", prop.sharedMemPerBlock/1024.0);
printf("每个SM的最大共享内存: %g KB\n", prop.sharedMemPerMultiprocessor/1024.);
printf("常量内存总量: %g KB\n", prop.totalConstMem/1024.0);
return 0;
}
nvcc -o device_prop device_prop.cu
./device_prop
运行结果:
Device id: 0
设备名称: NVIDIA GeForce RTX 3080
每个线程块的最大寄存器数: 65536
一个线程束中包含的最大线程数量: 32
一个线程快中可以包含的最大线程数量: 1024
在多维线程块数组中,每一维可以包含的最大线程数量: 1024, 1024, 64
在一个线程格中,每一维可以包含的线程块数量: 2147483647, 65535, 65535
设备上流多处理器的数量(SM): 70
设备上全局内存总量: 11.7631 GB
在一个线程块中可使用的最大共享内存数量数量: 48 KB
每个SM的最大共享内存: 100 KB
常量内存总量: 64 KB