【发布时间】:2015-09-11 04:24:12
【问题描述】:
我是 OpenCL 的新手,我想以最有效的方式编写我的程序。
在我的程序中,我读取了一个浮点数组并生成了一个浮点数组作为结果。我的问题是:
将我的计算答案写入与我获得输入相同的缓冲区是否有任何问题导致效率低下?如:
c[i] = c[i]*2;
其中 c 是全局内存中的浮点数组。 通过将上述内容更改为:
d[i] = c[i]*2;
其中 c 和 d 都是内存中的浮点数组。
【问题讨论】:
我是 OpenCL 的新手,我想以最有效的方式编写我的程序。
在我的程序中,我读取了一个浮点数组并生成了一个浮点数组作为结果。我的问题是:
将我的计算答案写入与我获得输入相同的缓冲区是否有任何问题导致效率低下?如:
c[i] = c[i]*2;
其中 c 是全局内存中的浮点数组。 通过将上述内容更改为:
d[i] = c[i]*2;
其中 c 和 d 都是内存中的浮点数组。
【问题讨论】:
取决于用途:
__global
^ __global
| ^ __constant
| | ^ ^ __local
| | | | ^ __private
| | | | | ^
d[i] = c[i] + b[0] + b[1] + a[0....j] + e[0...16]
(few times) (few per thread) (10-1M times per item per thread)
write read read only random access max reusage
72 GB/s 102 GB/s 819 GB/s 4915 GB/s
paralleled broadcasted parallel/broadcasted free to use
2GB/GPU 64 kB/GPU 64 kB / Block 256kB/ Block
规格以 AMD Verde PRO 为例。
如果您正在使用的是移动设备,则可能只有一个 __global。其他说明符可能会被解释为另一个 __global,因此可能会降低性能。
【讨论】:
这是可能的,具体取决于设备和编译器。在某些设备上,编译器可能会假设它可以在输入上使用只读缓存并生成适当的指令来执行此操作。这可以为您提供相邻读取的位置。如果您对读取和写入使用相同的数组,编译器会发现这一点,假设数组 c 是可读写的并禁用缓存。另一方面,您的示例中没有时间重用,因此无论如何您可能从缓存中受益甚少。
不过,我认为实际上您必须进行实验。支持 OpenCL 的硬件有很多变化。
【讨论】:
理论上,在某些情况下您可能会得到一些改进,因为数组属性可以帮助硬件做出更好的决策和更好的管道。
在实际实践中,我怀疑任何当前的硬件都会产生更好的结果。它们应该是 1:1。
如果您在学术上对此感兴趣,那么值得尝试并获得一些证据。但是如果你在写一段代码,HW会并行IO/计算,IO时间可以忽略不计(除非操作量很小,在这种情况下你不应该使用CL)。
【讨论】: