csapp archlab PartC满分解答

任务

修改ncopy.ys和pipe-full.hcl以尽可能的提高ncopy.ys的运行速度

思路

pipe-full.hcl

  1. 实现iaddq指令(家庭作业4.54)
  2. 实现加载转发(家庭作业4.57)

ncopy.ys

  1. 使用循环展开(第5.8节),由于代码长度限制,最终使用十路循环展开
  2. 使用区间判断处理循环展开之后的余数,并利用技巧减少跳转指令
  3. 利用总是选择分支策略的特性控制分支优先级,决定优先级的有两个因素:一是区间越大(发生的概率越大)的分支优先级越大;二是余数越小优先级越大,因为每个长度的成绩是CPE(cycles per element),而综合成绩又是每个长度成绩的平均值
  4. 寄存器默认为零,因此删除xorq %rax, %rax指令不会造成错误

由于采用了十路循环展开,因此余数为[0, 9],由于跳转指令可以为jl,je,jg,因此区间判断的搜索树为一个三叉搜索树,选择3和7进行判断是综合考虑统计因素和余数优先级的结果

未命名文件-1

代码

##################################################################
# You can modify this portion# Loop header# ten-way loop unrollingiaddq $-10, %rdx        # len - 10 < 0?jl L0R9
Loop1:mrmovq (%rdi), %r8      # val = *srcrmmovq %r8, (%rsi)      # *dst = valandq %r8, %r8           # val <= 0?jle Loop2               # if so, goto Loop2iaddq $1, %rax          # count++
Loop2:mrmovq 0x8(%rdi), %r8rmmovq %r8, 0x8(%rsi)andq %r8, %r8jle Loop3iaddq $1, %rax
Loop3:mrmovq 0x10(%rdi), %r8rmmovq %r8, 0x10(%rsi)andq %r8, %r8jle Loop4iaddq $1, %rax
Loop4:mrmovq 0x18(%rdi), %r8rmmovq %r8, 0x18(%rsi)andq %r8, %r8jle Loop5iaddq $1, %rax
Loop5:mrmovq 0x20(%rdi), %r8rmmovq %r8, 0x20(%rsi)andq %r8, %r8jle Loop6iaddq $1, %rax
Loop6:mrmovq 0x28(%rdi), %r8rmmovq %r8, 0x28(%rsi)andq %r8, %r8jle Loop7iaddq $1, %rax
Loop7:mrmovq 0x30(%rdi), %r8rmmovq %r8, 0x30(%rsi)andq %r8, %r8jle Loop8iaddq $1, %rax
Loop8:mrmovq 0x38(%rdi), %r8rmmovq %r8, 0x38(%rsi)andq %r8, %r8jle Loop9iaddq $1, %rax
Loop9:mrmovq 0x40(%rdi), %r8rmmovq %r8, 0x40(%rsi)andq %r8, %r8jle Loop10iaddq $1, %rax
Loop10:mrmovq 0x48(%rdi), %r8rmmovq %r8, 0x48(%rsi)andq %r8, %r8jle Stepiaddq $1, %rax
Step:iaddq $0x50, %rdiiaddq $0x50, %rsiiaddq $-10, %rdxjge Loop1# applying range checks to remainders
L0R9:iaddq   $7,%rdx         # Test 3 (len + 10 - 3)jl      L0R2            # len < 3jg      L4R9            # len > 3je      Rem3            # len == 3
L0R2:iaddq   $2,%rdx         # Test 1 (len + 3 - 1)je      Rem1            # len == 1jg      Rem2            # len == 2ret                     # len == 0
L4R6:iaddq   $2,%rdx         # Test 5 (len + 7 - 5)jl      Rem4            # len == 4je      Rem5            # len == 5jmp     Rem6            # len == 6
L4R9:iaddq   $-4,%rdx        # Test 7 (len + 3 - 7)jl      L4R6            # len < 7je      Rem7            # len == 7
L8R9:iaddq   $-1,%rdx        # Test 8 (len + 7 - 8)je      Rem8            # len == 8# dealing with remainders
Rem9:mrmovq 0x40(%rdi), %r8rmmovq %r8, 0x40(%rsi)andq %r8, %r8jle Rem8iaddq $1, %rax
Rem8:mrmovq 0x38(%rdi), %r8rmmovq %r8, 0x38(%rsi)andq %r8, %r8jle Rem7iaddq $1, %rax
Rem7:mrmovq 0x30(%rdi), %r8rmmovq %r8, 0x30(%rsi)andq %r8, %r8jle Rem6iaddq $1, %rax
Rem6:mrmovq 0x28(%rdi), %r8rmmovq %r8, 0x28(%rsi)andq %r8, %r8jle Rem5iaddq $1, %rax
Rem5:mrmovq 0x20(%rdi), %r8rmmovq %r8, 0x20(%rsi)andq %r8, %r8jle Rem4iaddq $1, %rax
Rem4:mrmovq 0x18(%rdi), %r8rmmovq %r8, 0x18(%rsi)andq %r8, %r8jle Rem3iaddq $1, %rax
Rem3:mrmovq 0x10(%rdi), %r8rmmovq %r8, 0x10(%rsi)andq %r8, %r8jle Rem2iaddq $1, %rax
Rem2:mrmovq 0x8(%rdi), %r8rmmovq %r8, 0x8(%rsi)andq %r8, %r8jle Rem1iaddq $1, %rax
Rem1:mrmovq (%rdi), %r8rmmovq %r8, (%rsi)andq %r8, %r8jle Doneiaddq $1, %rax##################################################################
# Do not modify the following section of code
# Function epilogue.
Done:ret
##################################################################
# Keep the following label at the end of your function
End:
#/* $end ncopy-ys */

