c - 有人知道nvidia产品(Kepler)中warp报废的机制吗?

标签 c cuda nvidia

我正在谈论具有计算能力 3.5 (GK110) 的 nvidia GPU:

在每个 GPU 核心上,最多有 64 个事件 warp,硬件如何处理 warp 退役?来自不同网格 block 甚至流的扭曲可以在 GPU 的单个核心上同时工作(我所说的核心是指多处理器,因为它们本质上是多核 GPU 的核心)?

核心能否快速从流中退出已完成的扭曲,并将其他扭曲从其他流加载到同一核心?

我问这个问题的原因是因为要做出艰难的决定:

(1) 我可以编写代码来从不同的流启动许多线程,并且启动的大约 2/3 的 warp 基本上不会执行任何操作并快速退出。

或者:

(2) 我可以编写代码来启动所需数量的线程,但每个线程将包含非常繁重的索引计算(通过求解多个索引方程,计算正确索引所涉及的计算量将仅为与 (1) 中的实际计算一样多(如果不是更多)。

因此,如果 GK110 可以快速淘汰空扭曲并用新扭曲替换它们,那么(1)将比(2)更好,因为它可以完全避免不必要的索引计算。

到目前为止,简单的案例测试表明这两种方法的效果大致相同,但我不确定 (1) 在非简单的情况下是否会更好。

最佳答案

On each GPU core, there are at most 64 active warps. How does the hardware handle warp retirements? Can warps from different grid blocks or even streams work concurrently on a single core of a GPU (by core I mean multiprocessor, since they are estentially the core of a multi-core GPU)?

是的,来自不同线程 block 的扭曲可以共存并准备在单个 SM 上执行。这些不同的线程 block 可以来自相同的内核或不同的内核,来自不同的流。描述了来自不同内核并发执行的线程 block here .

Can a core retire finished warps quickly from a stream and load other warps from maybe other stream to the same core?

是的。在分配扭曲之前,工作的划分首先由线程 block 处理。首先,在 SM 上调度一个线程 block ,然后选择要执行的 warp 的过程发生。只要 SM 上有可用的线程 block 插槽(并且没有其他调度限制,例如共享内存或寄存器使用),来自任何可用内核的新线程 block 都可以在 cc 3.5 SM 上调度。

关于c - 有人知道nvidia产品(Kepler)中warp报废的机制吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15330031/

相关文章:

c - C 多久/何时执行 if/else 语句中的内容?

c - 使用异或运算加密结构元素

C编程: SIGABRT 134 error; am I freeing this memory correctly?

c++ - 在 CUDA 源文件上使用 clang-tidy

matlab - 对于大型阵列,GPU在Matlab中的gpuArray矩阵上崩溃

c - 将条件运行到条件的真实语句中

CUDA主机和设备使用相同的__constant__内存

在 K20 上没有 -G 选项时 CUDA C 返回不确定且奇怪的结果

cuda - 我可以使用 Quadro K4000 和 K2000 进行 GPUDirect v2 点对点 (P2P) 通信吗?

winapi - main 与 wWinMain