关于下面两段代码的解释:
引自水木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单词】是一种创新的英语词汇学习方法,旨在通过800个有趣且富有挑战性的句子帮助学习者记忆7000个英语单词。这种方法强调趣味性和实用性,使得学习过程不再枯燥乏味。这些句子涵盖了广泛的词汇,包括...
在历史长河中,总有一些故事以智慧之光映照着人性的光辉,而“小学数学数学故事小女儿巧计救父”便是其中之一。这个故事不仅仅是一个关于智谋的叙述,更是数学知识与现实生活紧密相连的生动展现,其背后的寓意深远,...
个省级行政区的名称和位置巧计PPT教案.pptx
试听巧计10000单词,杨金明 往年的参考资料,仅共参考
速查巧计手册是一种便于携带和快速查找的工具书,它将大量的概念、公式、定理等信息进行分类整理,使得使用者能够迅速找到所需信息。在考研数学的复习过程中,这种手册可以大大提高复习效率,帮助考生在短时间内掌握...
标题提到的“英语谚语巧计单词700词汇任你掌握”暗示了一种通过学习英语谚语来记忆单词的方法。这种方法利用了谚语的韵律感和故事性,使单词的记忆过程变得有趣且易于接受。例如,“Anthropologists have discovered...
初中语文文摘历史苏军巧计“忽悠”希特勒
个省级行政区的名称和位置巧计.pptx
个省级行政区的名称和位置巧计学习教案.pptx
考研英语词汇巧计。20天内记住考研词汇,拥有去的故事记住考研英语单词
自己复习托福 才知道但背单词有多艰难 无论是词根式还是其他方法 这是我见到的最好的方法了 共享给大家
在英语写作中,短文改错是一项常见的任务,旨在提高学生的语法、拼写和用词准确性。本资料主要探讨了纠正文章错误的步骤和常见问题,以及如何关注动词形态、名词数量、代词格、句子成分、冠词连词等关键点。...
11.盛最多水的容器----双指针 15.三数之和----双指针(三指针) 17.电话号码的字母组合----回溯 19.删除链表的倒数第N个节点----双指针 20.有效的括号----栈 21.合并两个有序链表----递归 22.括号生成----回溯 23....
考试是检验学习成果的一种方式,文件中提到了一些应对考试的策略,比如熟悉考试流程、加强记忆、找到适合自己的复习方法等。同时,保持良好的心态对于考试成功同样重要,包括调节紧张情绪、积极面对复习挑战等。 10...
《考研数学概念公式定理手册》是一本为准备参加研究生入学考试的学生提供的数学参考书籍。这本手册主要涵盖了数学中的基本概念、重要的公式和定理,是考研数学复习的重要资料。由于内容都是通过OCR扫描获得,可能...
2. "7、考研数学阅卷人概念·公式·定理速查巧计手册(190页).pdf":这是一份为考研准备的速查手册,涵盖了阅卷人关注的概念、公式和定理,对于快速回顾和记忆关键知识点很有帮助。 3. "28、不定积分公式大全.pdf":...
在描述中,“项目管理44个过程输入输出工具技术忆巧计法--项管考试通关秘笈”透露了项目管理工程师考试涉及的核心知识点。这44个过程是项目管理知识体系的核心组成部分,涵盖了从项目启动到项目结束的整个生命周期。...
为了让学生更易记忆,这份复习素材采用了一种富有创意的方法——编写歌谣。例如,“碳是C,磷是P,铅的符号是Pb。Cu铜,Ca钙,钨的符号W。H氢,S硫,硅的符号Si。金Au,银Ag,镁的符号Mg。”通过韵律的编排,原本...
二、设巧计迁都洛阳 1. 原因: - 政治:加强对中原地区的统治,平城(今山西大同)的地理位置不利于统治全局,保守势力阻碍改革。 - 经济:平城地处边远,粮食供应困难。 - 军事:与北方游牧民族临近,存在安全...