GPGPU - 算术强度和缓存

时间:2013-01-28 00:14:26

标签: performance gpgpu bandwidth

我正在研究用于科学应用的GPU的理论资料,我找到了这句话:

  

高算术强度和许多数据元素意味着可以通过计算而不是大数据缓存来隐藏内存访问延迟。

这到底是什么意思?可以解释为避免在为GPU编程时存储一些预先计算的结果,但每次在设备上运行函数时计算它们的建议吗?

,例如,假设我们有一个代码执行递归循环以计算长数组,其中包含大量计算。此外,假设我们可以预先计算一些部分数组,这些数组有助于循环内部跳过一些计算,甚至一些不是非常昂贵的计算。根据引用,我们应该避免这种情况,但是每个周期计算这些数组吗?

3 个答案:

答案 0 :(得分:1)

GPU可以访问不同类型的内存。用于提供GPU数据的内存类型以及在完成计算时从GPU检索的数据是全局内存(例如,标准GTX480具有1.5GB内存)。

此内存具有高带宽,但也具有高延迟(GTX480上大约400-800个周期)。因此,如果您在GPU上进行计算,则最好不要预先计算,将其存储在全局内存中,然后检索它(导致高延迟)。这样,您就不必等待内存来检索预先计算的数据。

如果在给定时间(= warp)处于活动状态的所有线程,则会导致高延迟,因为这些线程无法前进,因为数据尚未到达。 GPU可以在400-800个周期内进行相当多的计算,因此交换内存提取计算效果会更好。

话虽这么说,您可以使用其他类型的内存。例如,在CUDA中,您可以访问片上存储器(共享存储器),这种存储器非常快并且具有非常低的延迟。你可以在warp中有一个线程计算一些东西,将它存储在共享内存中,让其他线程使用该值。因此,您将预先计算移动到GPU,并使用片上内存来检索预先计算的值。

答案 1 :(得分:0)

GPU适用于数据并行计算。换句话说,相同的指令但在不同的数据集上。在每个周期,GPU运行一组有限的线程。但是在这种情况下,一组线程(32个线程= warp)执行加载/存储操作,这将需要访问全局内存并因此产生延迟,另一组线程可以在前一组等待其数据时执行。因此,关键词许多数据元素。 GPU上的延迟容限是通过使用许多线程来完成的,这样在长延迟操作的情况下,可以执行另一批线程。

但是,我不认为它暗示如果将预先计算的结果存储在GPU中,如果它们将用于其他计算。在矩阵乘法的情况下,其中乘积矩阵中的元素共享公共操作数,当这些操作数存储在共享存储器中时会有性能提升,因为它是每个多处理器。

答案 2 :(得分:0)

延迟隐藏是一种概念,您可以隐藏正在进行的计算活动后面的数据加载:您将来发出一个您需要的数据请求,当您等待它时,您会计算其他内容。 CUDA可以轻松隐藏延迟,因为它可以在线程之间快速切换。因此,一个线程发出数据请求,它阻止等待该数据,但核心可以立即切换到另一个拥有其数据的线程的执行。

为了实现这一目标,您需要进行大量的计算才能切换。但是,由于数据传输比实际计算中使用的数据慢,因此需要更多的计算而不是数据加载才能进行此隐藏。这就是计算强度的定义:每个字节/字/加载数量的操作比率很高。

我不认为这与预计算有任何关系,尽管你可以通过重新计算某些部分结果(来自本地仍然可用的数据)来考虑算术强度的上限,如果这样可以从较慢的内存中节省一些数据加载。