• CUDA学习笔记(二)——CUDA线程模型


    转自:http://blog.sina.com.cn/s/blog_48b9e1f90100fm5b.html

    一个grid中的所有线程执行相同的内核函数,通过坐标进行区分。这些线程有两级的坐标,blockId和threadId,由CUDA runtime system指定。grimDim.x标识block在x维度上的数目,gridDim.y标识block在y维度上的数目。例如,

                                                   CUDA学习笔记(二)鈥斺擟UDA线程模型

     

     

    在启动内核时指定:

           dim3 dimBlock(4,2,2);

           dim3 dimGrid(2,2,1);

           KernelFunction<<<dimGrid, dimBlock>>>(…);

           其中,grid是二维的,所以,最后一个参数一般设置为1。

    注意:一个block最多能有512个线程。

    如果kernel function没有用到blockId,那么所有的线程都属于同一个block。

     

    例如:

    P=M* N,那么:Pd[Row][Col]=Sum{ Md[Row][k]*Nd[k][Col] }

                      CUDA学习笔记(二)鈥斺擟UDA线程模型

     

     

    同一个block中的线程通过syncthreads()进行同步。当内核函数调用syncthreads()时,block中的所有线程都在调用位置停留,直到block中的其他线程达到这个位置。Barrier synchronization是常用的协调线程并行行为的方法。

           为了避免同一个block中的线程在同步的时候,会有长时间的等待。往往把相同的资源分配给一个block中的线程。不同的block可以以任意顺序执行,因为不同的block之间不存在同步问题。如图:

     

          CUDA学习笔记(二)鈥斺擟UDA线程模型 这样的话,同样的程序,可以以多种不同的方式执行。每种执行方式可能有不同的开销,功耗和性能。例如,一个mobile processor可以以很低的功耗慢速执行,一个desktop processor可以以高一些的功耗快速执行。程序相同,但是这种改变是透明的。

    线程分配

           一旦启动一个kernel,CUDA run-time系统就产生对应的grid。Grid中的线程分配到block上。GeForce 8800GTX有16个Streaming Multiprocessor,每个SM最多可以分配8个block,所以最多有128个block同时分配给Streaming Multiprocessor。系统维护一个block的list,当前面的block执行完成后,分配新的block给SM。

           另一个资源限制是能够同时调度的线程数目。因为保留thread, block的ID并跟踪他们的执行状态需要硬件资源。在GeForce 8800GTX上,每个SM最多能分配768个线程。所以,整个GeForce 8800GTZX最多同时有12288(16*768)个线程。

    线程调度

           在GeForce 8800GTX中,一旦一个block指定给一个SM,这个block被分成32个线程的单位,叫做Warps。Warp的大小根据不同的平台实现而不同。

           实际上,warp甚至不是CUDA语言定义中的一部分。但是,warp的概念可以帮助理解和优化GeForce-8系列处理器的CUDA程序。Warps是线程的调度单位。根据block中分配的线程数目,可以求出warp数目:warps=threads/32。总的来说,一个SM中最多有24(768/32)个warps。

    而在一个时间点,只能有一个warp在真正的执行。如果一个warp中的线程执行一条指令时,需要等待前面的长延迟的操作,warp就被放在等待区域中。其他不用等待的warp可以开始执行。如果有多个warp处于备执行状态,有一个优先机制进行选择。如图:

    CUDA学习笔记(二)鈥斺擟UDA线程模型

     

    调度单位是warp中的block。这样,如果每时每刻都有线程在执行,能够保持系统始终处于忙碌状态。这是一种零开销的线程调度。

  • 相关阅读:
    浮点数
    opencv笔记-GFTTDetector
    有向图与关联矩阵
    亚像素角点
    字符串格式化输出
    字符串表示与转换
    Bresenham算法
    罗德里格斯公式
    模型调参
    jave 逻辑运算 vs 位运算 + Python 逻辑运算 vs 位运算
  • 原文地址:https://www.cnblogs.com/qingsunny/p/3382799.html
Copyright © 2020-2023  润新知