android - 如何在 ARM NEON 中将 uint8x8_t 加载到 float32x4?

标签 android c optimization arm neon

我正在研究一种图像处理算法,并且正在研究使用 NEON 对其进行优化。 该算法包括将每个(RGBA,8 位)像素乘以某个权重,进行一些加法运算,最后转换回 uint8_t 值。 我遇到的第一个问题是如何有效地加载单个 uint8_t 像素并将其转换为 NEON 的 float32x4_t。我已经在引用资料中搜索了合适的转换,但找不到合适的,所以我求助于这个丑陋的代码:

const uint8_t* psrc = ...; // pointer to image data
float rgba[4];
for (int c = 0; c < 4; ++c) {
  rgba[c] = *psrc++;
}
float32x4_t srcpix = vld1q_f32(rgba);

有人可以为此建议一种“更清洁”的方法吗?

编辑: 所以我想出了这个,仍然觉得很麻烦:

uint8x8_t srcu8 = vld1_u8(psrc);
uint16x8_t srcu16x8 = vmovl_u8(srcu8);
uint16x4_t srcu16x4 = vget_low_u16(srcu16x8);
uint32x4_t srcu32x4 = vmovl_u16(srcu16x4);
srcpix = vcvtq_f32_u32(srcu32x4);

最佳答案

所以您想将它们转换为 float 以进行某些算术运算并将结果转换回 int?这与人们所说的优化恰恰相反。

坚持使用 NEON 真正闪耀的定点算法。

我很难想象在任何情况下转换为 float 对于处理每个 channel 只有 8 位大小(和精度)的 ARGB 格式是有意义的。

显然,您试图让 NEON 来回转换,而浮点运算由 ARM 完成,但这完全是错误的利用 NEON 的方法。

适当的 NEON 优化功能应让 NEON 自行处理数据加载、算法和数据存储。正确完成后,我确信 NEON 版本的运行速度将比当前版本快 20 倍以上,接近 memcpy 的速度。 - NEON 在定点运算方面非常强大。

请透露更多信息你正在尝试做什么。也许我可以提供帮助。

关于android - 如何在 ARM NEON 中将 uint8x8_t 加载到 float32x4?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17197079/

相关文章:

android - 如何在 android 中进行 robotium 测试时从项目中打开另一个项目

c - 我无法理解以下 while 循环的条件

c - 在固定不同 CPU 的 2 个线程之间传递一些变量的最佳方式

c++ - 如果 C++ 中有 for 循环,是否可以将方法声明为内联方法

c# - 获取谷歌广告 ID 并限制广告

java - 如果我可以将任何东西放置在我想要的地方,如何创建布局?

android - 提高 Canvas.drawBitmap() 在 android 上的性能

mysql - 如何优化查询?我能读懂什么? (如果可以的话,用俄语,或英语)

android - 使动画像滑动时换页一样

c - 如何标记 SSA