GPU架构

GPU特别适用于 密集计算,高度可并行计算,图形学

晶体管主要被用于 执行计算,而不是缓存数据,控制指令流

GPU计算的历史

2001/2002 —— 研究人员把GPU当做数据并行协处理器

GPGPU领域从此诞生

2007—— NVIDIA 发布 CUDA

CUDA 统一计算设备架构

GPGPU发展成 GPU Computing

2008—— Khronos 发布OpenCL 规范

CUDA术语

Host——主机端,通常指CPU,采用标准C语言编程,C++,Python

Device——设备端,通常指GPU(数据可并行)

采用标准C的扩展语言编程

Host和Device拥有各自的存储器

CUDA编程包括主机端和设备端两部分代码

Kernel——数据并行处理函数(核函数),Kernel是指执行在GPU上的完整代码

通过调用Kernel函数在设备端创建轻量级线程,线程由硬件负责创建并调度

函数声明

__global__  void KernelFunc()  只能从主机端调用,在设备上执行,入口函数

__device__  float DeviceFunc()       设备             设备

__host__  float HostFunc()            主机             主机

__global__ 返回值类型必须是 void

__device__ 曾经默认内联,现在有些变化

__device__ 和 __host__ 可以同时使用


CUDA/GPU编程模型

CPU/GPU互动模型

GPU线程组织模型

GPU存储模型

基本的编程问题

CPU-GPU交互

各自的物理内存

通过PCIE总线互连

交互开销较大

并行编程模型

共享存储模型

线程模型

消息传递模型

数据并行模型

具体实例

OpenMp

MPI

SPMD:单指令多数据相似,每一个代码段处理多个数据

MPMD:多指令多数据

线程层次

Grid——一维或多维线程块(block)

一维或二维

Block——一组线程

一维,二维或三维

一个 Grid 里的每个 Block 的线程数是一样的

CUDA存储器类型(访存速度由大到小)

Register     寄存器

shared memory    共享内存

local memory   局部存储器

global memory    全局存储器

constant memory 常量存储器

texture memory    纹理存储器

内存模型

变量声明                                              存储器                作用域               生命期

必须是单独的自动变量不能是数组   register             thread               kernel

自动变量数组                                        local                  thread               kernel

__shared__ int sharedVar                shared               block                kernel

__device__ int globalVar                  global                grid                   application

__constant__ intconstantVar          constant           grid                    application

global 和 constant 变量

Host 可以通过以下函数访问

cudaGetSymbolAddress()

cudaGetSymbolSize()

cudaMemcpyToSymbol()

cudaMemcpyFromSymbol()

Constants 变量必须在函数外声明

向量数据类型

char [1-4], uchar[1-4]

short [1-4],

int [1-4],

long [1-4],

longlong [1-4],

float [1-4]

double1, double2

同时适用 host 和 device 代码

通过make_<type name> 构造

int2 i2 = make_int2(1,2);

float4 f4 = make_float(1.0f,2.0f,3.0f,4.0f);

通过 .x  .y  .z  和  .w 访问

int2 i2 = make_int2(1,2);

int x = i2.x;

int y = i2.y;

数学函数

部分函数列表

sqrt,rsqrt

exp,log

sin,cos,tan,sincos

asin,acos,atan2

trunc,ceil,floor

Intrinsic function 内建函数

仅面向 device 设备端

更快,但精度降低

以__为前缀

__exp,__log,__sin,__pow.....

