【问题标题】:OpenCL - PerformanceOpenCL - 性能
【发布时间】:2017-06-25 09:04:06
【问题描述】:

我正在使用 OpenCL,并且我使用的矩阵会增加其值,并且我需要尽可能短的应用时间。使用 OpenCL 提高性能的最佳方法是什么?我读过一些关于数据并行和任务并行的东西,但我对它们不是很了解。

我正在使用 64x56 矩阵。使用任务并行性,我创建了 64 个内核函数。每列一个内核,但我认为我可以做得更好。

【问题讨论】:

  • 64x56 矩阵的工作量太少,即使它的矩阵乘法也是如此。只为 56 个元素生成新内核的开销太大了。但是如果它们在不同的队列上运行,也许完成仍然比单个队列更快。你用的是单队列吗?
  • 我现在使用 2 个队列,每个队列有 32 个内核。但是使用 2 个队列而不是只使用一个队列的时间会差一些。这个想法是在 CPU 中创建一个矩阵,将其发送到 GPU,将矩阵的每个值增加 1 个单位并将新矩阵返回给 CPU。在这种情况下,我不知道如何减少内核函数。

标签: performance opencl


【解决方案1】:

如果您在 GPU 上执行内核,最好让一个线程处理一项。但是,这取决于您对矩阵元素的具体操作,例如您对它们中的每一个执行了多少操作。 如果只是将元素增加一些数字,可能没有好处。

一般来说有3个选项:

  1. 一个线程处理整个矩阵。这种方式没有并行性,而且对 GPU 不利。
  2. 一个线程处理一个行/列。 -> 使用 64/56 线程,全局工作大小等于 64 或 56。
  3. 一个线程处理单个元素。 -> 使用了 3584 个线程,全局工作大小为 {64, 56}。

您是否尝试过只使用一个处理一个元素的内核,并为其调用 clEnqueueNDRangeKernel,全局工作大小等于 {64, 56}?它如何影响执行时间?

【讨论】:

    猜你喜欢
    • 2014-06-15
    • 2011-12-20
    • 2018-07-08
    • 1970-01-01
    • 2011-11-07
    • 2013-07-27
    • 1970-01-01
    • 2012-02-16
    • 2019-02-21
    相关资源
    最近更新 更多