盾怪网教程:是一个免费提供流行杀毒软件教程、在线学习分享的学习平台!

基于MMX指令集的程序设计简介

时间:2024/12/18作者:未知来源:盾怪网教程人气:

[摘要]= b; // 在一次循环中处理8个象素 int nNumberOfLoops = nNumberOfPixels / 8; __m64* pIn = (__m64*) p...
= b;
    }

    // 在一次循环中处理8个象素
    int nNumberOfLoops = nNumberOfPixels / 8;

    __m64* pIn = (__m64*) pSource;          // 输入的字节数组
    __m64* pOut = (__m64*) pDest;           // 输出的字节数组

    __m64 tmp;                              // 临时工作变量


    _mm_empty();                            // 执行MMX指令:emms

    __m64 nChange64 = Get_m64(c);

    if ( nChange > 0 )
    {
        for ( i = 0; i < nNumberOfLoops; i++ )
        {
            tmp = _mm_adds_pu8(*pIn, nChange64); //  饱和模式下的无符号加法
                                                 // 对每一个字节执行操作:tmp = *pIn + nChange64

            *pOut = tmp;

            pIn++;                               // 取下面8个象素
            pOut++;
        }
    }
    else
    {
        for ( i = 0; i < nNumberOfLoops; i++ )
        {
            tmp = _mm_subs_pu8(*pIn, nChange64); //  饱和模式下的无符号减法
                                                 // 对每一个字节执行操作:tmp = *pIn - nChange64

            *pOut = tmp;

            pIn++;                                      //取下面8个象素
            pOut++;
        }
    }

    _mm_empty();                            // 执行MMX指令:emms
}


注意参数nChange的符号每次调用函数时在循环体外只检查一次,而不是放在循环体内,那样会被检查成千上万次。下面是在我的计算机上处理图象花费的时间:

纯C++代码      49毫秒
使用C++的MMX指令函数的代码 26毫秒
使用MMX汇编指令的代码   26毫秒


MMX32 演示项目

MMX32项目可对32位象素的RGB图象进行处理。进行的图象处理工作是图象颜色反相操作和更改图象颜色的平衡度(将象素点的每一种颜色乘以一定的值)操作。

MMX的乘法实现起来比加减法复杂得多,因为乘法运算通常得出的结果的位数不再是以前位数的大小。比如,如果乘法的操作数有一个字节(8位的BYTE)大小,那么结果会达到一个字(16位的WORD)大小。这需要额外的转换,并且使用MMX汇编指令和C++代码进行图象转换花费时间的差别不是很大(时间差为5-10%)。

用Visual C++.NET的MMX指令函数实现的更改图象颜色平衡度的函数:

void CImg32Operations::ColorsC_MMX(
    BYTE* pSource,
    BYTE* pDest,
    int nNumberOfPixels,
    float fRedCoefficient,
    float fGreenCoefficient,
    float fBlueCoefficient)
{
    int nRed = (int)(fRedCoefficient * 256.0f);
    int nGreen = (int)(fGreenCoefficient * 256.0f);
    int nBlue = (int)(fBlueCoefficient * 256.0f);

    // 设置相乘系数
    __int64 c = 0;
    c = nRed;
    c = c << 16;
    c

关键词:基于MMX指令集的程序设计简介




Copyright © 2012-2018 盾怪网教程(http://www.dunguai.com) .All Rights Reserved 网站地图 友情链接

免责声明:本站资源均来自互联网收集 如有侵犯到您利益的地方请及时联系管理删除,敬请见谅!

QQ:1006262270   邮箱:kfyvi376850063@126.com   手机版