CUDA编程前言的更多相关文章

  1. CUDA 编程的基本模式

    reproduced from: http://www.cnblogs.com/muchen/p/6306747.html 前言 本文将介绍 CUDA 编程的基本模式,所有 CUDA 程序都基于此模式 ...

  2. 不同版本CUDA编程的问题

    1 无法装上CUDA的toolkit 卸载所有的NVIDIA相关的app,包括NVIDIA的显卡驱动,然后重装. 2之前的文件打不开,one or more projects in the solut ...

  3. cuda编程基础

    转自: http://blog.csdn.net/augusdi/article/details/12529247 CUDA编程模型 CUDA编程模型将CPU作为主机,GPU作为协处理器(co-pro ...

  4. CUDA学习笔记(一)——CUDA编程模型

    转自:http://blog.sina.com.cn/s/blog_48b9e1f90100fm56.html CUDA的代码分成两部分,一部分在host(CPU)上运行,是普通的C代码:另一部分在d ...

  5. CUDA编程

    目录: 1.什么是CUDA 2.为什么要用到CUDA 3.CUDA环境搭建 4.第一个CUDA程序 5. CUDA编程 5.1. 基本概念 5.2. 线程层次结构 5.3. 存储器层次结构 5.4. ...

  6. CUDA编程-(1)Tesla服务器Kepler架构和万年的HelloWorld

    结合CUDA范例精解以及CUDA并行编程.由于正在学习CUDA,CUDA用的比较多,因此翻译一些个人认为重点的章节和句子,作为学习,程序将通过NVIDIA K40服务器得出结果.如果想通过本书进行CU ...

  7. cuda编程(一)

    环境安装和例程运行 显卡主要有两家,ATI.NVIDIA,简称A卡和N卡.随着GPU计算能力的上升,采用GPU并行计算来加速的应用越来越多. Nvidia创立人之一,黄仁勋(Jen-Hsun Huan ...

  8. CUDA编程入门,Dim3变量

    dim3是NVIDIA的CUDA编程中一种自定义的整型向量类型,基于用于指定维度的uint3. 例如:dim3 grid(num1,num2,num3): dim3类型最终设置的是一个三维向量,三维参 ...

  9. CUDA编程(六)进一步并行

    CUDA编程(六) 进一步并行 在之前我们使用Thread完毕了简单的并行加速,尽管我们的程序运行速度有了50甚至上百倍的提升,可是依据内存带宽来评估的话我们的程序还远远不够.在上一篇博客中给大家介绍 ...

随机推荐

  1. 括号匹配问题 —— Deque双端队列解法

    题目: 给定一个只包括 '(',')','{','}','[',']'?的字符串,判断字符串是否有效. 有效字符串需满足: 左括号必须用相同类型的右括号闭合.左括号必须以正确的顺序闭合.注意空字符串可 ...

  2. 通过 Kubeadm 安装 K8S 与高可用,版本1.13.4

    环境介绍: CentOS: 7.6 Docker: 18.06.1-ce Kubernetes: 1.13.4 Kuberadm: 1.13.4 Kuberlet: 1.13.4 Kuberctl: ...

  3. Maven添加依赖后如何在IDEA中引用

    使用idea打开/创建maven项目,可以正常使用maven命令编译发布,但idea里智能提示.代码均找不到包,原因是idea并未引用依赖的包,这时需要添加idea引用即可 解决方法 在IDEA右侧的 ...

  4. 【转载】使用Class.getResource和ClassLoader.getResource方法获取文件路径

    自从转投Java阵营后,一直发下Java程序的路径读取异常麻烦,因此查阅了比较多的版本内容,整合了一份自己的学习笔记.主要使用Class及通过ClassLoader来动态获取文件路径. 查阅链接如下: ...

  5. WebApi 身份认 Basic基础认证

    <body> <div style="text-align:center;"> <div>用户名:<input type="te ...

  6. 【MySQL】数据库(分库分表)中间件对比

    分区:对业务透明,分区只不过把存放数据的文件分成了许多小块,例如mysql中的一张表对应三个文件.MYD,MYI,frm. 根据一定的规则把数据文件(MYD)和索引文件(MYI)进行了分割,分区后的表 ...

  7. 巧用XML格式数据传入存储过程转成表数据格式

    1.首先将后台数据转成对应的XML数据格式 /// <summary> /// 集合转XML数据格式 /// </summary> /// <param name=&qu ...

  8. Apache日志轮询Cronolog安装及简单用法

    安装日志轮询工具cronolog: [root@bqh- tools]# tar xf cronolog-.tar.gz [root@bqh- tools]# cd cronolog- [root@b ...

  9. Flutter中的按钮组件介绍

    Flutter 里有很多的 Button 组件很多,常见的按钮组件有:RaisedButton.FlatButton.IconButton.OutlineButton.ButtonBar.Floati ...

  10. 【深度学习】基于Pytorch的ResNet实现

    目录 1. ResNet理论 2. pytorch实现 2.1 基础卷积 2.2 模块 2.3 使用ResNet模块进行迁移学习 1. ResNet理论 论文:https://arxiv.org/pd ...