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是将矩阵坐标转化为数组坐标。
cuda笔记-初始化矩阵及thread,block,grid概念相关推荐
- CUDA学习----sp, sm, thread, block, grid, warp概念
CUDA学习----sp, sm, thread, block, grid, warp概念 2017-01-11 17:14:28| 分类: HPC&CUDA优化 | 标签:cuda g ...
- GPU的硬件结构中与CUDA相关的几个概念:thread block grid warp sp sm
streaming processor(sp): 最基本的处理单元,streaming processor 最后具体的指令和任务都是在sp上处理的.GPU进行并行计算,也就是很多个sp同时做处理.现在 ...
- cuda笔记-一个Block多线程求卷积
最近在学cuda,发现自己数学方面的知识不太够,C语言的知识也有待加强. 这里记录个笔记对矩阵求卷积. 逻辑是这样的: 1. 先CUDA生成一个16*16的矩阵: 2. 将这16*16的矩阵,外面包一 ...
- [转]Cuda笔记【1】GPU计算DEMO
声明 本文是看小破站某cuda入门教程留下来的笔记,多上PPT上内容,夹杂一点自己的理解,和代码注释 教程地址:https://www.bilibili.com/video/av74148375 gi ...
- CUDA编程:矩阵乘运算从CPU到GPU
作者丨kaiyuan@知乎 来源丨https://zhuanlan.zhihu.com/p/573271688 本文主要介绍用CUDA实现矩阵乘法运算(C = A x B)的几个基本方法,帮助大家理解 ...
- CUDA加速计算矩阵乘法进阶玩法(共享内存)
CUDA加速计算矩阵乘法&进阶玩法~共享内存 一.基础版矩阵乘法 二.为什么可以利用共享内存加速矩阵乘法 1.CUDA内存读写速度比较 2.申请共享内存 三.改进版矩阵乘法(利用共享内存) 一 ...
- Cuda 学习教程:Cuda 程序初始化
Cuda程序初始化 目前,cuda里面没有对设备的初始化函数InitDevice(),只能每次调用的api函数的时候,加载设备的上下文,自动进行初始化,这将带来问题: First函数调用的时候,需要自 ...
- cuda笔记-GPU多线程的奇偶排序
首先说明奇偶排序: 算法的思路是先排奇数序号的相邻2个,或者偶数序号的相邻两个,然后一直到序列有序为止,如下代码: #include<stdio.h> #include<stdlib ...
- CV_MAT_ELEM——获取矩阵元素和初始化矩阵
CV_MAT_ELEM是OpenCV中用来访问矩阵每个元素的宏,这个宏只对单通道矩阵有效,多通道会报错. 宏原型: CV_MAT_ELEM( matrix, elemtype, row, col ) ...
最新文章
- 支付宝接口使用文档说明 支付宝异步通知
- php带帽接口_利用php自包含特性上传webshell
- reentrantLock 和 synchronized 哪个性能高?
- Log4j.properties 配置详解
- 队列的定义与操作-顺序存储,链式存储(C语言)
- Java,C++四舍五入
- 安卓APP测试知识大全【面试储备】
- FD.io的使用场景(VPP)
- C# 列表中查找大小比较
- 【codevs1282】约瑟夫问题
- 【离散数学】集合论 第四章 函数与集合(2) 特殊函数类(单射、满射、双射及其性质、常/恒等函数、置换/排列)
- VFB直接使用TCP发送电子邮件源码
- arduino-esp32-点亮板载LED,闪烁LED。02
- 重学JavaWeb —— JSP,简单全面一发入魂
- 回溯法解决部落冲突问题
- 基于Lumerical FDTD的等离子体光子晶体分析
- 如何解决笔记本键盘某一个键一直在自动按下
- 怎么一次性给多段视频制作画中画,并进行智能合并
- linux(linux常用命令,软件安装,vim编辑器)
- (ARM)移动处理器与移动互联网终端发展
热门文章
- Android蓝牙设备名显示修改
- C/C++基础语法复习(二):C++ 面向对象编程,你需要知道的点
- java压缩文件,中文问题
- 7种有害的IT团队行为,不根除就坏大事了
- 脱离业务的技术架构,都只是一团废纸,教你从0-1建设业务架构
- 7个理由,给你推荐这款“秒杀Excel”的分析神器!
- 即时通讯软件 的无锁数组操作
- 今天一看,自己发的文章原来这么多了。openeim
- 程序员们记得还是八五年PC登陆我国时候的事?
- 字节跳动28岁程序员退休:我只想做一个自由的“废物”