GPU概念的一点总结

时间:2024-03-22 17:35:04

最近看了

主要概念性的介绍了gpu的概念: http://blog.chinaunix.net/uid/28989651/cid-180794-list-3.html

其实之前就看过其他的,主要是回忆一下

关于最近的NVIDIA 显卡架构:http://blog.sina.com.cn/s/blog_66607d630100hlm9.html

gpu的硬件架构:http://www.cnblogs.com/dwdxdy/p/3215158.html


cuda编程中介绍的sp,sm等概念:http://www.cnblogs.com/dwdxdy/p/3215158.html


cuda中的bank conflict 冲突

准备看:

cuda从入门到精通 http://blog.csdn.net/kkk584520/article/details/9413973

http://blog.csdn.net/junparadox/article/category/6073422


1. 

从硬件上看:

sp 就是最小处理单元,对应一个线程;

sm 多个(32)个sp组成了sm,sm中跑的都是统一个线程,但是数据不同。有可能因为分支等判断条件,最终执行的命令也不同。

从软件上来看:

thread: 线程

block:多个threads 会被群组称一个block,block中的线程通过共享内存进行通信。高级的gpu也可以直接线程间通过寄存器通信

grid: 多个blocks则会再构成grid

warp: gpu执行程序时的调度单位,目前cuda的warp为32.

2. simt与simd不同,gpu从simd升级为simt了,不同之处:

  • 每个thread拥有自己的instruction address counter
  • 每个thread拥有自己的状态寄存器
  • 每个thread可以有自己独立的执行路径
3.对应关系:
GPU概念的一点总结
其中cuda core就是sp
4. 全局存储器:即普通的显存,整个网络中的任意线程都能读写全局存储器的任意位置,延迟为400~600个时钟周期,容易成为性能瓶颈。
即如果  int number = data[3];不会有冲突,所有的都访问一个,广播了。
int number = data[base + tid];不会有冲突,每个访问一个。
 int number = data[base + 4 * tid]; 每隔四个访问一个,冲突。
a:  data[tid] = global_data[tid];
    ...
      int number = data[16 * tid];
b:   int row = tid / 16;
      int column = tid % 16;
      data[row * 17 + column] = global_data[tid];
      ...
      int number = data[17 * tid];
虽然原来想访问0,16,32,48,但是将其转化为了17,34,51,实际上对应了1,2,3,变成了各访问各的,因而避免了冲突。

共享存储器,即是同一个块中的所有线程访问的可读写存储器。half warp为16个线程,对应16个blank(共享内存被分为16个blank),如果一一对应,则不会有冲突。如果有多个访问一个,则会有读写重读。如果16个访问同一个,则会出发广播,不会有冲突。

如果是a方式,则会严重冲突,即每个线程都访问同一个,而转为b方式的存储之后

5.需要注意的是,与cpu中上下文切换需要保存寄存器不同,gpu中为每一个上下文都单独设置了寄存器,因而上下文切换时,使用不同的寄存器,不需要保存,加快了存储效率。

6.