Memory Dependencies-内存依赖

2023-05-16

Data: 2017.12.28

Author: cjh

Theme: Memory Dependencies

 

本篇内容是基于TI  TMS320C6000Programmer’s Guide手册第2.2.2 Memory Dependencies章节写的,主要是有关内存依赖和restrict关键字的使用,基于原文翻译和自己的理解,有错的地方还请指正。

 

为了尽可能的提高代码的效率,C6000编译器可以并行调度尽可能多的指令。要并行安排指令,编译器必须确定指令之间的关系或相关性。Dependency意味着一条指令必须依赖另一条指令发生。例如,变量必须先从内存中加载,然后才能使用。因为只有独立的指令可以并行执行,所以依赖性会抑制并行性。

 

■  如果编译器无法确定两条指令是独立的(例如,b不依赖于a),则它假定依赖关系,并按顺序调度这两条指令,以计算完成第一条指令所需的任何等待时间。

 

■  如果编译器可以确定两条指令是相互独立的,它可以并行调度它们。

 

编译器通常很难确定访问内存的指令是否独立。 以下技术可帮助编译器确定哪些指令是独立的:

 

①   使用restrict关键字来指示指针是唯一可以指向声明该指针的作用域中的特定对象的指针。

 

②   使用-pm(程序级优化)选项,它使编译器可以全局访问整个程序或模块,并允许它在排除依赖性方面更加积极。

 

③   使用-mt选项,它允许编译器使用允许消除依赖关系的假设。 请记住,在线性汇编代码上使用-mt选项相当于将.no_mdep指令添加到线性汇编源文件。应使用.mdep指令指定特定的内存依赖性。 有关程序集优化程序的更多信息,请参阅TMS320C6000 Optimizing Compiler User’s Guide。

 

为了更好的解释memory dependencies,见下图程序和流程



图中的1和5表示的是完成该指令所需要的周期数。Dependency所指的是:

■  从sum [i]返回到in1 [i]和in2 [i]的路径时,写入sum可能会影响in1或in2所指向的内存。

 

■  从in1或in2中读取数据只能等到完成相加后才会执行,这会产生别名问题。当两个指针指向相同的内存位置时,会发生混叠。例如,如果vecsum()在具有以下语句的程序中被调用,则in1和sum别名,因为它们都指向相同的内存位置:

short a[10], b[10];

vecsum(a, a, b, 10);

 

Restrict关键字

为了帮助编译器确定内存依赖性,可以使用restrict关键字修饰指针,引用或数组。他能保证在指针声明的范围内,指向的对象只能被该指针访问。任何违反此保证都会使程序变得不稳定。这种做法有助于编译器优化代码的某些部分,因为可以更容易地确定混叠信息。

 

举个例子:

int ar[10];

int * restrict restar = (int *) malloc(10 *sizeof(int));

int * par = ar;

这里,指针restar是访问由malloc()分配的内存的惟一且初始的方式。因此,它可以由关键字restrict限定。然而,par指针既不是初始的,也不是访问数组ar中数据的惟一方式,因此不可以把它限定为restrict。

现在考虑下面这个更复杂的例子,其中n是一个int:

for(n=0; n < 10; n++)

{

par[n] += 5;

restart[n] += 5;

ar[n] *= 2;

par[n] += 3;

restar[n] += 3;

}

知道了restar是访问它所指向数据块的惟一初始方式,编译器就可以用具有同样效果的一条语句来代替包含restar的两个语句:

restar[n] += 8;

然而,将两个包含par的语句精简为一个语句将导致计算错误:

par[n] += 8;

出现错误结果的原因是循环在par两次访问同一个数据之间,使用ar改变了该数据的值。

没有关键字restrict,编译器将不得不设想比较糟的那种情形,也就是两次使用指针之间,其他标识符可能改变了数据的值。使用restrict关键字之后,编译器可以放心地寻找计算的捷径。

可以将关键字restrict作为指针型函数参量的限定词使用。这意味着编译器可以假定在函数体内没有其他标识符修改指针指向的数据,因而可以试着优化代码,反之则不然。