实验成绩

未命名文件-2未命名文件-3

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

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

相关文章

openai多模态大模型:clip详解及使用

引言 CLIP全称Constrastive Language-Image Pre-training&#xff0c;是OpenAI推出的采用对比学习的文本-图像预训练模型。CLIP惊艳之处在于架构非常简洁且效果好到难以置信&#xff0c;在zero-shot文本-图像检索&#xff0c;zero-shot图像分类&#xff0c;文本→图像生成任务…

windows服务器下java程序健康检测及假死崩溃后自动重启应用、开机自动启动

前两天由于项目需要&#xff0c;一个windows上的批处理任务&#xff08;kitchen.bat&#xff09;&#xff0c;需要接到mq的消息通知后执行&#xff0c;为了快速实现这里我们通过springboot写了一个jar程序&#xff0c;用于接收mq的消息&#xff0c;并调用bat文件。 本程序需要实…

缺少或找不到vcruntime140_1.dll的解决方法

某天&#xff0c;当我准备打开电脑上的一个应用程序时&#xff0c;突然收到一个错误提示&#xff0c;显示缺少了vcruntime140_1.dll文件。这个文件是一个重要的系统组件&#xff0c;它的丢失导致了我无法正常运行该应用程序。于是&#xff0c;我开始了一场寻找和修复旅程。然而…

这是我的纪念日

我的1460天 写这篇文章&#xff0c;是为了纪念自己这一千多个日日夜夜&#xff0c;我的热爱总算有了回报。 每次看到有小伙伴点赞&#xff0c;评论的时候&#xff0c;我都很开心&#xff0c;我知道自己的选择是正确的&#xff0c;我喜欢分享自己的所见所学&#xff0c;我也很…

python3.7 安装pywin32报错,完美解决方法

本机环境 python&#xff1a;3.7 遇到2种报错 第一种 ImportError: DLL load failed: The specified module could not be found.第二种&#xff1a; import win32gui ModuleNotFoundError: No module named ‘win32gui‘解决方法 我安装pywin32时候&#xff0c;是直接pi…

stm32红绿灯源代码示例(附带Proteus电路图)

本代码不能直接用于红路灯&#xff0c;只是提供一个思路 #include "main.h" #include "gpio.h" void SystemClock_Config(void); void MX_GPIO_Init(void) {GPIO_InitTypeDef GPIO_InitStruct {0};/* GPIO Ports Clock Enable */__HAL_RCC_GPIOB_CLK_ENAB…

Jenkins-CICD-python/Java包升级与回退

Jenkins- CICD流水线 python/Java代码升级与回退 1、执行思路 1.1、代码升级 jenkins上点击 upgrade和 代码版本号 --${tag} jenkins 推送 代码 和 执行脚本 到目标服务器/opt目录下 执行命令 sh run.sh 代码名称 版本号 upgrade 版本号 来自jenkins的 构建参数中的 标签…

Gitlab-第四天-CD到k8s集群的坑

一、.gitlab-ci.yml #CD到k8s集群的 stages: - deploy-test build-image-deploy-test: stage: deploy-test image: bitnami/kubectl:latest # 使用一个包含 kubectl 工具的镜像 tags: - k8s script: - ls -al - kubectl apply -f deployment.yaml # 根据实际情况替换…

LlamaGPT -基于Llama 2的自托管类chatgpt聊天机器人

LlamaGPT一个自托管、离线、类似 ChatGPT 的聊天机器人&#xff0c;由 Llama 2 提供支持。100% 私密&#xff0c;不会有任何数据离开你的设备。 推荐&#xff1a;用 NSDT编辑器 快速搭建可编程3D场景 1、如何安装LlamaGPT LlamaGPT可以安装在任何x86或arm64系统上。 首先确保…

