Optimization OpenCL优化和明显的PCI总线限制?

Optimization OpenCL优化和明显的PCI总线限制?,optimization,opencl,jogl,Optimization,Opencl,Jogl,我正在使用JOGL/openCL编写一个程序来利用GPU。我有一段代码,当我们处理数据大小时,它会检测GPU上的可用内存。如果GPU上的内存不足,无法一次处理整个计算,它会将该过程分解为具有X个帧数的子过程,该子过程使用的内存少于最大GPU全局内存来存储 我曾期望使用X的最大可能值可以通过最小化所使用的内核数量来获得最大的速度。相反,我发现使用较小的组(X/2或X/4)可以提高速度。我试图弄明白为什么将GPU处理分成更小的组,而不是让GPU处理一次能处理的最大数量,可以提高速度;以及我如何优化以

我正在使用JOGL/openCL编写一个程序来利用GPU。我有一段代码,当我们处理数据大小时,它会检测GPU上的可用内存。如果GPU上的内存不足,无法一次处理整个计算,它会将该过程分解为具有X个帧数的子过程,该子过程使用的内存少于最大GPU全局内存来存储

我曾期望使用X的最大可能值可以通过最小化所使用的内核数量来获得最大的速度。相反,我发现使用较小的组(X/2或X/4)可以提高速度。我试图弄明白为什么将GPU处理分成更小的组,而不是让GPU处理一次能处理的最大数量,可以提高速度;以及我如何优化以找出X的最佳值


我目前的测试是在一个GPU内核上运行的,该内核使用很少的处理能力(两个内核都通过选择输入的一部分并返回它来减少输出),但是,我相当确定,当我激活所有内核时,会出现相同的效果,这些内核在返回之前对值进行更大程度的处理。

简单的答案是,这很复杂。有许多因素在起作用。这些包括(但不限于):

  • 您正在使用的本地内存量
  • 您正在使用的私有内存量
  • 对对称多处理器一次能够处理的最大工作组数的限制
  • 超出寄存器限制,导致内存访问速度减慢
  • 还有更多
  • 我建议您查看以下链接:

    特别是,请查看第5.3节。SM资源的动态分区。本文本旨在用于一般用途,但使用CUDA作为示例。然而,这些概念仍然同样适用于OpenCL

    本文摘自以下书籍:


    不管它值多少钱,我发现这本书内容丰富。它将使您对硬件有更深入的了解,使您能够回答这样的问题。

    PCI-e是全双工双向的。我想这意味着你可以边读边写。在这种情况下,如果处理很少,可能会看到收益,因为读写重叠

    考虑总尺寸为N。在一个工作单元中,您可以:

    • 过程N
    • 阅读
    与以下各项成比例的总时间:过程N,传输2N

    如果使用并行读/写将其一分为二,则可以得到:

    • 写N/2
    • 工序编号2
    • 读N/2,写N/2
    • 工序编号2
    • 阅读N/2

    总时间与成比例:进程N,转移3N/2(节省N/2转移时间)

    只是为了检查我的理解-你是说当你将任务分割成更多的顺序作业时,它工作得更快?所以你使用的是更小的作业,但不是并行提交。是的,我正在做更多的顺序作业。我还使用了两个非常简单的内核(既有抽取数据,也没有其他内容)作为测试。似乎大多数更复杂的优化都不适用于这样一个不使用本地内存、多寄存器等的简单内核。我对这本书没有任何评论,但关于内存访问的解释听起来对我来说是对的。通过保持工作的小型化,你必须更有效地利用有限的资源。只是更新。我认为问题可能在于凝聚。我通过获取第X个元素并将其放置在一个新的收缩数组中来减少数组。我认为内存访问模式阻止了数据的聚合,并伤害了我。我只是不确定我会不会因为不好的内存使用而得到如此剧烈的减速。一旦这个缩减内核启动,我在同一个处理批上以GPU一半的速度运行;这意味着一个主要的减速是由它引起的。如果我不能修复它,我将不得不将处理移到cpub,但为什么这取决于数据量?