GPU编程之GUDA(四)——基础知识补充
主机函数:在CPU上调用,CPU上执行的函数
全局函数:在CPU上调用,GPU上执行的函数
设备函数:在GPU上调用,GPU上执行的函数——它的线程配置由调用关系中最近的全局函数决定
主机函数在声明时可以带有限定符 _host_
全局函数在声明时必须带有限定符 _global_
设备函数在声明时必须带有限定符 _device_
在调用全局函数时,除了函数名和形参表外,还有一个用三个小于号“<”和三个大于号“>”包含的部分,这一部分用来指定在并行计算式使用的线程组数和每个线程组白虎呢的线程数。
my_first_kernel<<<nBlocks,nThreads>>>(/*全局函数参数表*/)
一个grid包含完成一次函数调用的所有block,一个block由若干个线程组成
block和grid的尺寸都可以用三元向量来表示,这表明block和grid都是三位数组
grid的数组元素由block组成,block的数组元素由线程组成
表示线程数量时,可以用CUDA自带的dim3变量来声明三元向量,如果是二元向量,即和第三元置为一是等效的——可缺省,如果只是一维的,可以用int代替
dim3 gridsize(3,2,1);
dim3 blocksize(2,2,2);
my_first_kernel<<<gridsize,blocksize>>>();dim3 gridsize(3,2);
内建向量是从基本体数据类型扩展而成的结构体,访问内建向量的元素可以用索引x,y.z.w
=======================================================================================================
运用GUDA运算时,与经典GPGPU方法一样,需要一个输入缓存来准备原始数据和一个输出缓存来接收GPU计算的结果
因此,需要为程序分配两个数组:一个设备上的数组pfDevice用来存放GPU生成的数据,一个在主机上的数组pfHost,用来接收从GU取回的数据
这两个数组应该拥有相同的大小和类型
=======================================================================================================
线程索引,是线程在每个block里的索引,由于block的尺寸是三维的,因此线程索引也是一个三元向量:threadIdx
一个grid中的block索引:block.x block.y block.z
一个block中的thread索引:thread.x thread.y thread.z
一次函数调用只有一个grid,因此不存在grid索引
block尺寸保存在向量blockDim中,grid尺寸保存在gridDim中
线程号:每个线程唯一的标识符
当grid和block是一维的时候,线程号是这样直观定义的
int tid=threadIdx.x+blockDim.x*blockIdx.x;
在实际运用中,如果没有某些需要,一般都没有必要使用都为的block,因为一维的block下线程比较容易管理
什么是某些需要?
这样的“某些需要”可以和硬件有关(1、某些存储器为了二维元素而特别优化,2、纹理存储器),也可以是算法的需要,有些算法在使用二维block时较为直观,有助于用户实现算法
=======================================================================================================
内核:人们习惯将全局函数这样在GPU上执行的函数称为内核,简称核。它是函数执行时的基本单位
一个grid对应一个GPU或者多个多处理器
一个block中的所有线程在一个多处理器上并发执行
对于同一个block中的线程来说:一、同一个block中的线程可以同步
二、他们可以共同访问多处理器里的共享存储器
三:他们不能被拆分到多个多处理器上执行
对处理器将每个县城与一个标量处理器核心对应起来
warp:32个线程
如果block中的线程数为32的整数倍,会给调度带来方便。
CUDA存储器分为三层:1、私有本地存储器:可被单个线程访问
2、共享存储器:可被block中所有线程访问
3、全局存储器、本地存储器:可被一个应用程序中所有线程访问
除此之外还有程序中所有线程都可以访问的只读存储器:常量存储器和纹理存储器
自动变量:在全局函数和设备函数中不是用限定符说明的变量——系统决定他们存放在哪里——————一般放在寄存器中
寄存器:独立分布于贝格标量处理器上,为每个线程提供私有的存储空间
特点:容量小,访问速度快。
共享存储器:位于么一个多处理器内——两种方式:静态分配方式,动态分配方式(动态分配时,存储器尺寸可以是变量)
在调用全局函数时不需要在执行配置表中给出共享存储器的尺寸,直接在内核中用限定符_shared_即可
对共享存储器访问是以半个warp为单位的
bank冲突:当半warp中的多个线程方位的数组元素位于同一个bank时,他们的读写操作就不能同时进行,也就是说,这几个对同一bank的访问会被串行化
无冲突访问模式:1、分在不同的bank中,2、广播
设备存储器分为:全局存储器、纹理存储器、常量存储器
设备存储器有两种分配方式:分配为线性存储器、也可以被分配为CUDA数组
CUDA数组是为读取纹理而特别优化的,因此一般将纹理存储器分配为CUDA数组
全局存储器最便捷的使用方式是线性存储的方式
常量存储器:容量小,只读
设备存储器不是安装在多处理器内的存储器,即片外存储器,因此对设备存储器的直接访问需要耗费大量的时间
缓存、寄存器、共享存储器访问速度快
使用全局存储器需要满足接合的要求:不仅要求访问连续的存储单元,还对访问的起始地址有一定的要求——数据的起始地址应为每个线程访问数据大小的16倍的整数倍
一维、二维、四维向量可以结合成较大的数据传输单元,二三维向量的结核性能稍逊,只能作为三个一维标量来处理
并发:
数据传输与内核的并发
内核的并发
数据传输的并发
流:不同的流在执行时是相互独立的,因此他们可能在时间轴上出现乱序的情况,即不是按照定义的顺序执行,故用户需要再设计时考虑到这一点可能带来的隐患
参考文献:
仇德元.《GPGPU编程技术——从GLSL、CDPU到OpenGL》[M].河北省三河市:机械工业出版社,2012年:323.
GPU编程之GUDA(四)——基础知识补充相关推荐
- 基于STM32MP157的GPU编程之DRM驱动调试
linux系统GPU编程之DRM编程 背景: framebuffer大家都知道哈,打开/dev/fb0设备节点,然后开辟一段内存(即显存),再mmap,在吧图形数据填充到这段显存里面.怎么填,比如QT ...
- Wireshark数据抓包教程之Wireshark的基础知识
Wireshark数据抓包教程之Wireshark的基础知识 Wireshark的基础知识 在这个网络信息时代里,计算机安全始终是一个让人揪心的问题,网络安全则有过之而无不及.Wireshark作为国 ...
- 疯狂的大柚柚带你玩转MSP-ESP430G2(基础篇) -----(六)基础知识补充
疯狂的大柚柚带你玩转MSP-ESP430G2(基础篇) (六)基础知识补充 常用数据类型 数据类型 字节 数值范围 Char 1 -128~127 Unsigned char 1 0`255 shor ...
- 【文件上传漏洞-01】文件上传漏洞概述、防御以及WebShell基础知识补充
目录 1 文件上传漏洞概述 2 文件上传漏洞防御.绕过.利用 2.1 黑白名单策略 3 WebShell基础知识补充 3.1 WebShell概述 3.2 大马与小马 1 文件上传漏洞概述 概述:文件 ...
- 【西川善司的3D图形技术连载】GPU和Shader技术的基础知识(1~8回)
本连载的主要目的,是介绍最新的PC和GAME所使用的最新3D图形技术的发展趋势. 暂时的方针是,首先是考虑介绍比较新的PC Game和PS3,XBOX360等新时代游戏机的游戏所采用的技术. 那么首先 ...
- 【西川善司】GPU和Shader技术的基础知识(全8回)
本文取自西川善司的3D图形技术连载,全99回 本贴为1~8回,争取每1~2天更新一回吧.半年更新完. 也希望大家能支持. 翻译 Trace 校对&注解 千里马肝 http://www.open ...
- 桌面端编程之C++语言的知识架构
桌面端编程使用最多的编程语言之一就是C++,本部分将以C++作为代表来介绍桌面端编程.C++是常年稳居TIOBE编程语言排行榜前五的主流编程语言,在IT界被广泛使用,特别是在需要与底层硬件打交道的场合 ...
- 数据连接linux网络编程之TCP/IP基础(四):TCP连接的建立和断开、滑动窗口
在写这篇文章之前,xxx已经写过了几篇关于改数据连接主题的文章,想要了解的朋友可以去翻一下之前的文章 一.TCP段格式: TCP的段格式如下图所示 源端口号与目标端口号 源端口号和目标端口号,加上IP ...
- 万恶之源 - Python基础知识补充
编码转换 编码回顾: 1. ASCII : 最早的编码. ⾥⾯有英⽂⼤写字⺟, ⼩写字⺟, 数字, ⼀些特殊字符. 没有中⽂, 8个01代码, 8个bit, 1个byte 2. GBK: 中⽂国标码, ...
最新文章
- Iaas-Paas-Saas
- python 之 Pandas (五)导入导出
- jdbc 日期时间相关的类型
- 【Linux】一步一步学Linux——umask命令(111)
- Socket 客户端的断开重连
- Storm精华问答 | storm与Hadoop有什么区别?
- 2019年度最受欢迎中国开源软件评选, 请给JeecgBoot 投票,谢谢支持
- C语言 结构体练习之投票
- LCD1602(以51单片机为例)
- mybatis一次可以执行多个sql语句
- python的网络应用_python 网络编程的应用模块
- VS Code Python 将支持 Jupyter Notebook
- 《转》15种CSS混合模式让图片产生令人惊艳的效果
- 软件测试自学指南---从入门到精通V1.0
- [深度学习入门]两阶段目标检测算法到Faster RCNN
- 关于win11 碍眼的主文件夹的有效删除办法
- 英语计算机单词mp3,[听单词] 计算机专业英语词汇音频51,计算机英语单词MP3
- python新建文件夹代码_Python文件夹与文件的操作实现代码
- npm 废弃/删除(五)
- 微信报名怎么做_分享微信公众号搭建报名系统步骤