Cuda GPU如何更准确地执行线程

Cuda GPU如何更准确地执行线程,cuda,gpu,Cuda,Gpu,我在理解GPU如何执行线程时遇到了一个问题,更确切地说,是GPU的哪个部分执行线程。 我已经了解了线程是如何在块和网格中分组的。 每个GPU都有一个或多个SM(流式多处理器)和多个SP(流式处理器或CUDA内核) 据我所知,每个SM都会收到一个要执行的线程块。 这是一张我如何看待事物的照片。 之后,网格被拆分为扭曲(32个线程)。 问题: 如果网格也是拆分的,为什么要使用网格?(如果我有一个有200个线程的网格,它将被分成32个线程并执行,那么什么是好的网格?) 每个SP每次执行一个线程 每个S

我在理解GPU如何执行线程时遇到了一个问题,更确切地说,是GPU的哪个部分执行线程。 我已经了解了线程是如何在块和网格中分组的。 每个GPU都有一个或多个SM(流式多处理器)和多个SP(流式处理器或CUDA内核)

据我所知,每个SM都会收到一个要执行的线程块。
这是一张我如何看待事物的照片。 之后,网格被拆分为扭曲(32个线程)。 问题:

  • 如果网格也是拆分的,为什么要使用网格?(如果我有一个有200个线程的网格,它将被分成32个线程并执行,那么什么是好的网格?)

  • 每个SP每次执行一个线程

  • 每个SM一次执行一个扭曲


  • 我认为你在混用术语。层次结构为网格->块->扭曲->线程:

    • 内核在单个网格中启动。它映射到整个GPU(除非您进行一些奇特的多内核计算,但这更高级)
    • 网格由几个块组成。每个块映射到单个SM,但是如果资源允许,SM可以处理多个块
    • 一个块被分成若干条曲线。根据GPU型号,每个SM一次处理1、2或4个扭曲。但是,块能够同时处理分配给它的所有扭曲。在不同的扭曲之间切换非常频繁,这样做是为了隐藏内存和指令延迟、依赖性等
    • 一条经线被分成32条线。在SIMD中运行的SM在同一时刻执行翘曲的所有线程

    好的,但举例来说,我的GPU(GeForce GT 750M)有2个SM,每个SM有192个cuda内核或SP。我不知道有多少个warp可以执行我的GPU,但le说2个。如果一个有192个线程的块到达SM1,它一次只执行2个扭曲(64个线程),其余128个SP(192-64个)将不执行任何操作?还有一个问题..最后每个线程都由SP执行,对吗?一次执行的扭曲总数是#个内核/32。根据你的数字,它将是192/32=6。但是,实际上,您希望启动更多的线程,因为每个SP都能够同时处理多个线程。无论如何,每个线程都将由SP并行或顺序执行…@CygnusX1只是确认一下,一次执行的扭曲总数是否实际大于#个内核/32?除了SP(即此处的核心)之外,还有其他处理单元,如双精度单元和LD/ST单元等。因此,可以同时执行更多的扭曲?@MarZzz一次运行的扭曲数量与扭曲调度程序的数量有关。这反过来又与内核的数量有关,但随着它们的数量和味道随着每代GPU的增加而增加,最好是查看调度器。例如,Volta有FP32、FP64、INT32、张量和特殊函数核。