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概念相关推荐

  1. CUDA学习----sp, sm, thread, block, grid, warp概念

    CUDA学习----sp, sm, thread, block, grid, warp概念 2017-01-11 17:14:28|  分类: HPC&CUDA优化 |  标签:cuda  g ...

  2. GPU的硬件结构中与CUDA相关的几个概念:thread block grid warp sp sm

    streaming processor(sp): 最基本的处理单元,streaming processor 最后具体的指令和任务都是在sp上处理的.GPU进行并行计算,也就是很多个sp同时做处理.现在 ...

  3. cuda笔记-一个Block多线程求卷积

    最近在学cuda,发现自己数学方面的知识不太够,C语言的知识也有待加强. 这里记录个笔记对矩阵求卷积. 逻辑是这样的: 1. 先CUDA生成一个16*16的矩阵: 2. 将这16*16的矩阵,外面包一 ...

  4. [转]Cuda笔记【1】GPU计算DEMO

    声明 本文是看小破站某cuda入门教程留下来的笔记,多上PPT上内容,夹杂一点自己的理解,和代码注释 教程地址:https://www.bilibili.com/video/av74148375 gi ...

  5. CUDA编程:矩阵乘运算从CPU到GPU

    作者丨kaiyuan@知乎 来源丨https://zhuanlan.zhihu.com/p/573271688 本文主要介绍用CUDA实现矩阵乘法运算(C = A x B)的几个基本方法,帮助大家理解 ...

  6. CUDA加速计算矩阵乘法进阶玩法(共享内存)

    CUDA加速计算矩阵乘法&进阶玩法~共享内存 一.基础版矩阵乘法 二.为什么可以利用共享内存加速矩阵乘法 1.CUDA内存读写速度比较 2.申请共享内存 三.改进版矩阵乘法(利用共享内存) 一 ...

  7. Cuda 学习教程:Cuda 程序初始化

    Cuda程序初始化 目前,cuda里面没有对设备的初始化函数InitDevice(),只能每次调用的api函数的时候,加载设备的上下文,自动进行初始化,这将带来问题: First函数调用的时候,需要自 ...

  8. cuda笔记-GPU多线程的奇偶排序

    首先说明奇偶排序: 算法的思路是先排奇数序号的相邻2个,或者偶数序号的相邻两个,然后一直到序列有序为止,如下代码: #include<stdio.h> #include<stdlib ...

  9. CV_MAT_ELEM——获取矩阵元素和初始化矩阵

    CV_MAT_ELEM是OpenCV中用来访问矩阵每个元素的宏,这个宏只对单通道矩阵有效,多通道会报错. 宏原型: CV_MAT_ELEM( matrix, elemtype, row, col ) ...

最新文章

  1. 支付宝接口使用文档说明 支付宝异步通知
  2. php带帽接口_利用php自包含特性上传webshell
  3. reentrantLock 和 synchronized 哪个性能高?
  4. Log4j.properties 配置详解
  5. 队列的定义与操作-顺序存储,链式存储(C语言)
  6. Java,C++四舍五入
  7. 安卓APP测试知识大全【面试储备】
  8. FD.io的使用场景(VPP)
  9. C# 列表中查找大小比较
  10. 【codevs1282】约瑟夫问题
  11. 【离散数学】集合论 第四章 函数与集合(2) 特殊函数类(单射、满射、双射及其性质、常/恒等函数、置换/排列)
  12. VFB直接使用TCP发送电子邮件源码
  13. arduino-esp32-点亮板载LED,闪烁LED。02
  14. 重学JavaWeb —— JSP,简单全面一发入魂
  15. 回溯法解决部落冲突问题
  16. 基于Lumerical FDTD的等离子体光子晶体分析
  17. 如何解决笔记本键盘某一个键一直在自动按下
  18. 怎么一次性给多段视频制作画中画,并进行智能合并
  19. linux(linux常用命令,软件安装,vim编辑器)
  20. (ARM)移动处理器与移动互联网终端发展

热门文章

  1. Android蓝牙设备名显示修改
  2. C/C++基础语法复习(二):C++ 面向对象编程,你需要知道的点
  3. java压缩文件,中文问题
  4. 7种有害的IT团队行为,不根除就坏大事了
  5. 脱离业务的技术架构,都只是一团废纸,教你从0-1建设业务架构
  6. 7个理由,给你推荐这款“秒杀Excel”的分析神器!
  7. 即时通讯软件 的无锁数组操作
  8. 今天一看,自己发的文章原来这么多了。openeim
  9. 程序员们记得还是八五年PC登陆我国时候的事?
  10. 字节跳动28岁程序员退休:我只想做一个自由的“废物”