CUDA[1] Introductory
Section 0 :Induction of CUDA
CUDA是啥?CUDA®: A General-Purpose Parallel Computing Platform and Programming Model
为什么用显卡就可以实现比CPU高得多的运算性能呢?这要从GPU的结构讲起:
GPU天生是为了图像处理而设计的,讲道理的话它能处理一些简单的运算工作(比如单独的顶点和线段)。但是在一个GPU中包含了许多个流处理器(Stream Processor),这些流处理器都可以并行工作。In this sense, GPUs are stream processors – processors that can operate in parallel by running one kernel on many records in a stream at once. [Reference]
对于CPU来说,12核已经是上天了的配置。然而今天,随意一个亮机卡GPU都有96个CUDA计算单元(每个相当于一个计算核心)。其并行计算能力不可同日而语。
Section 1 :Thread Hierarchy
在CUDA的计算模型中,有如下几个concept:
1.thread
这里的线程和CPU中其实是一个意思。是执行运算的最小单位。
在执行时,每个线程都有一个自己独特的标识符 threadIdx。threadIdx可以是一维/二维/三维的。(threadIdx.x,threadIdx.y,threadIdx.z)
2.block (thread block)
一个线程块包含了多个线程
3.Streaming Multiprocessor
每个SM相当于一个计算单元,里面又包含很多个Streaming Processor。每个SM可并行运行一个block里的线程。
4.Kernel
kernel可以理解成一个函数。同一个kernel函数可以在多个线程中被执行。
比如下面的向量加法的程序:
// Kernel definition
__global__ void VecAdd(float* A, float* B, float* C)
{
int i = threadIdx.x;
C[i] = A[i] + B[i];
}
int main()
{
...
// Kernel invocation with N threads
VecAdd<<<, N>>>(A, B, C);
...
}
line 2:用__global__关键字定义了一个kernel函数
line 4:threadIdx表示当前执行该kernel函数的这个thread的一个标号(可以理解为this指针的用途)
line 11:在调用kernel函数时,需要分配<<number_of_blocks , threads_per_block>> 。上述程序中分配了一个block,每个block中N个thread
虽然多个线程调用的都是同一个kernel function,但是它们分别在不同的数据空间进行加法运算(注意A、B、C的数组下标)。因此将一个大向量的加法运算给分解开了。
5.Grid
不同种类的kernel,每种kernel可以调度若干个block。这些block逻辑上被判为一个Grid。
thread、block和Streaming Multiprocessors的关系如下:
[Source: CUDA C Programming Guide.pdf]
如图,每个SM可以处理一个block,从而实现了并行计算。
两个层次的并行: • grid内多个block的并行 • block内多个thread的并行
注意:block和thread都是逻辑上的概念,物理上只存在SM。并不是一个SM一定严格对应一个block
比如对于我的亮机卡
每个SM可以跑1536个线程,而每个block最多1024个
但是实际上因为寄存器大小不一定够,并不一定能全部跑满这些线程。如果强行跑,就可能会爆掉
Section 2:Memory Hierarchy
[注意这里说的Memory都是指显存。CPU无法直接访问显存中的数据。][Reference]
因此,一个CUDA程序必然少不了以下三步:
☻cudaMalloc:创建新的动态显存堆
☻cudaMemcpy:将主机(Host)内存复制到设备(Device)显存
☻显存处理完之后,cudaMemcpy:设备(Device)显存复制回主机(Host)内存,释放显存cudaFree
CPU/RAM与GPU/VRAM的关系如图:[Reference]
Gird、block、thread的内存访问/共享机制如下图:
这里有几个概念:
Local Memory:单个线程内使用的内存空间
Shared Memory:一个block内所有线程共享的内存空间,常用于线程之间的通信。
每个SM(StreamingMultiprocessor)大约有16KB的shared memory
Global Memory:所有的block共享的内存空间。比shared速度慢,但是大许多
Constant Memory:存储常量。一块显卡大约有64KB的constant memory
从硬件的角度来看结构是这样的:[Reference] [Reference]
CUDA[1] Introductory的更多相关文章
- CUDA[2] Hello,World
Section 0:Hello,World 这次我们亲自尝试一下如何用粗(CU)大(DA)写程序 CUDA最新版本是7.5,然而即使是最新版本也不兼容VS2015 ...推荐使用VS2012 进入VS ...
- Couldn't open CUDA library cublas64_80.dll etc. tensorflow-gpu on windows
I c:\tf_jenkins\home\workspace\release-win\device\gpu\os\windows\tensorflow\stream_executor\dso_load ...
- ubuntu 16.04 + N驱动安装 +CUDA+Qt5 + opencv
Nvidia driver installation(after download XX.run installation file) 1. ctrl+Alt+F1 //go to virtual ...
- 手把手教你搭建深度学习平台——避坑安装theano+CUDA
python有多混乱我就不多说了.这个混论不仅是指整个python市场混乱,更混乱的还有python的各种附加依赖包.为了一劳永逸解决python的各种依赖包对深度学习造成的影响,本文中采用pytho ...
- [CUDA] CUDA to DL
又是一枚祖国的骚年,阅览做做笔记:http://www.cnblogs.com/neopenx/p/4643705.html 这里只是一些基础知识.帮助理解DL tool的实现. “这也是深度学习带来 ...
- 基于Ubuntu14.04系统的nvidia tesla K40驱动和cuda 7.5安装笔记
基于Ubuntu14.04系统的nvidia tesla K40驱动和cuda 7.5安装笔记 飞翔的蜘蛛人 注1:本人新手,文章中不准确的地方,欢迎批评指正 注2:知识储备应达到Linux入门级水平 ...
- CUDA程序设计(一)
为什么需要GPU 几年前我启动并主导了一个项目,当时还在谷歌,这个项目叫谷歌大脑.该项目利用谷歌的计算基础设施来构建神经网络. 规模大概比之前的神经网络扩大了一百倍,我们的方法是用约一千台电脑.这确实 ...
- 使用 CUDA范例精解通用GPU编程 配套程序的方法
用vs新建一个cuda的项目,然后将系统自动生成的那个.cu里头的内容,除了头文件引用外,全部替代成先有代码的内容. 然后程序就能跑了. 因为新建的是cuda的项目,所以所有的头文件和库的引用系统都会 ...
- CUDA代码移植
如果CUDA的代码移植,一个是要 include文件夹对不对,这个是.h文件能否找到的关键,另一个就是lib,这个是.lib文件能否找到的关键.具体检查地方,见下头. include: lib:
随机推荐
- Node节点
1.Node:节点元素节点->HTML标签文本节点->文字 但是在标准浏览器(除了IE6~8)中会把空格和换行都当做文本节点来处理注释节点->注释document2.节点的特征元素节 ...
- 如何为eclipse安装合适版本的python插件pydev
pydev是一款优秀的Eclipse插件,大多数喜欢在eclipse开发软件的程序员(也许是java程序员)在开发python软件时希望继续使用eclipse,那么pydev是非常理想的选择. 1.安 ...
- Linux2.6内核协议栈系列--TCP协议2.接收
1.排队机制 接收输入TCP报文时,有三个队列: ● 待处理队列 ● 预排队队列 ● 接收队列 接收队列包含了处理过的TCP数据段,也就是说,去除了全部的协议头,正准备将数据复制到用户应用程序.接收队 ...
- Android 手机卫士--导航界面2
本文地址:http://www.cnblogs.com/wuyudong/p/5947504.html,转载请注明出处. 在之前的文章中,实现了导航界面1布局编写与相关的逻辑代码,如下图所示: 点击“ ...
- 静态库介绍与简单演练及同名资源冲突解决(.a格式的静态库)
1.静态库和动态库都是闭源库,不公开源代码. 静态库:.a和.framework 动态库:.dylib和.framework(iOS9取消了.dylib,使用.tbd替代) 2.静态库和动态库在使用上 ...
- SQL Server 进阶 01 数据库的设计
SQL Server 进阶 01 数据库的设计 本篇目录 课程内容回顾及介绍 为什么需要规范的数据库设计 设计数据库的步骤 绘制E-R(实体-关系)图 实体-关系模型 如何将E-R图转换为表 数据规范 ...
- (二)Spark-Linux环境准备-Java&Python版Spark
Spark-Linux环境准备 视频教程: 1.优酷 2.YouTube 硬软件环境 1.虚拟机:VMware Workstation 12 2.虚拟机操作系统:RedHat5u4,单核,1G内存,2 ...
- JavaScript代码段整理笔记系列(二)
上篇介绍了15个常用代码段,本篇将把剩余的15个补齐,希望对大家有所帮助!!! 16.检测Shift.Alt.Ctrl键: event.shiftKey; //检测Shift event.altKey ...
- HOLOLENS 扫描特效 及得出扫描结果(SurfacePlane)
HOLOLENS 扫描特效 及得出扫描结果(SurfacePlane) 要求只扫出地板和墙, 由于地板和墙面积较大 扫描结果 HOLOTOOLKIT老版本点在参数调节PlaneFinding.Find ...
- [No000097]程序员面试题集【下】
1.下面中共包含()个正方形?40 计算规律,设大长方形长是5,宽是4,小正方形边长是1,那么图中.小正方形的个数是,4*5个,边长是2的正方形的个数是3*4个,边长是3的正方形的个数是2*3个,边长 ...