GPU 如何更准确地执行线程

How more exactly a GPU execute threads

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

据我了解,每个 SM 都会收到一个要执行的线程块。
这是我如何看待事物的照片。 this is an example of how i see things 之后,网格被分成经线(32 个线程)。 问题:

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

  2. 每个SP执行一次线程?

  3. 每个SM一次执行一个warp?

我认为您在混淆术语。层次结构是 grid -> block -> warp -> thread:

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