SSE指令集

SSE指令集的介绍网上一大堆, 这里贴一个用VS2008环境下的SSE测试程序, 分别用C++代码, C++内联汇编, C++的SSE Intrinsics三种方式计算卷积的程序...这是一个win32控制台程序.....


程序下载地址 : http://download.csdn.net/detail/hemmingway/4598506


主文件的代码一览:

// Test_SSE.cpp : 定义控制台应用程序的入口点。
// calc conversion
//#include "stdafx.h"
#include <xmmintrin.h>      // __m128 data type and SSE functions
#include <float.h>
#include <math.h>
#include <Windows.h>		// Support odprintf
#include <stdarg.h>
#include <ctype.h>
#include "MMX_SSESupport.h"
#include "TimeCounter.h"#define ARRAY_SIZE 100000#pragma warning(disable : 4324)// Arrays processed by SSE should have 16 bytes alignment:
__declspec(align(16)) float m_fInitialArray[ARRAY_SIZE];
__declspec(align(16)) float m_fResultArray[ARRAY_SIZE];// minimum and maximum values in the result array
float m_fMin;
float m_fMax;#define TIME_START CTimeCounter* pT = new CTimeCounter()
#define TIME_END   ShowTime(pT->GetExecutionTime())//
//odprintf -- debug function
void __cdecl odprintf(const char* fmt, ...)
{char buf[4096], *p = buf;va_list args;va_start(args, fmt);p += vsnprintf_s(p, sizeof(buf), _TRUNCATE, fmt, args);va_end(args);while ( p > buf  &&  isspace(p[-1]) )*--p = '\0';*p++ = '\r';*p++ = '\n';*p   = '\0';OutputDebugStringA(buf);	//output as ANSI string	//OutputDebugString
}//
// Show execution time (ms)
void ShowTime(__int64 nTime)
{printf("usage time: %I64d\n\n",nTime);		//在g++中对应的是<stdint.h> int64_t, 应该用%lld输出
}//
// ShowArray, display array's data
void ShowArray(float* pArray)
{if ( !(*pArray))return;float* p = pArray;for ( int i = 0; i < ARRAY_SIZE; i += 500 )		//没有显示所有的数据出来{printf("%f  ", p[i]);if (i == 5)printf("\n");}printf("\n\n");
}//
// InitArray, Fill initial array
void InitArray()
{m_fMin = FLT_MAX;m_fMax = FLT_MIN;float f;int i;for ( i = 0; i < ARRAY_SIZE; i++ ){// Fill array with one sin cycle and ensure that all values are positive// (to use sqrt in conversion)f = (float) sin(((double)i * 6.29 / ARRAY_SIZE)) + 2.0f;if ( f < m_fMin )m_fMin = f;if ( f > m_fMax )m_fMax = f;m_fInitialArray[i] = f;}ShowArray(m_fInitialArray);
}//
// Make conversion using C++ code
//
// Each initial array member is converted to result array member
// using some formula (just to demonstrate SSE features).
// Minimum and maximum result values are calculated and shown.
//
// Function also calculates and shows conversion time (ms).
//
void OnCplusplus()
{TIME_START;m_fMin = FLT_MAX;m_fMax = FLT_MIN;int i;for ( i = 0; i < ARRAY_SIZE; i++ ){m_fResultArray[i] = sqrt(m_fInitialArray[i]  * 2.8f);if ( m_fResultArray[i] < m_fMin )m_fMin = m_fResultArray[i];if ( m_fResultArray[i] > m_fMax )m_fMax = m_fResultArray[i];}TIME_END;ShowArray(m_fResultArray);
}//
//OnSseAssembly, Make conversion using C++ code with inline Assembly
void OnSseAssembly()
{TIME_START;float* pIn = m_fInitialArray;float* pOut = m_fResultArray;float f = 2.8f;float flt_min = FLT_MIN;float flt_max = FLT_MAX;__m128 min128;__m128 max128;// using additional registers:// xmm2 - multiplication coefficient// xmm3 - minimum// xmm4 - maximum_asm{movss   xmm2, f                         // xmm2[0] = 2.8shufps  xmm2, xmm2, 0                   // xmm2[1, 2, 3] = xmm2[0]movss   xmm3, flt_max                   // xmm3 = FLT_MAXshufps  xmm3, xmm3, 0                   // xmm3[1, 2, 3] = xmm3[0]movss   xmm4, flt_min                   // xmm4 = FLT_MINshufps  xmm4, xmm4, 0                   // xmm3[1, 2, 3] = xmm3[0]mov         esi, pIn                    // input pointermov         edi, pOut                   // output pointermov         ecx, ARRAY_SIZE/4           // loop counterstart_loop:movaps      xmm1, [esi]                 // xmm1 = [esi]mulps       xmm1, xmm2                  // xmm1 = xmm1 * xmm2sqrtps      xmm1, xmm1                  // xmm1 = sqrt(xmm1)movaps      [edi], xmm1                 // [edi] = xmm1minps       xmm3, xmm1maxps       xmm4, xmm1add         esi, 16add         edi, 16dec         ecxjnz         start_loopmovaps      min128, xmm3movaps      max128, xmm4}// extract minimum and maximum values from min128 and max128union u{__m128 m;float f[4];} x;x.m = min128;m_fMin = min(x.f[0], min(x.f[1], min(x.f[2], x.f[3])));x.m = max128;m_fMax = max(x.f[0], max(x.f[1], max(x.f[2], x.f[3])));TIME_END;ShowArray(m_fResultArray);
}//
// OnSseCpp, Make conversion using C++ code with SSE Intrinsics
void OnSseCpp()
{TIME_START;__m128 coeff = _mm_set_ps1(2.8f);      // coeff[0, 1, 2, 3] = 2.8__m128 tmp;__m128 min128 = _mm_set_ps1(FLT_MAX);  // min128[0, 1, 2, 3] = FLT_MAX__m128 max128 = _mm_set_ps1(FLT_MIN);  // max128[0, 1, 2, 3] = FLT_MIN__m128* pSource = (__m128*) m_fInitialArray;__m128* pDest = (__m128*) m_fResultArray;for ( int i = 0; i < ARRAY_SIZE/4; i++ ){tmp = _mm_mul_ps(*pSource, coeff);      // tmp = *pSource * coeff*pDest = _mm_sqrt_ps(tmp);              // *pDest = sqrt(tmp)min128 =  _mm_min_ps(*pDest, min128);max128 =  _mm_max_ps(*pDest, max128);pSource++;pDest++;}// extract minimum and maximum values from min128 and max128union u{__m128 m;float f[4];} x;x.m = min128;m_fMin = min(x.f[0], min(x.f[1], min(x.f[2], x.f[3])));x.m = max128;m_fMax = max(x.f[0], max(x.f[1], max(x.f[2], x.f[3])));TIME_END;ShowArray(m_fResultArray);
}int _tmain(int argc, _TCHAR* argv[])
{// Test SSE support ?bool bMMX, bSSE;TestFeatures(&bMMX, &bSSE);if ( !bSSE ){// Do not support SSEodprintf("Do not support SSE.\n");return 0;}odprintf("everything is ok...");//first, prepare dataprintf("program generate %d floating point(Not all data are displayed)...\n\n", ARRAY_SIZE);InitArray();//second, Make conversion using C++ codegetchar();printf("Make conversion using C++ code\n\n");OnCplusplus();//third,Make conversion using C++ code with inline Assemblygetchar();printf("Make conversion using C++ code with inline Assembly\n\n");OnSseAssembly();//finally, Make conversion using C++ code with SSE Intrinsics getchar();printf("Make conversion using C++ code with SSE Intrinsics\n\n");OnSseCpp();getchar();return 0;
}



本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/243510.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

书评“世界杯”

昨天晚上&#xff0c;手捧《哈扎尔词典》的米洛拉德帕维奇以1比0敲碎了君特格拉斯的《铁皮鼓》&#xff1b;斯拉沃热齐泽克拎着《伊拉克&#xff1a;借来的壶》2比2浇灭了贝侯赛因奥巴马的《我父亲的梦想》和他《无畏的希望》。 今天早上&#xff0c;0比0&#xff0c;史蒂文杰拉…

VHDL仿真流程

VHDL仿真流程 VHDL测试平台Test Bench的主要功能有4种 例化待验证的模块实体通过VHDL程序的行为描述,为待测模块实体提供激励信号收集待测模块实体的输出结果,必要时将该结果与预置的所期望的理想结果进行比较,并给出报告根据比较结果自动判断模块的内部功能结构是否正确简…

实现ftoa与itoa

/********************************************************************************************* Name : 浮点型转字符* Brief : none* Input : str:字符串指针 num:浮点数 n:精度* Output : none* Return : none***************************************************…

Apache Nuvem将带来更多的开源云?

只要你过去几年没被困在荒岛上出不来&#xff0c;你就不可能不知道人们在云上所花费的巨大心力。无论你是否相信云将成为软件的一个“根本转变”&#xff0c;毋庸置疑的是未来几年将是云的世界。虽然现在谈很多标准还为时尚早&#xff0c;但我们开始看到在安全/识别及基本架构等…

两个C++毫秒级定时器

Win32控制台测试程序如下, 其中完整的程序代码下载是: http://download.csdn.net/detail/hemmingway/4600235 // Test_Time.cpp : 定义控制台应用程序的入口点。 //#include "stdafx.h" #include "Timer.h" #include "TimeCounter.h"#define N 1…

狼行天下:追寻狼迹内蒙生态行第二天(续1)

临近傍晚的乌力亚思太山谷。乱云中的敖包和写有藏经文的旗帜。 我搭的帐篷。别看很小&#xff0c;可以住两个人。 能够睡6个人的巨大的帐篷&#xff0c;需要几个人才可以搭建起来。 夕阳把草原染成了赤金色。 《时尚健康》的三条汉子裹挟了自己的美女。这片草地&#xff0c;这堆…

VHDL子程序

VHDL子程序 VHDL子程序(SUBPROGRAM)是一个VHDL程序模块,这个模块利用顺序语句来定义和完成算法,因此只能使用顺序语句。这一点与进程相似,所不同的是,子程序不能像进程那样可以从本结构体的并行语句或其他进程结构中直接读取信号值或者向信号赋值。 VHDL子程序与其他软件…

stm8因为固定中断向量表地址引发的一系列问题及其处理

转载&#xff1a;https://blog.csdn.net/chen244798611/article/details/51334489 因为之前写个stm32的IAP升级程序&#xff0c;所以我总结了做IAP升级的三个主要的难点&#xff1a; 1、如何设置中断向量&#xff0c;也就是说中断向量的重定向 2、如何配置程序的起始地址 3、…

《北京作家》2010年第2期,总第4期出版

《北京作家》2010年第2期&#xff0c;总第4期出版。 “名家新作”栏目推出的是著名作家张洁的最新短篇小说《一生太长了》&#xff0c;这篇小说最早发表于《人民文学》杂志社&#xff0c;是张洁非常特殊的小说之一。小说以狼为视角&#xff0c;叙述了狼在人类主宰的自然界的生存…

一种数据结构 跳表skiplist

跳表是平衡树的一种替代的数据结构&#xff0c;但是和红黑树不相同的是&#xff0c;跳表对于树的平衡的实现是基于一种随机化的算法的&#xff0c;这样也就是说跳表的插入和删除的工作是比较简单的。 下载地址 : http://download.csdn.net/detail/hemmingway/4625042 测试程…

《曙光与暮色》中的孤独与罪

《你在高原》第八卷《曙光与暮色》的两个主题值得关注。第一是孤独。小说的发展主要有三条线索&#xff1a;宁伽、曲涴、庄周&#xff0c;三条线索虽有内在关联&#xff0c;但都彼此孤立、隔离&#xff0c;甚至是彼此绝缘。小说中人与人之间的关系也是如此&#xff0c;出身、地…

汇编.s文件包含头文件处理

Error[2]: Failed to open #include file ‘FreeRTOSConfig.h’ 解决办法&#xff1a; IAR&#xff0c;在在assembler&#xff08;汇编编译选项&#xff09; 的preprocessor&#xff08;预处理&#xff09;里&#xff0c;填写好 引用的头文件地址

开源代码

我是一个C/C开发者&#xff0c;我收集的代码相关网站也是以C/C为主的&#xff0c;这都是我在开发过程中查找资料时用到或发现的一些网站。现在我把它们列出来&#xff0c;希望对大家有帮助&#xff0c;也希望能够与大家多多交流代码相关的网上资源。所以我在此抛砖了:) 另外声明…

IBM调低DB 2价格,Oracle提高MySQL使用成本

根据The Register公布的一份报告&#xff0c;Oracle取消了MySQL的Basic和Silver级支持。当然&#xff0c;这没有多少损失&#xff0c;在basic级别上&#xff0c;每年只能获得两次支持&#xff0c;而silver级只是增加了一些初级的监控工具。专业人员通常在用生产级数据库中使用的…

数值的表示和运算

数值的表示和运算 一方面,数字的表示格式必须有足够的精度;另一方面,数字的表示格式必须考虑数字的表示方法。 无符号 无符号的VHDL描述 library IEEE; use IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_ARITH.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; entity top is -- …

SOA的未来怎样?

Joe McKendrick在他的新博文中抛出问题&#xff0c;探讨 SOA的未来。\u0026#xD;\n面向服务架构的下一步是什么呢&#xff1f; 许多人看到它与其他方法的融合&#xff0c;因为单独SOA不足以构成商业案例&#xff08;business case&#xff09;——业务要求高效的客户服务&#x…

加速度中的mg/LSB是什么意思

是G-Sensor灵敏度。 range的设置是指sensor所能测量的加速度范围&#xff0c;2g时最多能测到/-2g&#xff0c;4g时最多能测到/-4g&#xff0c;… 而sensor的ADC的位数是固定的&#xff0c;也就是说10位能输出的数字只有-512 ~ 511&#xff0c;不管range如何设置&#xff0c;数字…

Java字节码反编译工具

jd-gui-0.3.3.windows.zip是一个JAVA字节码(.class文件)反编译的工具, 试了一下感觉挺好用的的。下载地址&#xff1a; http://ishare.iask.sina.com.cn/f/22371879.html?fromlike官网http://java.decompiler.free.fr/

小孩与南瓜

九九重阳节。大觉寺。小孩抚摩着南瓜&#xff0c;像夏天挑西瓜。 就是它了。哈哈 妈咪&#xff0c;它怎么会动&#xff0c;瓜里有小动物吗&#xff1f; 妈妈说&#xff1a;这是去年万圣节的南瓜&#xff0c;因为今年的万圣节快到了&#xff0c;在里面睡了一年的小鬼儿醒了呢。