【CUDA】学习记录(4)-线程束的执行

Professional CUDA C Programing
代码下载:http://www.wrox.com/WileyCDA/

Warp资源分配

➤ 程序计数器
➤寄存器
➤ 共享内存
每个warp的上下文都是全部保留在SM上的,所以warp之间的切换没有什么消耗。每个SM上的寄存器和共享内存分配给线程块,根据寄存器的多上和共享存储器的大小可以决定同时驻留在一个SM上的warp数目和线程块数目。
一个SM上同时驻留的线程越多,则每个线程占用的寄存器数量越少。


Screenshot from 2017-04-27 16:52:02.png

一个SM上驻留的线程块越多,每个线程块占用的共享显存越少。


Screenshot from 2017-04-27 16:54:52.png

查看GPU资源的一些限制信息:一个线程块中最多1000个线程,GT740只有2个SM,但是Tesla K80有13个SM。
Screenshot from 2017-04-27 17:01:57.png

Screenshot from 2017-04-27 17:02:21.png

Active Warp

当计算资源分配给了该线程块时,该线程块叫做active block,其中包含的warps叫做active warps。active waps分为以下3类:
➤ Selected warp:warp调度器选中的warp,正在执行的warp。
➤ Stalled warp:还没有准备好执行的warp
➤ Eligible warp:已经准备好执行,但是还没有执行的warp。(准备好的限制条件:1.32个CUDA core可以用来执行;2.当前指令的所有参数都准备就绪)

延迟隐藏Latency Hiding

GPU设计成处理大量轻量的并发的线程,最大化实现吞吐率。
指令分为两类:
➤ 算术类指令:10-20个时钟周期
➤ 访存类指令:400-800个时钟周期访问global memory
????没有看懂
Number of Required Warps = Latency × Throughput


Screenshot from 2017-04-27 17:31:43.png

Bandwidth VS hroughput:带宽一般是理论上的峰值,吞吐量一般是实际达到的值。带宽一般指单位时间内数据的传输多少,吞吐量一般指单位时间内完成的某种操作或计算,比如说单位时间内完成的指令次数。

Occupancy

每个SM:occupancy = active warps/maximum warps
CUDA Toolkit中有一个帮助用户确定grid和block大小的工具:/usr/local/cuda-8.0/tools


Screenshot from 2017-04-27 19:08:07.png

➤小线程块:每个块的线程太少导致在所有硬件资源完全利用之前,已经达到了每个SM最多的warps。比如一个线程块只有10个thread,那么一个线程块就要占用一个warp。
➤大线程块:每个块太多的线程导致每个线程可以利用SM的资源更少。
选择策略:根据kernel的计算量调整block的size,并进行多次实验发现最优的grid和block的设置。
➤每个block中含有的thread是warpSize的整数倍数。
➤避免一个block太少的thread,一个block最少128或256个线程。
➤尽量使block的数目大于GPU的SM的数目。

同步Synchronization

屏障同步是许多并行编程语言中常见的原语。 在CUDA的同步可以在两个层面上执行:
➤系统级别:等待主机和设备上的所有工作完成。
➤块级别:等待在设备上的线程块中的所有线程到达执行中的同一点(同步点)。
由于许多CUDA API调用和所有内核启动都是与主机异步的,
cudaDeviceSynchronize可用于阻止主机应用程序,直到所有CUDA操作(copies,内核等)已经完成:

cudaError_t cudaDeviceSynchronize(void);
__device__ void __syncthreads(void);

同一个block中threads要注意避免资源竞争,不同的warps的执行顺序是随机的,多个thread访问同一个变量要注意read-write,write-read等问题,避免读脏数据等。不同的block的执行顺序是随机的。

可扩展性Scalability

可扩展:当计算量增大时可以通过增加CUDA core来解决。
参考在不同数量的计算核心上执行相同应用程序代码的能力
作为透明的可扩展性。 透明可扩展的平台拓宽了现有用例
应用程序,并减轻开发人员的负担,因为它们可以避免对新的更改或不同的硬件。 可扩展性比效率更重要。 一个可扩展但效率低的系统可以通过简单地添加硬件核心来处理更大的工作负载。 效率很高但不可扩展系统可能快速达到可实现性能的上限。


Screenshot from 2017-04-27 19:43:14.png

Checking Active Warps with nvprof

代码来源:http://www.wrox.com/WileyCDA/
第三章sumMatrix.cu

//矩阵大小16384*16384
 // invoke kernel at host side
    int dimx = 32;
    int dimy = 32;
    if(argc > 2)
    {
        dimx = atoi(argv[1]);
        dimy = atoi(argv[2]);
    }
    dim3 block(dimx, dimy);
    dim3 grid((nx + block.x - 1) / block.x, (ny + block.y - 1) / block.y);
// grid 2D block 2D
__global__ void sumMatrixOnGPU2D(float *A, float *B, float *C, int NX, int NY)
{
    unsigned int ix = blockIdx.x * blockDim.x + threadIdx.x;
    unsigned int iy = blockIdx.y * blockDim.y + threadIdx.y;
    unsigned int idx = iy * NX + ix;
    if (ix < NX && iy < NY)
    {
        C[idx] = A[idx] + B[idx];
    }
}
Screenshot from 2017-04-27 20:18:30.png
$ nvprof --metrics achieved_occupancy ./sumMatrix 32 32
32  32: Achieved Occupancy   0.758286    
32  16: Achieved Occupancy   0.777452
16  32: Achieved Occupancy   0.783850
16  32: Achieved Occupancy   0.810251
$ nvprof --metrics gld_throughput ./sumMatrix 32 32
32  32: Global Load Throughput  69.013GB/s    
32  16: Global Load Throughput  71.597GB/s
16  32: Global Load Throughput  67.425GB/s
16  32:Global Load Throughput  70.240GB/s
$ nvprof --metrics gld_efficiency ./sumMatrix 32 32
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,362评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,330评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,247评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,560评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,580评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,569评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,929评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,587评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,840评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,596评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,678评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,366评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,945评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,929评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,165评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,271评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,403评论 2 342

推荐阅读更多精彩内容