Performance GPGPU-算术强度和缓存

Performance GPGPU-算术强度和缓存,performance,gpgpu,bandwidth,Performance,Gpgpu,Bandwidth,我正在研究用于科学应用的GPU的理论资料,我发现了这句话: 高运算强度和许多数据元素意味着可以通过计算而不是大数据缓存来隐藏内存访问延迟 这到底是什么意思?可以解释为建议在为GPU编程时避免存储一些预计算的结果,但每次在设备上运行函数时都要计算它们 例如,假设我们有一个执行递归循环的代码来计算一个长数组,其中包含大量的计算。此外,假设我们可以预计算一些部分数组,这将有助于在循环内部跳过一些计算,甚至是一些不太昂贵的计算。根据引文,我们是否应该避免这种情况,而是每个周期计算这些数组?GPU适合于数

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

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

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


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

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


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

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


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

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

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

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


也就是说,您可以使用其他类型的内存。例如,在CUDA中,您可以访问片上内存(共享内存),该内存非常快,延迟非常低。您可以让扭曲中的一个线程计算某些内容,将其存储在共享内存中,然后让其他线程使用该值。因此,您可以将预计算移到GPU,并使用片上内存检索预计算值。

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

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

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


也就是说,您可以使用其他类型的内存。例如,在CUDA中,您可以访问片上内存(共享内存),该内存非常快,延迟非常低。您可以让扭曲中的一个线程计算某些内容,将其存储在共享内存中,然后让其他线程使用该值。因此,您将预计算移动到GPU,并使用片上内存检索预计算的值。

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

当然,要使其工作,您需要进行大量的计算才能在两者之间切换。但是,由于数据传输是