持久线程与 device-side-enqueue/nested-parallelism
Persistent threads vs device-side-enqueue/nested-parallelism
如果可以应用,在 GPGPU 中使用持久线程与使用 device-side-enqueue/nested-parallelism 相比是否还有优势?
我读过一些较旧的论文,其中在较旧的硬件上需要持久线程以获得最佳性能,我不确定使用 device-side-enqueue/nested-parallelism 是否会使该技术变得无关紧要?
我想在子任务从其父持久线程启动后完全独立的情况下仍然值得吗?
作为一种编程方法的持久线程可能会在一段时间内继续受到关注。与嵌套并行性相比,持久线程可能具有多种优势。这里有 2 个:
消除启动延迟:虽然它很小(可能低至几微秒),但至少在 CUDA 动态并行 (CDP) 的情况下,启动延迟与两个主机相关内核启动和子内核启动。对于极低的延迟需求(例如网络数据包处理),producer/consumer 具有持久线程的工作队列模型可以提供比任何涉及与接收新工作相关联的启动的机制更低的延迟和更快的周转。
内存使用优化:持久线程的一个新用例是避免与内核启动相关的 load/store 模式。一个很好的例子描述是here。基本思想是,对于类似工作负载的重复处理,我们可以仔细优化片上数据存储的使用(包括共享内存,特别是 GPU 寄存器 space 的使用)以避免必须加载内核启动时的 data/parameters 例如从全局内存,然后(可能)在内核结束时将更新的参数存储回全局内存。对于使用大量携带参数的特定工作负载,这可以具有显着的处理优势,并且参数 space 可以在片上变为 "fit"。随着更新的 GPU 具有越来越多的片上寄存器存储 space,这可能会继续对更大的工作负载感兴趣。
很可能还有其他特定用例,在这些用例中,持久线程方法比工作时启动方法具有明显的优势。这只是两个例子。
简而言之,持久内核并不是替代其他类型 GPU 处理范例的通用策略,但在特定情况下,它可以提供优于重复启动内核的方法的优势。因此,对持久内核的一些兴趣可能会持续一段时间。
如果可以应用,在 GPGPU 中使用持久线程与使用 device-side-enqueue/nested-parallelism 相比是否还有优势?
我读过一些较旧的论文,其中在较旧的硬件上需要持久线程以获得最佳性能,我不确定使用 device-side-enqueue/nested-parallelism 是否会使该技术变得无关紧要?
我想在子任务从其父持久线程启动后完全独立的情况下仍然值得吗?
作为一种编程方法的持久线程可能会在一段时间内继续受到关注。与嵌套并行性相比,持久线程可能具有多种优势。这里有 2 个:
消除启动延迟:虽然它很小(可能低至几微秒),但至少在 CUDA 动态并行 (CDP) 的情况下,启动延迟与两个主机相关内核启动和子内核启动。对于极低的延迟需求(例如网络数据包处理),producer/consumer 具有持久线程的工作队列模型可以提供比任何涉及与接收新工作相关联的启动的机制更低的延迟和更快的周转。
内存使用优化:持久线程的一个新用例是避免与内核启动相关的 load/store 模式。一个很好的例子描述是here。基本思想是,对于类似工作负载的重复处理,我们可以仔细优化片上数据存储的使用(包括共享内存,特别是 GPU 寄存器 space 的使用)以避免必须加载内核启动时的 data/parameters 例如从全局内存,然后(可能)在内核结束时将更新的参数存储回全局内存。对于使用大量携带参数的特定工作负载,这可以具有显着的处理优势,并且参数 space 可以在片上变为 "fit"。随着更新的 GPU 具有越来越多的片上寄存器存储 space,这可能会继续对更大的工作负载感兴趣。
很可能还有其他特定用例,在这些用例中,持久线程方法比工作时启动方法具有明显的优势。这只是两个例子。
简而言之,持久内核并不是替代其他类型 GPU 处理范例的通用策略,但在特定情况下,它可以提供优于重复启动内核的方法的优势。因此,对持久内核的一些兴趣可能会持续一段时间。