1

我正在研究用于科学应用的 GPU 的理论知识,我发现了这句话:

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

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

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

4

3 回答 3

1

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

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

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

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

于 2013-02-03T19:09:14.620 回答
0

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

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

于 2013-02-03T18:21:29.013 回答
0

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

为此,您当然需要大量计算才能在两者之间进行切换。但是,由于数据传输比实际计算中使用的数据慢,因此您需要比数据加载更多的计算才能发生这种隐藏。这就是计算强度的定义:每个字节/字/数字加载的操作比率很高。

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

于 2013-07-10T17:11:26.923 回答