float4 -乘-添加性能提示

float4 - multiply-add - performance tips OpenCL

本文关键字:提示 性能 float4 添加      更新时间:2023-10-16

我正在使用图像处理应用程序,仅使用灰度图像- GPU占用受限于每个工作组矢量寄存器和每个工作组本地内存数量的增加。

read_imagef()函数返回float4,但是我的应用程序只使用float4 - 的第一个三个组件,因此每次计算(因此增加执行时间)。 然而,内核对float4执行许多乘法加操作。

我如何优化这个内核,使它使用更少的矢量寄存器,如果有提示技巧来增加MAD ops速度(知道我已经尝试了硬件支持的功能和性能下降)。

如果你只使用灰度图像,你可以实现你自己的'read_imagef()',它只读取图像的一个通道,这样你处理的一切都是float


因为您的数据可能在内存中作为RGBRGB...交错。仅加载R通道可能与加载所有通道花费相同的时间。它是struct情境数组。你可以在这里找到更多细节。

Structure of Arrays vs . Array of Structures in cuda

给定数据布局,您可以加载float4/float3,从中提取float的一个通道,然后对提取的float进行计算。

内核在float4

上执行许多乘法加操作

我不明白为什么你的内核必须在float4上做这些操作。也许你想展示一些代码来演示。

如果它返回float4,并且如果它在与float3相同数量的内存操作中完成,那么它将具有相同的延迟。mad操作的延迟比内存操作要短得多。

据我所知,没有float3硬件,所以如果是标量微架构(如新的gpu),您可以逐个计算3个元素。如果它是vliw-4,那么它将同时使用第4个元素,无论是否使用,它将具有相同的速度

很难在这里具体说明,因为它取决于它是什么硬件以及您对图像内容所做的操作-您可能最好将图像处理为字节的普通缓冲区(使用您自己的浮点数转换,但这有增加更多CL代码的风险,并减少使用纹理单元在GPU中为您进行转换,假设有HW为此)。

另一种选择是执行四个readimage_f调用,并将值"合并"到一个float4中,进行数学计算,并拆分结果。

不幸的是,尽管OpenCL是"可移植的",但它并不是"具有已知性能的可移植的",所以在一个OpenCL实现中工作良好的东西,可能在另一个OpenCL实现中不起作用,并且为了性能而调整/调整算法需要对整个体系结构有很好的理解。