Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Optimization 快速rgb565到YUV(甚至rgb565到Y)_Optimization_Assembly_X86_Yuv_Blit - Fatal编程技术网

Optimization 快速rgb565到YUV(甚至rgb565到Y)

Optimization 快速rgb565到YUV(甚至rgb565到Y),optimization,assembly,x86,yuv,blit,Optimization,Assembly,X86,Yuv,Blit,我正在做一件事,我想有一个输出选项去视频叠加。有些支持rgb565,如果很好的话,只需跨多个服务器复制数据即可 如果没有,我必须通过转换来复制数据,每次都是一个帧缓冲区。我将尝试一些事情,但我认为这可能是乐观主义者热衷于尝试一些挑战的事情之一 通常支持多种YUV格式,即Y平面后跟交错或单独的UV平面 使用Linux/xv,但在我处理的级别上,它只是字节和x86 我将以质量为代价关注速度,但可能有数百种不同的途径可以尝试。在那里的某个地方有一个平衡点 我看了mmx,但我不确定那里是否有有用的东西。

我正在做一件事,我想有一个输出选项去视频叠加。有些支持rgb565,如果很好的话,只需跨多个服务器复制数据即可

如果没有,我必须通过转换来复制数据,每次都是一个帧缓冲区。我将尝试一些事情,但我认为这可能是乐观主义者热衷于尝试一些挑战的事情之一

通常支持多种YUV格式,即Y平面后跟交错或单独的UV平面

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

我将以质量为代价关注速度,但可能有数百种不同的途径可以尝试。在那里的某个地方有一个平衡点

我看了mmx,但我不确定那里是否有有用的东西。在我看来,没有什么特别适合这项任务,要想把事情安排到正确的位置,需要做大量的调整

尝试Y=Green*0.5+R*0.25+Blue*不多的粗糙版本。就质量而言,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个是很容易做到的,也许是为了一个好处

谁能想出更快更好的办法


有趣的一点是,一个好的编译器是否可以生成类似的代码。

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

关于您现有的代码,我不会为了获得性能而对不同迭代的指令进行交错。所有x86处理器(不包括Atom)的无序引擎和缓存应该能够很好地处理这一问题


编辑:如果需要进行水平添加,可能需要使用
PHADDD
PHADDW
说明。事实上,如果您有《英特尔软件设计师手册》,您应该查找
PH*
说明。它们可能具备您所需要的功能。

一个好的编译器,如果为最感兴趣的CPU变体提供适当的开关进行调优,几乎可以肯定,它比任何普通人都更了解良好的x86指令选择和调度

看一看


如果您想着手优化代码,一个好的策略可能是让编译器为您生成汇编源代码作为起点,然后调整它;在每次更改之前和之后进行概要介绍,以确保您确实使事情变得更好。

我已经了解了MMX和SSE。我在总结中提到了这一点。在这个例子中,我看不到任何特别有用的东西,因为MMX在执行水平操作时受到阻碍。我需要执行的操作是在一个输入源的不同部分上执行不同级别的乘法(或移位)。PMADDWD或多或少是我需要执行的操作,但这需要将数据转换为两个字,以生成双字结果,然后需要提取该结果。我严重怀疑一个坏了的cpu能显著加快这个循环的短版本。我相信PHADDW和类似的指令是SSSE3。这切断了太多的系统。包括我的笔记本电脑。所有好的指令总是遥不可及。这是你对编译器的一种相当大的信心。想试试吗?Y=(rgb565&0x7ff>>4)+(rgb565&0xf800)>>11//晚餐时间,因此可能是错误的:-)在asm中是shr eax,3;shr-al,1;加啊,啊,;加上al,啊,;除部分寄存器外,寄存器的间隔相当紧凑。老实说,我很好奇编译器是否采用相同或更好的方法。(晚饭后我会回来弄清楚格式)太慢了。编辑按钮不见了。让我们尝试设置上述代码的可读性格式
0x7ff>>4)+(rgb565&0xf800)>>11
和(希望是相同的东西asm)
shreax,3;shr-al,1;加啊,啊,;添加al,ah
。好吧,现在也不是太好了:-/