【问题标题】:Optimization of mathematical function in openCLopenCL中数学函数的优化
【发布时间】:2012-04-03 21:59:54
【问题描述】:

我已经开始学习 openCL 编程。作为开始,我正在考虑为以下 3 次多项式编写优化代码:

g(x)= b1(x).f(x)+b2(x).(f(x))^2+b3(x).(f(x)))^3

上面的等式可以简化为:

g(x) = f(x)[b1(x)+f(x)[b2(x)+f(x).b3(x)]]

这在很大程度上减少了乘法的次数。

假设我的 f、b1、b2 和 b3 是大小为 500x500 的矩阵。以下是我认为实现此算法的选项:

  1. 实现一个具有 500x500 个线程的内核,每个线程在一个 矩阵的元素。
  2. 实现一个具有 500 个线程的内核,每个线程操作 500 个元素,即每个线程操作一行。

此外,数组 b1,b2,b3 是常量数组。我读到常量数组可以移动到设备上,并将其保存在本地设备内存中。如果还有其他可能的优化,请分享。

提前致谢

sravan

【问题讨论】:

    标签: optimization opencl mathematical-optimization


    【解决方案1】:

    以下是一些建议:

    1. 将矩阵大小与首选工作组大小对齐 设备(通常 64 项最适合大多数设备,但您 可以在clGetKernelWorkGroupInfo中使用CL_KERNEL_PREFERRED_WORK_GROUP_SIZE_MULTIPLE查询值)。
    2. 每个工作项计算多个元素,以减少开销 - 尽管每个工作项 500 个元素并不理想,因为 1)它是不必要的粗粒度和 2)它限制你只 500 个工作项。
    3. 在内核内部,展开循环遍历元素以在一次迭代中执行至少 4 个元素。
    4. 您绝对应该在设备上保留 b1、b2 和 b3 数组。通常,请尽可能多地保留在设备上。

    有关所有可能优化的完整列表,您应该阅读 OpenCL 设备供应商针对您正在使用的设备提供的优化指南。

    【讨论】:

      【解决方案2】:

      您肯定希望算法受限于计算,而不是内存受限。这里有很多计算要做,所以这应该不是问题。我已经回答了其他几个关于高效内存访问模式的问题。 #1, #2.

      我发现您的建议 2 效果最好——即:让工作组一次计算整行的结果。我通过使用更少的组来扩展这个想法,并在工作完成后让它们移动到其他行。在行的工作结束时为小组使用障碍不会显着降低性能,因为您有足够的工作要做。如果你的记忆是这样排列的,row[i*w+500] === row[(i+1)*w],你可以让你的工作组一次处理两行,避免一点停机时间.

      我认为 500 行的工作量足以让计算单元保持饱和,而不必一次执行两行。在我的平台上,CL_KERNEL_PREFERRED_WORK_GROUP_SIZE_MULTIPLE 是 64;如果使用 64、128 或 256 id 作为工作组大小,则只有 12 个工作项对于该行的最后一次迭代是空闲的。目标是尽可能使用最小的工作组,同时不受内存限制(以及首选工作组大小的倍数)。

      500 个工作组可能太多了。设备上的一些多个(我喜欢使用 1 个)计算单元将运行良好(请参阅:CL_DEVICE_MAX_COMPUTE_UNITS)。如果您有太多组,他们要么等待被安排,要么会因为被换入/换出设备的内核/寄存器而受到影响。

      如果您有足够的内存,您肯定希望将常量数据存储在设备上。即使将输出写入本地内存并在行计算结束时将其复制到全局内存也可能会提高性能。

      【讨论】:

      • 在我的情况下,条件 row[i*w+500] === row[(i+1)*w] 保持良好。虽然我需要编写代码并为代码计时。感谢您的建议。目前我正在尝试在具有 12 个内核的英特尔至强上优化此代码。为了分析性能,我采用了 256x828 大小的数据。我将我的 globalRange 设置为 256,将 localRange 设置为 4,将工作组的数量设置为 64。性能提高了很多。尽管在其他情况下我还没有尝试过。我读到浮点的矢量化可以在性能方面提高很多。你能指点我一些关于那个的好链接吗?谢谢
      猜你喜欢
      • 1970-01-01
      • 2010-09-29
      • 1970-01-01
      • 1970-01-01
      • 2019-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多