1

我正在做一个我想要输出选项以转到视频叠加层的东西。有些支持rgb565,如果这么甜,只需将数据复制过来。

如果不是,我必须通过转换复制数据,并且一次是一个帧缓冲区。我将尝试一些事情,但我认为这可能是优化者热衷于尝试挑战的事情之一。

通常最容易支持的各种 YUV 格式是 Y 平面,然后是交错的或单独的 UV 平面。

使用 Linux / xv,但在我处理的级别上,它只是字节和 x86。

我将以质量为代价专注于速度,但可能有数百种不同的路径可供尝试。那里有一个平衡点。

我查看了 mmx 但我不确定那里是否有任何有用的东西。没有什么让我觉得特别适合这项任务,而且要将事情放到寄存器中的正确位置需要大量的洗牌。

尝试使用 Y = Green*0.5 + R*0.25 + Blue*notmuch 的粗略版本。U 和 V 在质量方面更不值得关注。你可以在这些频道上逃脱谋杀。

对于一个简单的循环。

loop:
movzx eax,[esi]
add esi,2
shr eax,3
shr al,1
add ah,ah
add al,ah
mov [edi],al
add edi,1
dec count
jnz loop

当然,每条指令都取决于之前的指令,而单词读取并不是最好的,因此交错两条指令可能会有所收获

loop: 
mov eax,[esi]
add esi,4
mov ebx,eax
shr eax,3
shr ebx,19
add ah,ah
add bh,bh
add al,ah
add bl,bh
mov ah,bl
mov [edi],ax
add edi,2
dec count
jnz loop

一次用 4 个就很容易做到这一点,也许是为了一个好处。

任何人都可以想出更快更好的东西吗?

一个有趣的方面是一个像样的编译器是否可以产生类似的代码。

4

2 回答 2

1

一个体面的编译器,考虑到适当的开关来调整最感兴趣的 CPU 变体,几乎可以肯定比任何普通人都更了解良好的 x86 指令选择和调度!

看看英特尔(R) 64 和 IA-32 架构优化参考手册...

如果您想手动优化代码,一个好的策略可能是让编译器为您生成汇编源代码作为起点,然后对其进行调整;每次更改之前和之后的配置文件,以确保您实际上使事情变得更好。

于 2010-01-14T01:52:40.613 回答
1

我认为你真正想看的是使用 MMX 或整数 SSE 指令。这将让您一次处理几个像素。我想如果你指定正确的开关,你的编译器将能够生成这样的代码,特别是如果你的代码写得很好。

关于您现有的代码,我不会为不同迭代的交错指令而烦恼以获得性能。所有 x86 处理器(不包括 Atom)的乱序引擎和缓存应该可以很好地处理这个问题。

编辑: 如果您需要进行水平添加,您可能需要使用PHADDDandPHADDW说明。事实上,如果您有英特尔软件设计师手册,您应该查找PH*说明。他们可能有你需要的东西。

于 2010-01-13T21:11:37.883 回答