cuda笔记-初始化矩阵及thread,block,grid概念

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是将矩阵坐标转化为数组坐标。

 

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页