【问题标题】:Ideal Global/Local Work Group Sizes (OpenCL)理想的全球/本地工作组规模 (OpenCL)
【发布时间】:2013-04-09 21:15:10
【问题描述】:

我正在尝试为 NVIDIA GeForce 9800 GT 显卡优化 OpenCL 矩阵乘法程序。我将两个 512x512 矩阵相乘,但我不确定我应该使用什么样的全局和本地工作组大小。谁能指出我正确的方向?

【问题讨论】:

  • 理想情况下,全局大小应该尽可能高,只要您不需要中断计算来添加或修改输入,如果是这样,那么使用尽可能大的全局大小不会出现收益递减根据您的需要。尽管在实践中,如果您使用的是 GPU,它们中的大多数还不支持任务并发,因此运行您的内核的 GPU 只能做到这一点。因此,如果您将其用作主显卡,您的屏幕将冻结。至于本地工作大小,取决于内核和设备,你可以让OpenCL尝试优化它(查找clGetKernelWorkGroupInfo)
  • 请记住,Nvidia GPU 将线程分组为 32 个线程的组(一个扭曲),因此对于合并的内存访问,您希望本地工作组大小的一维是 32 的倍数.

标签: opencl gpgpu matrix-multiplication


【解决方案1】:

如果您需要最佳性能,请使用各种本地工作组规模对其进行基准测试,然后使用最好的一个。您可能会惊讶地发现,最快的并不总是与实施提供者给出的指导相匹配!

【讨论】:

    【解决方案2】:

    由于5122 的幂,您可以尝试以下尺寸:

    size_t global_work_size[2] = {512, 512};
    size_t  local_work_size[2] = {2^p, 2^n};
    

    在哪里:

    • (2^m + 2^n) % 32 = 0: 32 必须是您的线程数除数,因为包裹将包含32 线程

    • 需要2的幂,因为本地工作规模必须是全局工作规模的除数

    • 大小为512,当然不会有问题,但你要考虑CL_DEVICE_MAX_WORK_GROUP_SIZE(由clGetDeviceInfo()给出)参数。对于更大的矩阵,您将不得不使用超过 2 的维度。

    • 维数本身受限于CL_DEVICE_MAX_WORK_ITEM_DIMENSIONS...

    确实,最佳选择取决于算法,并且取决于您打算执行的矩阵乘法类型。

    【讨论】:

      【解决方案3】:

      同意 Dithermaster,我想补充一点,峰值性能高度依赖于平台,如果 GPU 不是相同的型号/代,即使来自同一供应商的 GPU 也可能具有不同的最佳工作组大小。

      要获得最佳性能,您确实需要在目标平台上进行实验(执行前训练)并找到最佳配置。请记住,不仅工作组的规模,而且工作组的形状都会显着影响绩效。话虽如此,您确实需要尝试以下所有组合。假设内核的最大工作组大小为 1024,这意味着对于二维工作组,您可以有以下组合:(1, 1024), (2, 512), (4, 256), (8, 128), (16, 64), (32, 32), (64, 16), (128, 8), (256, 4), (512, 2) 和 (1024, 1)。

      注意 (1, 1024) 和 (1024, 1) 可能会导致完全不同的性能,这是由于内存架构、缓存架构和波形调度方式等原因。

      是的,当然,您还需要考虑 wave/warp 大小以及合并的内存访问。在这里,我只是在谈论一般的 OpenCL 工作负载,尤其是当工作负载不显示任何结构模式时,最好尝试尽可能多的组合以确保您不会遗漏任何内容。

      【讨论】:

      • 没错。事实上,通常最快的大小不是最大大小(基于寄存器文件大小),所以像 (8,16)、(32,4) 这样的大小以及 WIDTH * HEIGHT
      猜你喜欢
      • 2017-01-01
      • 2011-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-27
      • 2015-01-20
      • 1970-01-01
      相关资源
      最近更新 更多