SSE指令集(1)-基础篇

最近根据开发任务安排了对C++的代码用SSE指令优化的计划,自己在这方面完全是新手,所以只能从0开始,一步步学习。特此记录自己学习的点点滴滴。
SSE(Stream SIMD Extensions)是Intel在其计算机芯片Pentium3中引入的指令集,是继MMX的扩充指令集。提供了70条新指令。
SIMD,single instruction multiple data,单指令流多数据流,一次运算指令可以执行多个数据流,可以提高程序的运算速度,是实现DLP(Data Level Parallelism)的关键。

SSE本质上类似于一个向量处理器,包括了4个主要部分:单精确度浮点数运算指令、整数运算指令(为MMX的延伸,并与MMX使用同样的暂存器)、Cache控制指令、状态控制指令。

SSE浮点运算指令分为两大类:packed和scalar
packed指令是一次对XMM暂存器中的四个浮点数(DATA0~DATA3)均进行计算,而scalar只对XMM暂存器中的DATA0进行计算,见下图。

0_1322138417SGI3.gif.png

SSE指令的一般格式由三部分组成,第一部分表示指令的作用,第二部分是s或者p分别表示scalar或packed,第三部分为s,表示单精度浮点数(single precision floating point data)


0_1322142131Tc8T.gif.png

SSE定址/寻址方式:
SSE指令和一般的x86指令很类似,基本包括两种定址方式:寄存器-寄存器方式(reg-reg)和寄存器-内存方式(reg-mem):
addps xmm0,xmm1;reg-reg
addps xmm0,[ebx]; reg-mem

SSE指令表

浮点指令

  • 记忆体到暂存器/暂存器到记忆体/暂存器之间的资料搬移
    纯量(scalar):MOVSS
    包裹式(packed):MOVAPS,MOVUPS,MOVLPS,MOVHPS,MOVLHPS,MOVHLPS

  • 数学运算
    纯量:ADDSS,SUBSS,MULSS,DIVSS,RCPSS,SQRTSS,MAXSS,MINSS,RSQRTSS
    包裹式:ADDPS,SUBPS,MULPS,DIVPS,RCPPS,SQRTPS,MAXPS,MINPS,RSQRTPS

  • 比较
    纯量:CMPSS,COMISS,UCOMISS
    包裹式:CMPPS

  • 资料拆包(unpack)与随机搬移(shuffle)
    包裹式:SHUFPS,UNPCKHPS,UNPCKLPS

  • 资料形态转换
    纯量:CVTSI2SS,CVTSS2SI,CVTTSS2SI
    包裹式:CVTPI2PS,CVTPS2PI,CVTTPS2PI

  • 逐位逻辑运算
    包裹式:ANDPS,ORPS,XORPS,ANDNPS

整数指令

  • 数学运算
    PMULHUW,PSADBW,PAVGB,PAVGW,PMAXUB,PMINUB,PMAXSW,PMINSW
  • 资料搬移
    PEXTRW,PINSRW
  • 其它
    PMOVMSKB,PSHUFW

其它指令

  • MXCSR管理
    LDMXCSR,STMXCSR
  • 快取与记忆体管理(SSE除了运算的指令外,还支持了cache控制指令)
    MOVNTQ,MOVNTPS,MASKMOVQ,PREFETCH0,PREFETCH0,PREFETCH1,PREFECTCH2,PREFETCHNTA,SFENCE
    prefetch指令的主要目的,是提前让CPU载入稍后运算所需要的数据。通常是在对目前的资料进行与运算之前,告诉CPU载入下一批数据。这样就可以让目前的运算和载入下一批数据的动作可以同时进行。不同prefetch指令则是告诉CPU将数据载入不同层次的cache。prefetch指令不会产生任何exception。

除了prefetch之外,另一個指令是movntps,它的intrinsics是 _mm_stream_ps。這個指令的用途,是要求 CPU 在写入数据的時候,不要把数据写到 cache 中,而是直接將数据写到主记忆体中。实际上它以 write combining 的方式写入的。为什麼要这样做呢?這是因为,很多时候计算的結果并不是立刻需要用到的,通常是很久以后才会用到。所以,这些数据如果被放在 cache 中,完全是浪费空间。而且,更糟的是,它们可能会把 cache 中有用的数据挤掉,而使得这些数据常常需要重新从主记忆体中载入。因此,如果让这些数据不要被放在 cache 中,就可以避免这种問題。

参考阅读:
http://dev.gameres.com/Program/Other/SSEjianjie.htm http://blog.csdn.net/gengshenghong/article/details/7008704
http://www.cnblogs.com/clover-toeic/p/3853132.html (对字节对齐不清的童鞋可以参考这篇文章)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,884评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,347评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,435评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,509评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,611评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,837评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,987评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,730评论 0 267
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,194评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,525评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,664评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,334评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,944评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,764评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,997评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,389评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,554评论 2 349

推荐阅读更多精彩内容