【问题标题】:OpenCL Index operations: algorithmic vs constant index bufferOpenCL 索引操作:算法与常量索引缓冲区
【发布时间】:2013-08-20 04:55:43
【问题描述】:

所以我正在使用 Aparapi(从 Java 代码生成 OpenCL)编写一个神经网络库。 无论如何,在进行前向传播和反向传播时,我需要执行复杂的索引操作以找到给定权重的源/目标节点。

在很多情况下这是非常简单的 1D 到 2D 公式,但在某些情况下,例如对于卷积网络,我需要做一些更复杂的操作来找到索引(通常类似于 3D 到 1D 到 3D)。

我一直坚持使用算法来计算这些索引。另一种方法是将每个权重的源索引和目标索引简单地存储在一个常量 int 数组中。我已经避免了这种情况,因为这几乎会使内存存储量增加一倍。

我想知道计算索引与从常量数组​​中读取索引的速度差异是多少?我是在失去速度来换取记忆吗?差异显着吗?

【问题讨论】:

  • 您是否尝试过对其进行基准测试?内存访问速度和延迟因设备而异,尤其是在 GPU 和 CPU 之间,因此它实际上取决于您的硬件、您的特定算法等。
  • 如果索引像 a[gid*3+x*15],跨步可以停止使用一些内存库,计算索引在这件事附近不会是个问题。
  • @Thomas:我没有使用恒定索引缓冲区对其进行测试,但我正在尝试将软件设计为相当便携,因此我更感兴趣的是一般性能而不是硬件性能。
  • 尽管如此,我正在设计它以在 GPU/APU 上使用
  • 如果我要使用索引缓冲区,它必须看起来像这样:`float[] nodes;浮动[]权重;整数输入每节点; int[] weightSrc; fwd() { 浮点数 = 0; int i0 = gid() * inputsPerNode; for(int i = 0; i

标签: performance indexing opencl neural-network aparapi


【解决方案1】:

在 GPU 上进行相同操作(如查找表)的计算几乎总是比全局内存访问更快。特别是,由于 GPU 保持如此多的内核“处于运行状态”,所以当它等待来自前一个内核插槽的 I/O 时,就会发生数学运算。所以如果你的数学不是太复杂,宁愿做它而不是烧掉一个全局内存访问。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-01
    • 1970-01-01
    • 2016-03-05
    • 2011-02-11
    • 1970-01-01
    • 2013-01-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多