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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IT1995

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值