PHP8的字符串操作3-PHP8知识详解

今天继续分享字符串的操作&#xff0c;前面说到了字符串的去除空格和特殊字符&#xff0c;获取字符串的长度&#xff0c;截取字符串、检索字符串。 今天继续分享字符串的其他操作。如&#xff1a;替换字符串、分割和合成字符串。 5、替换字符串 替换字符串就是对指定字符串中…

vue浏览器插件安装-各种问题

方法1&#xff1a;vue.js devtolls插件下载 https://blog.csdn.net/qq_55640378/article/details/131553642 下载地址&#xff1a; Tags vuejs/devtools GitHub npm install 或是 cnpm install 遇到的报错 设置淘宝镜像源&#xff08;推荐使用nrm&#xff0c;这一步是为…

使用IText导出复杂pdf

1、问题描述 需要将发票导出成pdf&#xff0c;要求每页都必须包含发票信息和表头行。 2、解决方法 使用IText工具实现PDF导出 IText8文档&#xff1a;Examples (itextpdf.com) 3、我的代码 引入Itext依赖&#xff0c;我这里用的是8.0.1版本 <dependency><groupId>…

uniapp 上传比较大的视频文件就超时

uni.uploadFile&#xff0c;上传超过10兆左右的文件就报错err&#xff1a;uploadFile:fail timeout&#xff0c;超时 解决&#xff1a; 在manifest.json文件中做超时配置 uni.uploadFile({url: this.action,method: "POST",header: {Authorization: uni.getStorage…

Python编程——列表解析与常用操作

作者&#xff1a;Insist-- 个人主页&#xff1a;insist--个人主页 本文专栏&#xff1a;Python专栏 专栏介绍&#xff1a;本专栏为免费专栏&#xff0c;并且会持续更新python基础知识&#xff0c;欢迎各位订阅关注。 目录 一、列表是什么&#xff1f; 二、列表的特点 1、元素…

pyltp 0.2.1安装

1. LTP及pyltp pyltp是 LTP的 Python封装&#xff0c;它里面提供了包括分词&#xff0c;词性标注&#xff0c;命名实体识别&#xff0c;句法分析等等能力。 比较坑的是我们可能无法直接通过pip install pyltp0.2.1方式来安装&#xff0c;所以本文就简单记录下如何通过源码安装…

商城-学习整理-高级-性能压测缓存问题(十一)

目录 一、基本介绍1、性能指标2、JMeter1、JMeter 安装2、JMeter 压测示例1、添加线程组2、添加 HTTP 请求3、添加监听器4、启动压测&查看分析结果 3、JMeter Address Already in use 错误解决 二、性能监控1、jvm 内存模型2、堆3、jconsole 与 jvisualvm1、jvisualvm 能干…

音视频 FFmpeg音视频处理流程

ffmpeg -i test_1920x1080.mp4 -acodec copy -vcodec libx264 -s 1280x720 test_1280x720.flv推荐一个零声学院项目课&#xff0c;个人觉得老师讲得不错&#xff0c;分享给大家&#xff1a; 零声白金学习卡&#xff08;含基础架构/高性能存储/golang云原生/音视频/Linux内核&am…

【计算机视觉】相机基本知识(还在更新)

1.面阵工业相机与线阵工业相机 1.1 基本概念区别 面阵相机则主要采用的连续的、面状扫描光线来实现产品的检测&#xff1b; 线阵相机即利用单束扫描光来进行物体扫描的工作的。 1.2 优缺点 &#xff08;1&#xff09;面阵CCD工业相机&#xff1a; 优点&#xff1a;应用面…

python使用dir()函数获取对象中可用的属性和方法(看不到python源码又想知道怎么调用,DLL调用分析,SDK二次开发技巧)

有时候调用一些SDK&#xff0c;但是人家又是封装成dll文件形式调用的&#xff0c;这时没法看源码&#xff0c;也不想看其对应的开发文档&#xff08;尤其有些开发文档写得还很难懂&#xff0c;或者你从某个开源社区拿过来&#xff0c;就根本没找到开发文档&#xff09;&#xf…

学习笔记:Opencv实现图像特征提取算法SIFT

2023.8.19 为了在暑假内实现深度学习的进阶学习&#xff0c;特意学习一下传统算法&#xff0c;分享学习心得&#xff0c;记录学习日常 SIFT的百科&#xff1a; SIFT Scale Invariant Feature Transform, 尺度不变特征转换 全网最详细SIFT算法原理实现_ssift算法_Tc.小浩的博客…