关键字restrict有两个读者。一个是编译器,它告诉编译器可以自由地做一些有关优化的假定。另一个读者是用户,它告诉用户仅使用满足restrict要求的参数。一般,编译器无法检查您是否遵循了这一限制,如果您蔑视它也就是在让自己冒险。

 

参考:

http://blog.csdn.net/ly0303521/article/details/48178807

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Memory Dependencies-内存依赖 的相关文章

  • freertos和ucos的区别

    一 freeRTOS比uCOS II优胜的地方 xff1a 1 内核ROM和耗费RAM都比uCOS 小 xff0c 特别是RAM 这在单片机里面是稀缺资源 xff0c uCOS至少要5K以上 xff0c 而freeOS用2 3K也可以跑的很
  • wget和curl中使用代理

    命令使用代理 wget curl 都支持使用代理 wget e http proxy 61 10 1 4 43 8080 proxy mimvp com curl x 10 1 4 43 8080 proxy mimvp com 环境变量使
  • SQL 触发器与WebApi回执

    1 需求数据库表添加 xff0c 修改 xff0c 删除数据 xff0c 触发器生效 xff0c 推送数据数据到WCF接口 a 创建WCF服务 xff0c 发布服务 b 启用数据库CLR功能 xff0c 默认是关闭状态 EXEC sp co
  • inelliJ IDEA注册码

    http idea lanyus com
  • 正则表达式之?、(?:pattern)、(?!pattern)、(?=pattern)理解及应用

    今天朋友问我一个问题 xff0c 是这样子的 xff0c 通过正则表达式匹配html标签input包含hidden的字符串 xff0c 具体如下 xff1a 34 lt input type 61 34 hidden 34 id 61 34
  • cmake源码安装

    Data 2017 12 1 Author cjh Theme cmake源码安装 在玩TI AM5728时 xff0c 要用到cmake编译程序 xff0c 无奈开发板又不能用apt get只好自己源码安装了 cmake源码下载 解压源码
  • Ubuntu下逻辑坏道解决方案

    一 逻辑坏道修复方法 逻辑坏道 服务器硬盘相比其他部件是较容易坏的 xff0c 如突然断电 大量频繁写入都会加速硬盘的老化 xff0c 下面介绍一些判断硬盘状况和修复的方法 发现硬盘坏道 dmesg 当有硬盘坏道时 xff0c 通常在dme
  • 解决本地无法ssh连接ubuntu虚拟机

    1 保证双方都能互相ping通 本地 Windows 查看ip xff1a ipconfig ubuntu虚拟机查看ip span class token function ifconfig span 2 保证ubuntu虚拟机安装了ssh
  • 70、在js中为什么0.1+0.2不等于0.3

    并不是所有小数都可以用 完整 的二进制来表示的 xff0c 比如十进制 0 1 在转换成二进制小数的时候 xff0c 是一串无限循环的二进制数 xff0c 计算机是无法表达无限循环的二进制数的 xff0c 毕竟计算机的资源是有限 因此 xf
  • Outlook 2013/2016 显示“正在启动...“ 无法进入Outlook的解决方案

    因上次非正常关闭 xff0c 导致Outlook 2016启动时 xff0c 一直处于启动界面 xff0c 无法进入主界面正常工作 刚开始Outlook 2016启动界面显示的是 34 正在处理 34 查询网上各种方法 xff0c 安全启动
  • H265 CTU、CU、PU、TU划分的特点及要求

    目录 H265 CTU CU PU TU划分的特点及要求大小及划分模式常见问题1 Spec里对于CTU大小的规定在哪 xff1f 2 Spec对于TU大小的规定在哪 xff1f 3 Spec里对于M 2 M 2的划分方式的规定在哪里 xff
  • Oracle VM VirtualBox虚拟机使用问题总结

    我本机的配置是Ubuntu 18 04 43 Oracle VM VirtualBox虚拟机 6 1 12 43 虚拟win7操作系统 xff0c 对虚拟机了解甚少 xff0c 以下仅为一些实践中的经验 xff1a 一 升级后屏幕分辨率问题
  • C语言中string函数详解

    PS xff1a 本文包含了大部分strings函数的说明 xff0c 并附带举例说明 本来想自己整理一下的 xff0c 发现已经有前辈整理过了 xff0c 就转了过来 修改了原文一些源码的问题 xff0c 主要是用char 字义字符串的问
  • MP3的帧结构

    原文地址 xff1a http www eefocus com jjbearustc blog 07 09 3716 3e901 html MP3帧包括以下4个部分 xff1a 1 帧头 xff1a 比特流中包含同步和状态信息的部分 2 错
  • git am PATCH 失败的处理方法

    参考 xff1a http www cnblogs com domainfei articles 2433504 html http blog sina com cn s blog 5372b1a301015y0n html 英文原文地址
  • AAC帧格式及编码介绍

    参考资料 xff1a AAC以adts格式封装的分析 xff1a http wenku baidu com view 45c755fd910ef12d2af9e74c html aac编码介绍 xff1a http wenku baidu
  • 基于ubuntu14.04的Mobilenet_SSD环境搭建

    Data 2017 11 22 Author cjh Theme 基于ubuntu14 04的Mobilenet SSD环境搭建 Caffe for SSD xff1a https github com weiliu89 caffe tre
  • [open vSwitch]查看OVS端口ofport编号及对应虚拟机MAC

    在用open vSwitch做实验时 xff0c 我们经常需要知道OVS port对应的ofport编号 xff0c 这个比较容易 xff0c 用 ovs ofctl show bridge 就能得到 如 root 64 vaio ovs
  • 4、基于51单片机智能语音识别小车控制 语音口令说话控制系统设计

    毕设帮助 开题指导 技术解答 xff08 有偿 xff09 见文末 目录 摘要 一 硬件方案 二 设计功能 三 实物图 四 原理图 五 PCB图 六 程序源码 七 资料包括 摘要 随着电子工业的发展 xff0c 具有语音控制功能的小车越来越
  • H264中的SPS、PPS提取与作用

    牛逼的视频会议网站 xff1a http wmnmtm blog 163 com blog m 61 0 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 4

