【问题标题】:Order of execution in CUDA or OpenCL kernels - for memory access optimisationCUDA 或 OpenCL 内核中的执行顺序 - 用于内存访问优化
【发布时间】:2018-11-10 01:41:06
【问题描述】:

有没有关于内核执行顺序的提示?

假设我开始使用 8x8 的工作组处理 1024x1024 的网格。我有 1080 个计算单元,每个计算单元有 128 个核心 - 总共 2560 个核心。

现在很明显,平均每个物理核心将平均处理网格中大约 400 个项目。质疑统计上每个核心的执行顺序是什么?会是行专业吗?专栏专业还是每个核心都会有自己的“子区域”来处理?

为了确保内存访问是缓存友好的,这个问题很重要。

【问题讨论】:

  • 询问如何一个 GPU-kernel-code被安排执行“跨”一些主机指示的{ 1D |二维 | 3D }-块几何 + { 1D |二维 | 3D }-Thread-Geometry 关于多个 GPU 内核代码单元如何映射到 SMX 单元的线性池?那些性能方面/延迟方面有趣的缓存资源对于单个 SM-s 来说是相当本地的,因此主要是隔离的,在 SIMT 执行几何的不同区域之间不可共享,所以你介意澄清哪种缓存类型友好吗你寻求? (+ WARP 范围内的调度可能会变得贪婪,取决于代码)
  • 我问的是每个单核或翘曲/波前单元的平均情况 - 所以它是第一个。
  • 对于 CUDA,至少,所请求的信息是未指定的,并且不能保证统计研究可以在不同的 GPU 类型或 CUDA 版本甚至运行到运行之间重现。如果您希望有可预测的工作顺序,独立于线程块或线程调度顺序,这是可能的,但我熟悉的方法将涉及根据实际调度顺序创建您自己的线程/块 ID。这个特别的search 将突出我所说的六个例子。

标签: caching cuda opencl gpgpu gpu


【解决方案1】:

假设我开始处理 1024x1024 的网格,工作组为 8x8。我有 1080 个,每个 128 个核心有 20 个计算单元 - 总共 2560 个 核心。

这并不是可视化 GPU 的真正有效方法。您有 20 个计算单元。而已。 “核心”实际上是一对 (2 x 32) 通道向量 ALU 单元,每个单元都有一个指令调度程序和一个共享的 L1 缓存。

现在很明显,平均每个物理内核将在 网格中平均大约 400 个项目。

这不符合多种原因。工作的分配方式取决于您编写的代码和用于运行代码的执行参数。内核输入的大小与给定 SM 或 SM 中的“核心”将执行的并行操作量之间没有内在关系。

质疑每个核心的执行顺序在统计上是什么?

未定义。 CUDA 对执行顺序不做任何暗示或其他方式的保证。

会是行专业吗?专栏专业..?

仍未定义。

或者每个核心都有自己的“子区域”来处理?

由程序员定义编程模型公开的逻辑线程/块编号方案如何映射到输入数据或内存的特征。

为了确保内存访问是缓存友好的,这个问题很重要。

GPU 具有分层缓存设计,这意味着它实际上并不像您想象的那样重要。有充分记录的编程指南可确保最大的内存吞吐量和缓存利用率。它们不受您问题所暗示的执行顺序的影响。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-12-29
    • 2016-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-22
    相关资源
    最近更新 更多