CUDA线程模型包括三个层次:线程块(Block)、线程网格(Grid)和线程(Thread)。
线程块(Block):线程块是并行执行的线程集合,线程块内的线程共享一些资源,比如共享内存。线程块的大小可以在编译时确定,也可以在运行时动态设定。每个线程块都有一个唯一的块ID,通过这个ID,线程可以定位到自己在块中的位置。
线程网格(Grid):线程网格是一组线程块的集合。同一个线程网格中的线程块共享一些资源,比如全局内存。线程网格的大小可以在编译时确定,也可以在运行时动态设定。每个线程网格都有一个唯一的网格ID,通过这个ID,线程可以定位到自己在网格中的位置。
线程(Thread):线程是执行的基本单位,是实际执行计算的操作对象。每个线程有一个唯一的线程ID,通过这个ID,线程可以定位到自己在块中的位置。CUDA的线程模型基于二维的线程块和三维的线程网格,通过这两个层次的组织,可以实现大规模的并行计算。
总的来说,CUDA的线程模型通过层次化的组织结构,使得大规模的并行计算成为可能。
不同组合形式
二维Grid一维Block:
int blockld blockldx.y gridDim.x blockldx.x;
int id blockld blockDim.x threadldx.x;
二维Grid二维Block:
int blockld blockldx.x blockldx.y gridDim.x;
int id blockld (blockDim.x blockDim.y)+(threadldx.y blockDim.x)+threadldx.x;
二维Grid三维Block
int blockld blockldx.x blockldx.y gridDim.x;
int id blockld *(blockDim.x blockDim.y blockDim.z)
+(threadldx.z *(blockDim.x blockDim.y))
+(threadldx.y blockDim.x)+threadldx.x;
例子:
#include <stdio.h>
__global__ void hello_from_gpu()
{
const int bid = blockIdx.x;
const int tid = threadIdx.x;
const int id = threadIdx.x + blockIdx.x * blockDim.x;
printf("block %d and thread %d, global id %d\n", bid, tid, id);
}
int main(void)
{
hello_from_gpu<<<3, 4>>>();
cudaDeviceSynchronize();
return 0;
}
wcx@wcx:~/Desktop/CUDATest$ nvcc hello.cu -o hello
wcx@wcx:~/Desktop/CUDATest$ ./hello
block 1 and thread 0, global id 4
block 1 and thread 1, global id 5
block 1 and thread 2, global id 6
block 1 and thread 3, global id 7
block 2 and thread 0, global id 8
block 2 and thread 1, global id 9
block 2 and thread 2, global id 10
block 2 and thread 3, global id 11
block 0 and thread 0, global id 0
block 0 and thread 1, global id 1
block 0 and thread 2, global id 2
block 0 and thread 3, global id 3