第二章

cuda代码写在.cu/.cuh里面

cuda 7.0 / 9.0开始,NVCC就支持c++11 / 14里面绝大部分的语言特性了.

Dim3

__host__ __device__ dim3(unsigned int vx = 1, unsigned int vy = 1, unsigned int vz = 1) : x(vx), y(vy), z(vz) {}
__host__ __device__ dim3(uint3 v): x(v.x), y(v.y), z(v.z) {}

Single Instruction, Multiple Data (SIMD)

用SIMD也不是一直是好的.

Streaming Multiprocessor (SM)一般每个有128个single precision CUDA cores(也就是一个线程)和对应的cache.

Block会被分成Warps, Warp是32个线程的集合(都在一个block里面).所有的32线程必须都跑同一组命令集.

一个SM里的Warps是同时跑的.

如果你想用一个Warp做不同的事儿,会按顺序做,也叫Warp Divergence.

Device Memory 也叫 Global Memory, 也就是GPU的RAM.从Device Memory拿比从真的RAM快.


Global Memory也没那么快,是很多GPU程序的bottleneck.

第三章

第四章

Latency: 硬件导致的延迟

Thoughput: 吞吐量


  • CPU: 低延迟, 低吞吐量

    • CPU clock: 3GHz
    • main Memory latency: ~ 100+ns
    • arithmetic instruction latency: ~1+ns
  • GPU:高延迟,高吞吐量
    • 1GHz
    • 300+ns
    • 10+ns

GPU非常的IOlimited,所以对与IO要谨慎处理.

  • Registers:最快的,只有线程才能用,生命周期和线程一样.
  • Local Memory: 150倍慢(比register和shared memory来说).
  • shared memory:当没有bank conflicts或者从同一个地址读的时候,可以和register一样快. 对于一个block里面的所有线程都可见.和block一样的生命周期.
  • global memory: 150倍慢(比register和shared memory)

global memory和GPU核不在一块.

  • 有最大的容量
  • GPU有.5到24GB的global memory,一般是~2GB.
  • 延迟大概是~300ns 在kepler上.

shared memory

  • 在SM上灰常快的memory
  • 和L1 cache是一样的
  • ~5ns的延迟
  • 最大大约~48KB

shared memory语法

可以静态的分配shared memory,或者动态的分配

  • static allocation

    __shared__ float data[1024]

    在kernel里面声明

  • dynamic allocation syntax

    Host:

    ​ kernel<<<grid_dim, block_dim, numByteShMem>>>(args);

    Device:

    ​ extern shared float s[];

    还有些别的..


    一个常见的pattern


Bank conflicts

任何序列的GPU变成都会对于导致表现下降.


Registers

大概比shared memory快10x.

每一个SM里大概有1万个registers.

一般kernel里声明的stack变量就是存储在registers.


Local Memory

是任何在stack上不能塞进register里的东西.

local memory只能给thread用.


L1 Cache

每一个SM有它自己的L1 Cache.

L2 Cache

被所有的SM共享

L3 Cache

比L2慢点但也大.

Constant Memory Constant Cache

In host code:

cudaMemcpyToSymbol(foo, h_src, sizeof(int)*1024);

Texture Memory

这个东西非常复杂,而且对于一般的计算来说只是有点用.

有用的特性:

  • (没看懂) 2D or 3D data locality for caching purposes through "CUDA arrays". Goes into special texture cache.
  • 在一维/二维/三维的array插值快.
  • 把int型转化为统一的("unitized")浮点数.

常用的场景:

  • 用texture cache和cuda array来读输入数据,来利用空间缓存(spatial caching).
  • 利用numerical texture capabilities.
  • 和OpenGL以及一般的computer graphics交互.

