我阅读了NVIDIA Fermi白皮书,并在计算SP内核,调度程序的数量时感到困惑。
根据白皮书,每个SM中都有两个Warp调度程序和两个指令分派单元,从而允许同时发布和执行两个Warp。SM中有32个SP内核,每个内核具有完全流水线化的ALU和FPU,用于执行线程的指令
众所周知,一个warp由32个线程组成,如果我们仅在每个周期内发出一个warp,则意味着该warp中的所有线程将占用所有SP内核,并在一个周期内完成执行(假设没有任何停顿) )。
但是,NVIDIA设计了双调度程序,该调度程序选择两个扭曲,然后从每个扭曲向一个16个核,16个加载/存储单元或4个SFU的组发出一条指令。
NVIDIA表示,这种设计可带来最高的硬件性能。最高的硬件性能可能来自对不同指令的交错执行,从而充分利用了硬件资源。
我的问题如下(假设没有内存停滞并且所有操作数都可用):
每个warp是否需要两个周期来完成执行,并且每个warp调度程序将所有32个SP内核分为两组?
ld / st和SFU单元由所有经线共享(看起来像来自双重调度程序的经线的统一服)?
如果将经纱分为两个部分,请先安排哪一部分?有调度程序吗?或只是随机选择一个要执行的部分。
这种设计的优点是什么?只是最大限度地利用硬件?
代码段:
>>>s = []
>>>len(s)
0
Run Code Online (Sandbox Code Playgroud)
然而:
>>>s = [[]]
>>>len(s)
1
Run Code Online (Sandbox Code Playgroud)
我只声明两个列表,但没有分配任何元素,为什么len()给出不同的输出?