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 个线程)。
问题:
网格也是拆分的,为什么还要用网格? (如果我有一个有 200 个线程的网格,它将被分成 32 个线程并执行,那么什么是好的网格?)
每个SP执行一次线程?
每个SM一次执行一个warp?
我认为您在混淆术语。层次结构是 grid -> block -> warp -> thread:
- 内核在单个网格中启动。它映射到整个 GPU(除非你做一些花哨的多核计算,但那更高级)
- 一个网格由几个块组成。每个块映射到单个 SM,但如果资源允许,SM 可以处理多个块。
- 一个块被分成多个warp。根据 GPU 模型,每个 SM 一次处理 1 个或 2 个或 4 个扭曲。但是,block 能够同时处理分配给它的所有 warp。不同扭曲之间的切换经常发生,这样做是为了隐藏内存和指令延迟、依赖性等。
- 一个 warp 被分成 32 个线程。在 SIMD 中运行的 SM 在同一时刻执行 warp 的所有线程。
我在理解 GPU 如何,更确切地说是 GPU 的哪个部分执行线程时遇到了问题。 我已经了解如何将线程分组为块和网格。 每个 GPU 有一个或多个 SM(流式多处理器)和多个 SP(流式处理器或 CUDA 内核)。
据我了解,每个 SM 都会收到一个要执行的线程块。
这是我如何看待事物的照片。
this is an example of how i see things
之后,网格被分成经线(32 个线程)。
问题:
网格也是拆分的,为什么还要用网格? (如果我有一个有 200 个线程的网格,它将被分成 32 个线程并执行,那么什么是好的网格?)
每个SP执行一次线程?
每个SM一次执行一个warp?
我认为您在混淆术语。层次结构是 grid -> block -> warp -> thread:
- 内核在单个网格中启动。它映射到整个 GPU(除非你做一些花哨的多核计算,但那更高级)
- 一个网格由几个块组成。每个块映射到单个 SM,但如果资源允许,SM 可以处理多个块。
- 一个块被分成多个warp。根据 GPU 模型,每个 SM 一次处理 1 个或 2 个或 4 个扭曲。但是,block 能够同时处理分配给它的所有 warp。不同扭曲之间的切换经常发生,这样做是为了隐藏内存和指令延迟、依赖性等。
- 一个 warp 被分成 32 个线程。在 SIMD 中运行的 SM 在同一时刻执行 warp 的所有线程。