CUDA编程学习笔记2的更多相关文章

  1. CUDA编程学习笔记1

    CUDA编程模型是一个异构模型,需要CPU和GPU协同工作. host和device host和device是两个重要的概念 host指代CPU及其内存 device指代GPU及其内存 __globa ...

  2. JAVA GUI编程学习笔记目录

    2014年暑假JAVA GUI编程学习笔记目录 1.JAVA之GUI编程概述 2.JAVA之GUI编程布局 3.JAVA之GUI编程Frame窗口 4.JAVA之GUI编程事件监听机制 5.JAVA之 ...

  3. Linux Shell编程学习笔记——目录(附笔记资源下载)

    LinuxShell编程学习笔记目录附笔记资源下载 目录(?)[-] 写在前面 第一部分 Shell基础编程 第二部分 Linux Shell高级编程技巧 资源下载 写在前面 最近花了些时间学习She ...

  4. DirectX 11游戏编程学习笔记之8: 第6章Drawing in Direct3D(在Direct3D中绘制)(习题解答)

            本文由哈利_蜘蛛侠原创,转载请注明出处.有问题欢迎联系2024958085@qq.com         注:我给的电子版是700多页,而实体书是800多页,所以我在提到相关概念的时候 ...

  5. 多线程编程学习笔记——async和await(一)

    接上文 多线程编程学习笔记——任务并行库(一) 接上文 多线程编程学习笔记——任务并行库(二) 接上文 多线程编程学习笔记——任务并行库(三) 接上文 多线程编程学习笔记——任务并行库(四) 通过前面 ...

  6. 多线程编程学习笔记——async和await(二)

    接上文 多线程编程学习笔记——async和await(一) 三.   对连续的异步任务使用await操作符 本示例学习如何阅读有多个await方法方法时,程序的实际流程是怎么样的,理解await的异步 ...

  7. 多线程编程学习笔记——async和await(三)

    接上文 多线程编程学习笔记——async和await(一) 接上文 多线程编程学习笔记——async和await(二) 五.   处理异步操作中的异常 本示例学习如何在异步函数中处理异常,学习如何对多 ...

  8. 多线程编程学习笔记——使用异步IO(一)

    接上文 多线程编程学习笔记——使用并发集合(一) 接上文 多线程编程学习笔记——使用并发集合(二) 接上文 多线程编程学习笔记——使用并发集合(三) 假设以下场景,如果在客户端运行程序,最的事情之一是 ...

  9. 多线程编程学习笔记——编写一个异步的HTTP服务器和客户端

    接上文 多线程编程学习笔记——使用异步IO 二.   编写一个异步的HTTP服务器和客户端 本节展示了如何编写一个简单的异步HTTP服务器. 1.程序代码如下. using System; using ...

随机推荐

  1. Qt实现小功能之列表无限加载(创意很不错:监听滚动条事件,到底部的时候再new QListWidgetItem)

    概念介绍 无限加载与瀑布流的结合在Web前端开发中的效果非常新颖,对于网页内容具备较好的表现形式.无限加载并没有一次性将内容全部加载进来,而是通过监听滚动条事件来刷新内容的.当用户往下拖动滚动条或使用 ...

  2. 使用wireshark抓包分析-抓包实用技巧

    目录 使用wireshark抓包分析-抓包实用技巧 前言 自定义捕获条件 输入配置 输出配置 命令行抓包 抓取多个接口 抓包分析 批量分析 合并包 结论 参考文献 使用wireshark抓包分析-抓包 ...

  3. React性能优化之PureComponent 和 memo使用分析

    前言 关于react性能优化,在react 16这个版本,官方推出fiber,在框架层面优化了react性能上面的问题.由于这个太过于庞大,我们今天围绕子自组件更新策略,从两个及其微小的方面来谈rea ...

  4. 推荐一个Redis管理工具

    Redis是一个开源(BSD许可),内存存储的数据结构服务器,可用作数据库,高速缓存和消息队列代理.它支持字符串.哈希表.列表.集合.有序集合,位图,hyperloglogs等数据类型.内置复制.Lu ...

  5. JS中的闭包 详细解析大全(面试避必考题)

    JS中闭包的介绍   闭包的概念 闭包就是能够读取其他函数内部变量的函数. 一.变量的作用域 要理解闭包,首先必须理解Javascript特殊的变量作用域. 变量的作用域无非就是两种:全局变量和局部变 ...

  6. Linux 安装Nginx与使用

    最近继续整理Linux相关文档.这次整理的是Nginx,这里将自己整理的详细文档做个笔记. 1.  安装环境依赖包 1. gcc 语言编译器套件. 2. pcre 兼容正则表达式的库 rewrite ...

  7. Codeforces 1133E - K Balanced Teams - [DP]

    题目链接:https://codeforces.com/contest/1133/problem/C 题意: 给出 $n$ 个数,选取其中若干个数分别组成 $k$ 组,要求每组内最大值与最小值的差值不 ...

  8. Nginx部署多个站点

    Nginx部署多个站点 一,介绍与需求 1.1,介绍 详细介绍请看nginx代理部署Vue与React项目,在这儿主要介绍多个站点的配置 1.2,需求 有时候想在一台服务器上为不同的域名/不同的二级域 ...

  9. NumPy基础操作(3)——代数运算和随机数

    NumPy基础操作(3)--代数运算和随机数 (注:记得在文件开头导入import numpy as np) 目录: NumPy在矩阵运算中的应用 常用矩阵运算函数介绍 编程实现 利用NumPy生成随 ...

  10. ZOJ 3795:Grouping(缩点+最长路)

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5303 题意:有n个人m条边,每条边有一个u,v,代表u的年龄大于等于v,现在要 ...