最近看了
主要概念性的介绍了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可以有自己独立的执行路径
其中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.