随机推荐

  • Linux系统备份与还原

    在 使用Ubuntu之前 xff0c 相信很多人都有过使用Windows系统的经历 如果你备份过Windows系统 xff0c 那么你一定记忆犹新 xff1a 首先需要找到一个备份工 具 通常都是私有软件 xff0c 然后重启电脑进入备份工
  • ip能ping开但是不能远程登陆

    刚刚安装ftp时玩将防火墙开启了 然后退出ssh再登陆时就登陆不上去了 出现 xff1a ip能ping开但是不能远程登陆 xff1b telnet ip 也不通 以为使系统问题 xff0c 但是想想刚刚的操作还是防火墙 解决方法 xff1
  • 如何检索CPCI-S

    1 打开Web of Science www webofknowledge com 2 选择数据库大类 xff1a Web of Science核心合集 xff1b 3 会议论文 xff0c 需要选择web of science数据库中的一
  • ZeroMQ消息传输协议 (v2.0)

    因为项目上在和其他团队联调时需要抓包分析消息正确性的问题 xff0c 因此在网络上查找了一下关于ZeroMQ的协议资料 找到如下文章 原文 另外这里有一篇对ZeroMQ实现讲的比较深的文章 xff0c 有兴趣也可以看看 xff1a 全网仅此
  • mysql左右匹配原则的用法和理解

    重点 xff1a mysql的最左匹配原则其实是和where后面的查询条件顺序是没有关系的只和索引的字段顺序有关 xff1b xff08 这里说的顺序是联合索引的顺序 xff09 这点网上很多地方都说错了 下面我们来用代码模拟一下问题 这里
  • 如何做好项目经理

    我一直赞同这个观点 xff1a 项目经理是干出来的 xff0c 不是学出来的 xff1b 是带出来的 xff0c 不是教出来的 一个人要成长为一名合格的项目经理主要不是靠学 xff0c 而是靠干 xff0c 当然学也很重要 靠干 xff0c
  • Javascript进制转换

    介绍一个简单的用Javascript进行 进制 转换的方式 xff1a 将十进制转换为十六进制 xff1a var i 61 10 alert parseInt 10 10 toString 16 同样 xff0c 将十六进制转换为十进制
  • js实现进制变换 10->16

    进制变换 10 gt 16 function heTransform data var pattern 61 new RegExp 39 1 9 d 0 39 判断是否是10进制数字 if pattern test data var hex
  • 用Visual C#实现局域网点对点通讯

    用Visual C xff03 实现局域网点对点通讯 作者 xff1a 马金虎 日期 xff1a 2003 9 28 出处 xff1a P2P中国 PPcn net 点对点即Peer To Peer xff0c 通常简写为P2P 所谓网络中
  • Makefile学习总结

    Data 2017 12 07 Author cjh Theme Makefile Tutorial 俗话说 xff0c 工欲善其事必先利其器 xff0c 所以我们先来介绍一下Makefile中的特殊字符 64 表示目标文件 表示所有的依赖
  • stmdb和ldmia

    stmdb xff1a db xff08 decrease before xff09 表示先减后存 指令 stmdb sp fp ip lr pc 34 表示sp等于最终被修改的sp的值 假设 sp 61 4096 xff0c 此条指令的执
  • ros之tf经验总结

    1 概念 搞ros都离不开tf xff0c 当建立一个机器人模型时 xff0c 第一步就是要确定机器人的tf结构 以kobuki导航运行为例 xff0c 首先是 map xff1a 地图坐标 xff0c 固定坐标系 odom xff1a 机
  • setInterval和setTimeout的缺陷和优势分析

    先把问题摆出来 xff1a 使用定时器的setInterval xff08 xff09 方法会出现程序并不是按照我们设定的精确时间而调用的问题 xff01 定时器 xff1a 在JavaScript中经常会使用定时器来进行延时或者是重复调用
  • 关于KEIL调试时CortexJLink中SW Device检测不到芯片解决办法

    使用Jlink第一次下载成功后 xff0c 第二次检测不到设备 xff0c 极大原因是因为软件配置了SWDIO和SWCLK的状态导致的 解决办法 xff1a 软件中将配置两个引脚状态程序注释 xff0c 将芯片的BOOT0引脚接高电平 xf
  • Web大规模高并发请求和抢购的解决方案

    电商的秒杀和抢购 xff0c 对我们来说 xff0c 都不是一个陌生的东西 然而 xff0c 从技术的角度来说 xff0c 这对于Web系统是一个巨大的考验 当一个Web系统 xff0c 在一秒钟内收到数以万计甚至更多请求时 xff0c 系
  • Java用自定义的类作为HashMap的key值

    这是Java中很经典的问题 xff0c 在面试中也经常被问起 其实很多书或者文章都提到过要重载hashCode 和equals 两个方法才能实现自定义键在HashMap中的查找 xff0c 但是为什么要这样以及如果不这样做会产生什么后果 x
  • Maven类包冲突终极三大解决技巧 mvn dependency:tree

    举例 A依赖于B及C xff0c 而B又依赖于X Y xff0c 而C依赖于X M xff0c 则A除引B及C的依赖包下 xff0c 还会引入X xff0c Y xff0c M的依赖包 xff08 一般情况下了 xff0c Maven可通过
  • idea中的实现接口时@Override注解问题

    摘要 用IntelliJ 15打开一个以前的工程 xff0c 发现代码出现很多关于 64 Override的错误 xff0c 编辑器提示 xff1a 64 Override is not allowed when implementing
  • mac下idea的使用之java工程打包生成jar篇

    我们先选中工程 xff0c 然后点如下的图标 xff0c 打开配置文件 xff0c 再选中artifacts选项 xff0c 再点加号选jar 起一个名字 xff0c 然后再填写好要打到的路径 xff0c 下面就是我们要选择我们需要的包或着
  • Memory Dependencies-内存依赖

    Data 2017 12 28 Author cjh Theme Memory Dependencies 本篇内容是基于TI TMS320C6000Programmer s Guide手册第2 2 2 Memory Dependencies