Performance 为什么期望float4在前缀和中执行浮点运算

Performance 为什么期望float4在前缀和中执行浮点运算,performance,opencl,gpu,Performance,Opencl,Gpu,在OpenCL中,Matthew Scarpino评论说,将其前缀和从32位浮点值转换为4个浮点值的128位集合可以显著提高性能,几乎快4倍 当您运行Ch10/Reduce应用程序时,它将执行 减少标量和减少向量核。除了检查 结果,它测量每个内核执行所花费的时间。在…上 在我的系统中,结果如下: 减少标量:检查通过。总时间=489031 还原向量:检查通过。总时间=136157 GPU Gems也提出了类似的说法,它引用了一个似乎来自某个班级的课程项目,而该课程项目已不再可用 我们采用了Dav

在OpenCL中,Matthew Scarpino评论说,将其前缀和从32位浮点值转换为4个浮点值的128位集合可以显著提高性能,几乎快4倍

当您运行Ch10/Reduce应用程序时,它将执行 减少标量和减少向量核。除了检查 结果,它测量每个内核执行所花费的时间。在…上 在我的系统中,结果如下:

减少标量:检查通过。总时间=489031

还原向量:检查通过。总时间=136157

GPU Gems也提出了类似的说法,它引用了一个似乎来自某个班级的课程项目,而该课程项目已不再可用

我们采用了David Lichterman建议的一种技术,它可以处理 每个线程八个元素,而不是通过加载两个 每个线程浮动4个元素,而不是两个浮动 元素(Lichterman 2007)

一种解释是,每个线程的内存请求会增加,但这对我来说没有意义,因为我希望发出的内存请求总数相同,可能会导致相同的总体性能

或者,每个warp发出一个请求,然后进入睡眠状态。在
float4
情况下,它会被4倍多的数据唤醒,但在
float
情况下,数据不会被缓存,因此后续线程也需要进入睡眠状态并等待新数据。另一方面我希望当经线中的线被唤醒时,记忆会流淌


我想知道一些专家是否可以插话,并提供一个连续的解释,解释为什么
float4
在内存访问或计算方面要比
float
快得多。一个是更有效地利用内存带宽,另一个是改进计算与内存事务的比率,从而改进延迟隐藏

为了阐明内存带宽方面,例如考虑NVIDIA GPU的情况:硬件被设计为它可以在一个事务中提供128字节(从128字节对齐段)到一个扭曲;对于具有一级缓存(缓存线为128字节)的体系结构和没有缓存的较旧体系结构,都是如此。因此,当使用

float
s插入更广泛的数据类型时,您无缘无故地使用了最多一半的可用带宽

因此,只要从
float
切换到
float2
,带宽就会增加一倍,因为相同数量的内存事务将加载两倍的数据。此外,对于每个事务,工作项现在将有两倍的数据要处理:这使得隐藏加载延迟变得更容易(只需使用
float
s,您就需要一半的工作项)

float2
float4
的改进幅度要小得多,但通常仍会看到一些改进。这是因为GPU设计用于加载工作项的128位数据(考虑4个投影坐标或4个颜色分量(RGBA))。就硬件而言,这并不比加载64位数据更有效(通常需要两倍的事务才能实际提供
float4
s,而不需要提供
float2
s)。然而,硬件设计用于通过一条指令来执行128位数据的加载(这将导致幕后的两个事务)。这是更有效的,尤其是在循环中,因为它会导致更少的循环迭代来处理相同数量的数据(请记住,在循环中,下一个加载指令取决于上一个索引的增加,因此您可以有效地摆脱一对相关指令。)


请注意,继续使用
float8
float16
不会进一步改进,因为硬件不是为这些数据类型(在GPU上)设计的,事实上,这些类型的负载通常会破坏合并或恶化缓存线的使用,从而导致性能下降。

这里实际上有两件事在起作用。一个是更有效地利用内存带宽,另一个是改进计算与内存事务的比率,从而改进延迟隐藏

为了阐明内存带宽方面,例如考虑NVIDIA GPU的情况:硬件被设计为它可以在一个事务中提供128字节(从128字节对齐段)到一个扭曲;对于具有一级缓存(缓存线为128字节)的体系结构和没有缓存的较旧体系结构,都是如此。因此,当使用

float
s插入更广泛的数据类型时,您无缘无故地使用了最多一半的可用带宽

因此,只要从
float
切换到
float2
,带宽就会增加一倍,因为相同数量的内存事务将加载两倍的数据。此外,对于每个事务,工作项现在将有两倍的数据要处理:这使得隐藏加载延迟变得更容易(只需使用
float
s,您就需要一半的工作项)

float2
float4
的改进幅度要小得多,但通常仍会看到一些改进。这是因为GPU设计用于加载工作项的128位数据(考虑4个投影坐标或4个颜色分量(RGBA))。就硬件而言,这并不比加载64位数据更有效(通常需要两倍的事务才能实际提供
float4
s,而不需要提供
float2
s)。然而,硬件设计用于通过一条指令来执行128位数据的加载(这将导致幕后的两个事务)。这是更有效的,尤其是在循环中,因为它会导致更少的循环迭代来处理相同的amou