gpt4 book ai didi

c - 使用 ARM neon 内在函数进行深度转换

转载 作者:太空宇宙 更新时间:2023-11-04 01:38:52 27 4
gpt4 key购买 nike

我正在尝试围绕 NEON 内在函数进行思考,并认为我可以从一个示例开始并提出一些问题。

在这个实验中,我想将 32 位 RGB 转换为 16 位 BGR。将以下代码转换为使用 NEON 内在函数的良好开端是什么?我在这里遇到的问题是 16 位与我能看到的任何内在都不匹配。有 16x4 16x8 等。但我只是运气不好,围绕着我需要如何处理这个问题。有什么建议吗?

这是我要转换的代码。

typedef struct {
uint16_t b:5, g:6, r:5;
} _color16;

static int depth_transform_32_to_16_c (VisVideo *dest, VisVideo *src)
{
int x, y;
int w;
int h;

_color16 *dbuf = visual_video_get_pixels (dest);
uint8_t *sbuf = visual_video_get_pixels (src);

uint16x8

int ddiff;
int sdiff;

depth_transform_get_smallest (dest, src, &w, &h);

ddiff = (dest->pitch / dest->bpp) - w;
sdiff = src->pitch - (w * src->bpp);

for (y = 0; y < h; y++) {
for (x = 0; x < w; x++) {
dbuf->b = *(sbuf++) >> 3;
dbuf->g = *(sbuf++) >> 2;
dbuf->r = *(sbuf++) >> 3;

dbuf++;
sbuf++;
}

dbuf += ddiff;
sbuf += sdiff;
}

return VISUAL_OK;
}

编辑:哦,出于某种原因,我正在考虑 16x3 位,但我们正在查看 5,6,5 = 16 位。我意识到我需要轮类。嗯。

最佳答案

NEON 使用 128 位宽寄存器,因此从概念上讲,您要做的是读取 32 位 RGB 的四个像素,对这些像素进行按位运算,并最终写出您的 16 位像素。一种观察是,为了获得最佳性能,您可能希望组合两个 128 位输入(8 个 32 位像素)并产生一个 128 位输出。这将使您的内存访问更有效率。

考虑这一点的另一种方法是,您正在获取内部循环内容并并行处理四个像素。使用你的原始代码有点困难的原因是一些“魔法”被隐藏了,因为你使用的是位域。如果您重写 C 代码以从 32 位工作到 16 位并使用移位/和/或该代码将更自然地转换为 SIMD,您可以想象如何在该上下文中处理多个数据。

如果您只查看每个 32 位组件 -> 16 位转换:

00000000RRRRRRRRGGGGGGGGBBBBBBBB
0000000000000000BBBBBGGGGGGRRRRR

这可以帮助您直观地了解您需要为四个像素并行执行的操作。移动、提取和组合。您可以将其视为 4 个 32 位 channel ,但对于某些位操作,寄存器宽度并不重要(例如,或运算 4 个 32 位寄存器或 8 个 16 位寄存器是相同的)。

粗略的伪代码:

  • 读取( vector 加载)128 位寄存器 = 4 个 32 位像素。
  • 绿色(所有四个分量)移到正确的位位置。
  • 将绿色(使用AND 掩码)屏蔽到另一个寄存器中。 (概念上仍处于 4x32 位“模式”)
  • 红色(所有四个分量)移到正确的位位置。
  • 将红色遮盖到另一个寄存器中。
  • 蓝色移到右位。
  • 将蓝色屏蔽到另一个寄存器中。
  • 将红色和蓝色移动到正确的位位置。
  • 使用按位OR进行组合。
  • 现在您将拥有 4 个 16 位值和 32 位对齐。 (到目前为止,所有概念上仍然是 4x32 位)
  • 重复另一组 4 个像素。
  • 将这两组与 NEON 解压缩 (VUZP) 相结合,生成一个 128 位/8 像素寄存器。
  • 写入( vector 存储)这些像素。

关于c - 使用 ARM neon 内在函数进行深度转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9455700/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com