`
isiqi
  • 浏览: 16692166 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

linux编程的108种奇淫巧计-11(乱序)

阅读更多

关于下面两段代码的解释:

引自水木Maling:

"写虽然是16bytes/cycle但那是througput 也就是说我们需要尽可能使每个cycle有一个写操作进入write buffer after allocation stage从而保证 16bytes/cycle. 上面的代码palignr 在前端阻挡(从读取到译码阶段)了写操作尽快的进入decode以及allocatoin stage 所以每个循环会比下面的代码多出 2~3个cycle",该帖子全部内容参见最后的参考阅读。

我将Maling的代码做了一个实现,但由于我试验机不支持SSE3指令,在运行palignr指令会出非法操作,dmesg给出:trap invalid opcode rip:4004cc rsp:7fff74e5b728 error:0,这样的错误,因此改成了三段指令拼的方法。

理解这段代码的功能并不复杂,但为什么快的原因,就是Maling说的那几条,我们可以看出在乱序后性能的提升,这是一个很好的例子,我把它引在了我的系列中,代码和原理来自Maling,我只是包装了下实现,便于大家实际运行,并体验。

#include<stdio.h>
#include<stdlib.h>
#include <stddef.h>
#include <stdint.h>
asm(" .text ");
asm(" .type shl_7, @function ");
asm("shl_7: push %rbp ");
asm(" mov %rsp,%rbp ");
asm("loop: sub $0x80, %rdx ");
asm(" movaps -0x07(%rsi), %xmm1 ");
asm(" movaps 0x09(%rsi), %xmm2 ");
asm(" movaps 0x19(%rsi), %xmm3 ");
asm(" movaps 0x29(%rsi), %xmm4 ");
asm(" movaps 0x39(%rsi), %xmm5 ");
asm(" movaps 0x49(%rsi), %xmm6 ");
asm(" movaps 0x59(%rsi), %xmm7 ");
asm(" movaps 0x69(%rsi), %xmm8 ");
asm(" movaps 0x79(%rsi), %xmm9 ");
asm(" lea 0x80(%rsi), %rsi ");
asm(" psrldq $7, %xmm8 ");
asm(" pslldq $9, %xmm9 ");
asm(" por %xmm8, %xmm9 ");

asm(" psrldq $7, %xmm7 ");
asm(" pslldq $9, %xmm8 ");
asm(" por %xmm7, %xmm8 ");

asm(" psrldq $7, %xmm6 ");
asm(" pslldq $9, %xmm7 ");
asm(" por %xmm6, %xmm7 ");

asm(" psrldq $7, %xmm5 ");
asm(" pslldq $9, %xmm6 ");
asm(" por %xmm5, %xmm6 ");

asm(" psrldq $7, %xmm4 ");
asm(" pslldq $9, %xmm5 ");
asm(" por %xmm4, %xmm5 ");

asm(" psrldq $7, %xmm3 ");
asm(" pslldq $9, %xmm4 ");
asm(" por %xmm3, %xmm4 ");

asm(" psrldq $7, %xmm2 ");
asm(" pslldq $9, %xmm3 ");
asm(" por %xmm2, %xmm3 ");


asm(" psrldq $7, %xmm1 ");
asm(" pslldq $9, %xmm2 ");
asm(" por %xmm1, %xmm2 ");

asm(" movaps %xmm9, 0x70(%rdi) ");
asm(" movaps %xmm8, 0x60(%rdi) ");
asm(" movaps %xmm7, 0x50(%rdi) ");
asm(" movaps %xmm6, 0x40(%rdi) ");
asm(" movaps %xmm5, 0x30(%rdi) ");
asm(" movaps %xmm4, 0x20(%rdi) ");
asm(" movaps %xmm3, 0x10(%rdi) ");
asm(" movaps %xmm2, 0x0(%rdi) ");
asm(" leaveq ");
asm(" retq ");

asm(" .text ");
asm(" .type shl_7_f, @function ");
asm("shl_7_f: push %rbp ");
asm(" mov %rsp,%rbp ");
asm("loop_f: sub $0x80, %rdx ");
asm(" movaps -0x07(%rsi), %xmm1 ");
asm(" movaps 0x09(%rsi), %xmm2 ");
asm(" movaps 0x19(%rsi), %xmm3 ");
asm(" movaps 0x29(%rsi), %xmm4 ");
asm(" movaps 0x39(%rsi), %xmm5 ");
asm(" movaps 0x49(%rsi), %xmm6 ");
asm(" movaps 0x59(%rsi), %xmm7 ");
asm(" movaps 0x69(%rsi), %xmm8 ");
asm(" movaps 0x79(%rsi), %xmm9 ");
asm(" lea 0x80(%rsi), %rsi ");
asm(" psrldq $7, %xmm8 ");
asm(" pslldq $9, %xmm9 ");
asm(" por %xmm8, %xmm9 ");
asm(" movaps %xmm9, 0x70(%rdi) ");

asm(" psrldq $7, %xmm7 ");
asm(" pslldq $9, %xmm8 ");
asm(" por %xmm7, %xmm8 ");
asm(" movaps %xmm8, 0x60(%rdi) ");

asm(" psrldq $7, %xmm6 ");
asm(" pslldq $9, %xmm7 ");
asm(" por %xmm6, %xmm7 ");
asm(" movaps %xmm7, 0x50(%rdi) ");


asm(" psrldq $7, %xmm5 ");
asm(" pslldq $9, %xmm6 ");
asm(" por %xmm5, %xmm6 ");
asm(" movaps %xmm6, 0x40(%rdi) ");

asm(" psrldq $7, %xmm4 ");
asm(" pslldq $9, %xmm5 ");
asm(" por %xmm4, %xmm5 ");
asm(" movaps %xmm5, 0x30(%rdi) ");

asm(" psrldq $7, %xmm3 ");
asm(" pslldq $9, %xmm4 ");
asm(" por %xmm3, %xmm4 ");
asm(" movaps %xmm4, 0x20(%rdi) ");

asm(" psrldq $7, %xmm2 ");
asm(" pslldq $9, %xmm3 ");
asm(" por %xmm2, %xmm3 ");
asm(" movaps %xmm3, 0x10(%rdi) ");

asm(" psrldq $7, %xmm1 ");
asm(" pslldq $9, %xmm2 ");
asm(" por %xmm1, %xmm2 ");
asm(" movaps %xmm2, 0x0(%rdi) ");

asm(" leaveq ");
asm(" retq ");

int main(void)
{
uint8_t * src = (uint8_t*)malloc(sizeof(uint8_t)*(128+7));
uint8_t * des = (uint8_t*)malloc(sizeof(uint8_t)*128);
int i = 0;
for(;i<128;++i)
{
src[i] = 0xFF;
}
src[0] = 0x0;
src[1]=0x1;
src[2]=0x2;
src[7]=0x7;
src[8]=0x8;
src+=7;
/*shl_7(des,src);
i = 0;
for(;i<128;++i)
{
printf("%d\n",des[i]);
}
i = 0;*/
for(;i<100000000;++i)
{

#ifdef SLOW
shl_7(des,src);

#endif

#ifdef FAST
shl_7_f(des,src);

#endif
}

return 0;
}

参见:

(1)http://www.newsmth.net/bbscon.php?bid=272&id=47206

分享到:
评论

相关推荐

    星火考研 巧计速计 艾宾浩斯背单词专用词库

    星火考研系列是针对准备研究生入学考试(简称考研)的学生提供的一种学习资源,其中的“巧计速计”方法是针对英语单词记忆的一种技巧性、高效的学习方法。艾宾浩斯记忆曲线则是心理学家赫尔曼·艾宾浩斯提出的理论,...

    巧计英语7000单词

    【巧计英语7000单词】是一种创新的英语词汇学习方法,旨在通过800个有趣且富有挑战性的句子帮助学习者记忆7000个英语单词。这种方法强调趣味性和实用性,使得学习过程不再枯燥乏味。这些句子涵盖了广泛的词汇,包括...

    小学数学数学故事小女儿巧计救父

    在历史长河中,总有一些故事以智慧之光映照着人性的光辉,而“小学数学数学故事小女儿巧计救父”便是其中之一。这个故事不仅仅是一个关于智谋的叙述,更是数学知识与现实生活紧密相连的生动展现,其背后的寓意深远,...

    个省级行政区的名称和位置巧计PPT教案.pptx

    个省级行政区的名称和位置巧计PPT教案.pptx

    试听巧计10000单词

    试听巧计10000单词,杨金明 往年的参考资料,仅共参考

    2020考研数学阅卷人概念·公式·定理速查巧计手册

    速查巧计手册是一种便于携带和快速查找的工具书,它将大量的概念、公式、定理等信息进行分类整理,使得使用者能够迅速找到所需信息。在考研数学的复习过程中,这种手册可以大大提高复习效率,帮助考生在短时间内掌握...

    英语谚语巧计单词700词汇任你掌握

    标题提到的“英语谚语巧计单词700词汇任你掌握”暗示了一种通过学习英语谚语来记忆单词的方法。这种方法利用了谚语的韵律感和故事性,使单词的记忆过程变得有趣且易于接受。例如,“Anthropologists have discovered...

    初中语文文摘历史苏军巧计“忽悠”希特勒

    初中语文文摘历史苏军巧计“忽悠”希特勒

    个省级行政区的名称和位置巧计.pptx

    个省级行政区的名称和位置巧计.pptx

    个省级行政区的名称和位置巧计学习教案.pptx

    个省级行政区的名称和位置巧计学习教案.pptx

    考研英语词汇巧计读故事20天搞定英语考研单词(含金量极高).

    考研英语词汇巧计。20天内记住考研词汇,拥有去的故事记住考研英语单词

    新托福词汇17天巧计

    自己复习托福 才知道但背单词有多艰难 无论是词根式还是其他方法 这是我见到的最好的方法了 共享给大家

    短文改错口诀巧计2.ppt

    在英语写作中,短文改错是一项常见的任务,旨在提高学生的语法、拼写和用词准确性。本资料主要探讨了纠正文章错误的步骤和常见问题,以及如何关注动词形态、名词数量、代词格、句子成分、冠词连词等关键点。...

    leetcode跳跃-leetcode:leetcode

    11.盛最多水的容器----双指针 15.三数之和----双指针(三指针) 17.电话号码的字母组合----回溯 19.删除链表的倒数第N个节点----双指针 20.有效的括号----栈 21.合并两个有序链表----递归 22.括号生成----回溯 23....

    项目管理44个过程输入输出工具技术忆巧计法.pdf

    考试是检验学习成果的一种方式,文件中提到了一些应对考试的策略,比如熟悉考试流程、加强记忆、找到适合自己的复习方法等。同时,保持良好的心态对于考试成功同样重要,包括调节紧张情绪、积极面对复习挑战等。 10...

    PMBOK第6版ITTO汇总+重点标准+每个ITTO的一句话概括

    项目管理知识体系指南(PMBOK)是项目管理专业领域的权威指南,由项目管理协会(PMI)编制,为项目经理们提供了一套项目管理的标准框架和术语。PMBOK第六版中,ITTO指的是输入(Inputs)、工具与技术(Tools & ...

    考研数学概念公式定理手册

    《考研数学概念公式定理手册》是一本为准备参加研究生入学考试的学生提供的数学参考书籍。这本手册主要涵盖了数学中的基本概念、重要的公式和定理,是考研数学复习的重要资料。由于内容都是通过OCR扫描获得,可能...

    数学公式(高数、线代、概率)-2020.05.23.rar

    2. "7、考研数学阅卷人概念·公式·定理速查巧计手册(190页).pdf":这是一份为考研准备的速查手册,涵盖了阅卷人关注的概念、公式和定理,对于快速回顾和记忆关键知识点很有帮助。 3. "28、不定积分公式大全.pdf":...

    项目管理工程师备考指南与习题详解

    在描述中,“项目管理44个过程输入输出工具技术忆巧计法--项管考试通关秘笈”透露了项目管理工程师考试涉及的核心知识点。这44个过程是项目管理知识体系的核心组成部分,涵盖了从项目启动到项目结束的整个生命周期。...

    山东省泰安市岱岳区徂徕镇第一中学2015年中考化学巧计元素符号复习素材

    为了让学生更易记忆,这份复习素材采用了一种富有创意的方法——编写歌谣。例如,“碳是C,磷是P,铅的符号是Pb。Cu铜,Ca钙,钨的符号W。H氢,S硫,硅的符号Si。金Au,银Ag,镁的符号Mg。”通过韵律的编排,原本...

Global site tag (gtag.js) - Google Analytics