thread:一个CUDA的并行程序会被许多threads来执行;
block:多个threads组成一个block,同一个block中threads可以使用_syncthreads()同步,也可以通过shared memory通信。
gird:多个blocks会构成grid。
如下代码:
dim3 blocksize(2, 3);
dim3 gridsize(3, 3);
上面的意思是,有2行 * 3列的thread组成一个块,有3行 * 3列的块组成了个网。
下面是在网中如何获得线程ID:
grid为1,block为1
int threadId = blockId.x * blockDim.x + threadIdx.x;
grid为1,block为2
int threadId = block.x * blockDim.x * blockDim.y + threadIdx.y * blockDim.x + threadIdx.x
grid为1,block为3
int threadId = blockId.x * blockDim.x * blockDim.y *blockDim.z
+ threadIdx.z * blockDim.y * blockDim.x
+ threadIdx.y * blockDim.x + threadIdx.x;
下面举个例子,是矩阵的初始化。
程序运行截图如下:
功能也就是将20 * 20全为0的矩阵,变成,矩阵中某个值为x + y的形式。
源码如下:
#include "cuda_runtime.h"
#include "device_launch_parameters.h"
#include <iostream>
#include <stdio.h>
using namespace std;
__device__ int coord_int(int x, int y) {
return x + y;
}
__global__ void Matrix_init(int *a, int m, int n) {
int x = blockIdx.x * blockDim.x + threadIdx.x;
int y = blockIdx.y * blockDim.y + threadIdx.y;
if (x < m && y < n) {
a[y * n + x] = coord_int(x, y);
}
}
void show_Matrix(int *a, int m, int n) {
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
cout << a[i * m + j] << " ";
}
cout << endl;
}
cout << endl;
}
int main() {
int *gpu_int;
int cpu_init[400] = {0};
show_Matrix(cpu_init, 20, 20);
cudaMalloc((void**)&gpu_int, 400 * sizeof(int));
dim3 blockdim(8, 8);
dim3 gridim(3, 3);
Matrix_init << <gridim, blockdim >> > (gpu_int, 20, 20);
cudaMemcpy(cpu_init, gpu_int, 400 * sizeof(int), cudaMemcpyDeviceToHost);
show_Matrix(cpu_init, 20, 20);
cudaFree(gpu_int);
getchar();
return 0;
}
其中这一段的意思是:
x的是获取当前矩阵里面,x的坐标,y为在矩阵中y的坐标(当前块的ID号乘以当前块的维度加上这个块中x的偏移,姑且叫偏移吧),这个y*n + x是将矩阵坐标转化为数组坐标。