float4 -乘-添加性能提示
float4 - multiply-add - performance tips OpenCL
我正在使用图像处理应用程序,仅使用灰度图像- 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实现中不起作用,并且为了性能而调整/调整算法需要对整个体系结构有很好的理解。
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- OpenMP阵列性能较差
- 递归列出所有目录中的C++与Python与Ruby的性能
- 大小相等但成员数量不同的结构之间的性能差异
- 为什么constexpr的性能比正常表达式差
- 在类中使用随机生成器时出现性能问题
- 在main()之外初始化std::vector会导致性能下降(多线程)
- 有没有办法提示用户使用哪种数据类型作为模板 c++
- 海湾合作委员会 ARM 性能下降
- GCC 和 Clang 代码性能的巨大差异
- 在容量内调整矢量大小时的性能影响
- 了解算法的性能差异(如果以不同的编程语言实现)
- 未达到的情况会影响开关外壳性能
- 如何使用递归循环我的代码(当用户输入无效输入时,它会再次提示他们)?
- QStringList vs list<shared_ptr<QString>> 性能比较C++
- 是否总是可以将使用递归编写的程序重写为不使用递归的程序C++,性能观点是什么?
- 哪种方法更好,性能明智
- Opengl 2D性能提示
- 是否有使用可能/不可能提示的性能测试结果
- float4 -乘-添加性能提示