基于深度学习的高精地图的自动生成与标注

点击上方“3D视觉工坊”,选择“星标”

干货第一时间送达

文章:Automatic Building and Labeling of HD Maps with Deep Learning

作者:Mahdi Elhousni, Yecheng Lyu, Ziming Zhang, Xinming Huang

翻译:particle

论文阅读模块将分享点云处理,SLAM,三维视觉,高精地图相关的文章。公众号致力于理解三维视觉领域相关内容的干货分享,欢迎各位加入我,我们一起每天一篇文章阅读,开启分享之旅,有兴趣的可联系微信dianyunpcl@163.com。

论文摘要

在一个自动驾驶汽车越来越普遍的世界里,为这项新技术创造一个足够的基础设施是至关重要的。而这项基础设施就包括准确有效地构建带有标签的高精地图。如今,制作高精地图的过程需要大量的人工投入,这种方式不仅需要时间,而且容易出错。在这篇论文中,我们提出一个新的方法,能够从原始传感器数据中通过AI自动生产带有标记的高精地图。使用从测试车辆收集的数据,在多个城市场景中实施并测试了我们的方法。结果表明,所提出的基于深度学习的方法可以生成高精度的地图。这种方法加快了高精地图的生产和标注过程,为自动驾驶车辆的部署做出了有意义的贡献。

● 相关工作与介绍

深度学习是自动驾驶的催化剂,在车道线以及障碍物的检测都十分出色,有时在激光雷达的融合下能够缓解深度和二位图像的精度问题,这有助于汽车安全驾驶,让汽车更智能的遵守交通规则。然而自动驾驶仅仅基于深度学习和相机的方法是注定失败的,因为相机的主要缺陷是受环境的亮度影响较大,那么这个弱点就需要将相机的数据与更加精确的传感器数据来融合弥补,那就是高精地图。

高精地图是三维点云和相关予以信息的组合,3D的点云可用于车辆的定位,为了能够进行自主导航,所以需要构建点云数据的车道,道路和交通标志等位置信息,但是由于点云没有颜色信息,标记的点云数据上的标记位置明显缺乏准确性。仅仅依赖点云的强度将会导致更多的噪声数据,因此本文提出了基于深度学习的自动完成高精地图标注和生成的方法,并且与其他方法结合,以提高标注的准确性和鲁棒性,文章的主要贡献可以概括为一系列算法和流程,旨在为城市自动驾驶自动生成和标记高精地图。

● 内容精华

地图构建流程

本文提出的地图绘制流程主要是在高精地图上标注道路信息的同时,构建周围环境的三维几何信息。在这里,我们标注的道路信息是可驾驶区域和车道。图1显示了整个流程的概况。为了清晰起见,我们定义了三个帧:地图帧Fm,其原点是地图开始处第一次扫描的中心,汽车帧Fc,其原点是车辆的中心,而激光雷达帧Fl的原点是激光雷达传感器的中心。

图流程 结合3D-NDT和预训练的DNN生成带标签的高精地图

道路地图

我们将道路R定义为Fm框架中的多边形,限制了可驾驶的区域,但不一定合法。进行道路测绘有两个主要原因:

•当道路上没有车道时,它可以引导自动驾驶车辆,有时单向街道也是如此。

•它可以帮助我们描述的车道图。道路检测使用摄像机数据,投影到激光雷达数据上,经过细化以去除异常值,然后使用3D NDT算法的输出与先前的扫描进行累积。然后计算道路占用的区域并提取道路界限。我们将在下面的每个步骤中解释这些步骤。图2显示了道路绘制流程的概述。

道路地图绘制流程。对来自摄像机FCN的结果进行修剪以去除异常值

检测:对于检测道路,我们使用完全卷积网络(FCN)。将该网络应用于前置相机数据,将图像分割为两个区域:道路区域和非道路区域。这将产生一个二值图像,我们将结合激光雷达相机融合来分割出道路的点云。

投影:我们首先使用相机参数来裁剪点云,这样我们就只对相机视野范围内的点进行操作。然后,利用激光雷达摄像机之间的外参,将二值图像投影到点云上,同时保证图像中的颜色信息被保留并传输到点云上。这将生成一个二进制点云,其中道路点的颜色与点云上的其他点不同。

路沿检测:在某些情况下,FCN检测到的道路往往会在路沿边缘,尤其是当由于阴影、亮度变化或路沿太小而在图像框中难以区分路沿时。因此,我们需要通过移除预测道路中包含的所有路沿部分来改进FCN的结果。

   道路点云高程z直方图

为此,我们根据z轴使用彩色点云和高程信息。我们首先使用基于颜色分割的方法从之前获得的彩色点云中提取道路点云,然后,如图3所示,我们将道路点云中的点的高程显示为直方图。它表明,提取的道路点云中的点遵循双峰分布,即包含两个峰值的分布,代表两个正态分布,平均值分别为µ1和µ2,标准差分别为σ1和σ2。这是有意义的,因为第一个法线分布表示路沿上的点,第二个法线分布表示道路上的点。在这种情况下,检测路沿包括将双峰分布分成两个正态分布,并排除包含路沿点的分布。为了实现这一点,我们使用了计算机视觉中常用的分割和聚类方法,称为Otsu方法(Otsu 1979)。

应用于双峰分布的Otsu方法计算将这两类(在我们的例子中是道路和路沿)分隔开的最佳阈值。这使得排除位于路沿石上的大多数点成为可能,如图4所示,并留下一部分点,其高程遵循正态分布,平均值为µ1,标准偏差为σ1。作为最终检查,为了去除其余的异常值,我们将68–95–99.7规则应用于结果分布,并排除高程位于µ1−σ1和µ1+σ1之外的所有点。

 路沿检测之前(红色)和之后(绿色)的道路地图

区域提取:为了提取可驾驶区域的界限,需要计算投影到(x,y)平面上的道路点云的轮廓。这可以通过使用凹面外壳(CH)(Moreira和Santos 2007)实现,这是一种基于k-最近邻方法的算法,旨在生成描述平面上一组点所占面积的包络线。利用CH生成的包络线构造描述可行驶区域的多边形。

车道绘图

我们定义一条L作为一组点L= {P1,P2,…,PN},其中π={xi,Yi,Zi}是FM帧中的i_0第四点的坐标。车道绘图生成是在道路上帮助自动驾驶车辆导航过程中,使其居中。使用相机数据检测车道,将其投影到激光雷达数据上,进行聚类和平滑处理以生成有意义的航路点,然后使用3D NDT算法的输出与先前的扫描进行累积。图显示了车道绘制过程流程的概述。

车道绘制流程。对来自相机机LaneNET的结果进行平滑和聚类以生成车道分割点云。

检测:对于车道检测,我们使用LaneNET。之所以选择此网络,是因为它能够检测到从前视相机可见的所有车道,而不仅仅是当前车辆的车道。网络输出与输入图像大小相同的掩模图像,其中属于车道的像素被标记和颜色编码。与我们对道路地图所做的类似,mask图像将与激光雷达相机校准相结合,生成车道点云。

投影:由于离汽车越远,激光雷达相机校准的精度就会越低,因此我们首先将“摄像机视场点云”裁剪到距Fl帧原点一定距离L的位置,然后再将车道遮罩投射到其上。这有助于保持车道的形状,因为我们将在前进过程中累积投影和点云。最后,利用颜色分割方法,提取出属于车道的点,形成车道点云。

聚类与平滑:生成的车道点云是有噪声的,并不总是遵循一个连贯的几何体。因此,我们建立了一系列的聚类和平滑步骤,这些步骤将被应用于车道点云,以生成一系列的路径点,这些路径点可以被自主汽车用来知道车道在空间中的位置。平滑和聚类应用于两个不同的层次:首先在Fl帧中处理单个扫描,然后在Fm帧中使用3D-NDT算法的输出将当前扫描与之前的扫描累积在一起。

车道生成:LaneNET有时无法检测到车道,原因可能是亮度/对比度突然变化,车道不在摄像机视野范围内,或者车道根本没有绘制在道路上。我们通过结合检测到的成功车道、路缘检测算法以及道路上的车道是平行的这一事实来处理这个问题。

首先使用路沿检测结果来检查是否检测到所有车道:根据路沿石的位置和车道宽度(由成功检测得出),我们可以判断是否检测到正确的车道数。如果某条车道缺失,我们使用最近的左车道或右车道生成它,方法是将上次扫描获得的车道点拟合为二次曲线,然后将每个点处的曲线法线与车道宽度相结合,生成一条新的车道。

● 实验

实验装置包括一台Lincoln MKZ,配备一台Velodyne Lidar VLP-16和一台FLIR PointGrey RGB摄像机,分别以10 Hz和30 Hz的频率记录。该车还配备了IMU/GPS,以辅助3D NDT算法。数据通过机器人操作系统(ROS)同步并记录为ROS包,然后离线处理。我们使用管道记录并构建了多个高精地图,从中我们选择了5个场景。每一个场景的选择都有特定的原因:

•选择直路是为了证明道路测绘管道中路沿检测步骤的有效性。

•选择CurveLoad以证明车道地图构建流程中平滑和聚类步骤的准确性。

•选择mergeLane是为了证明车道地图构建流程能够处理出现新车道的情况,并且我们不局限于最初的车道。

•选择交叉口来演示合并多张地图的结果。

•选择公路是为了证明构建地图流程在大面积区域仍然有效。

这些结果表明,车道地图流程能够准确标记车道并生成缺失车道

红色是地面真相,蓝色是在路边检测之前,绿色是在后面。

红色车道是地面真相,绿色车道是自动生成的。

总结

在这篇论文中,我们提出了一个自动建立和标注自动驾驶汽车高精地图的流程方案。流程中依赖于深度学习网络的结果,这些网络被训练来检测可驾驶区域和车道。然后,这些结果会自动进行后期处理,以便进行更正、改进或完成。我们的流程处理结果与人工标注的地面真实情况进行了比较,证明了本文所用方法的准确性和有效性。

本文仅做学术分享,如有侵权,请联系删文。

下载1

在「3D视觉工坊」公众号后台回复:3D视觉即可下载 3D视觉相关资料干货,涉及相机标定、三维重建、立体视觉、SLAM、深度学习、点云后处理、多视图几何等方向。

下载2

在「3D视觉工坊」公众号后台回复:3D视觉github资源汇总即可下载包括结构光、标定源码、缺陷检测源码、深度估计与深度补全源码、点云处理相关源码、立体匹配源码、单目、双目3D检测、基于点云的3D检测、6D姿态估计源码汇总等。

下载3

在「3D视觉工坊」公众号后台回复:相机标定即可下载独家相机标定学习课件与视频网址;后台回复:立体匹配即可下载独家立体匹配学习课件与视频网址。

重磅!3DCVer-学术论文写作投稿 交流群已成立

扫码添加小助手微信,可申请加入3D视觉工坊-学术论文写作与投稿 微信交流群,旨在交流顶会、顶刊、SCI、EI等写作与投稿事宜。

同时也可申请加入我们的细分方向交流群,目前主要有3D视觉CV&深度学习SLAM三维重建点云后处理自动驾驶、CV入门、三维测量、VR/AR、3D人脸识别、医疗影像、缺陷检测、行人重识别、目标跟踪、视觉产品落地、视觉竞赛、车牌识别、硬件选型、学术交流、求职交流等微信群。

一定要备注:研究方向+学校/公司+昵称,例如:”3D视觉 + 上海交大 + 静静“。请按照格式备注,可快速被通过且邀请进群。原创投稿也请联系。

▲长按加微信群或投稿

▲长按关注公众号

3D视觉从入门到精通知识星球:针对3D视觉领域的知识点汇总、入门进阶学习路线、最新paper分享、疑问解答四个方面进行深耕,更有各类大厂的算法工程人员进行技术指导。与此同时,星球将联合知名企业发布3D视觉相关算法开发岗位以及项目对接信息,打造成集技术与就业为一体的铁杆粉丝聚集区,近2000星球成员为创造更好的AI世界共同进步,知识星球入口:

学习3D视觉核心技术,扫描查看介绍,3天内无条件退款

 圈里有高质量教程资料、可答疑解惑、助你高效解决问题

觉得有用,麻烦给个赞和在看~  

3D视觉工坊 CSDN认证博客专家 算法 3D视觉
个人公众号:3D视觉工坊。公众号特邀嘉宾及合伙人,先后就职于国内知名研究机构、自动驾驶公司、海康研究院,主要研究方向为深度学习、目标检测、语义分割、图像处理、自动驾驶感知算法等,CSDN博客专家。博主先后任职于国内知名研究院、知名大厂,致力于3D视觉算法、VLAM算法开发,涉及相机标定、手眼标定、结构光、点云后处理、三维重建等相关领域的研究,同时也是CSDN博客专家。3D视觉工坊坚持原创,近一年来输出了非常多的高质量文章,获得了粉丝的一致好评,我们将始终坚持走原创路线,打造一个铁杆粉丝的聚集区。
已标记关键词 清除标记
相关推荐
每种高级语言程序在连接为可执行程序之前,都必须被编译为汇编语言程序,因此对于高级语言程序设计者来说,了解编译器如何生成汇编语言代码十分有用。 本书分为三部分。第一部分讲解汇编语言程序设计环境基础,第二部分研究汇编语言程序设计,最后一部分讲解高级汇编语言技术。本书的主要目的是向使用高级语言的程序员讲解编译器如何从C和C++程序创建汇编语言例程,以及编程人员应如何掌握生成的汇编语言代码,调整汇编语言例程以提高应用程序的性能。 本书适合有一定编程经验的开发人员参考。 本书主要内容: ● 查看高级语言程序生成的汇编语言代码的好处; ● 如何为Linux奔腾处理器环境创建独立的汇编语言程序; ● 如何将高级函数和库整合到汇编语言程序中; ● 如何将汇编语言例程整合到C和C++应用程序中; ● 如何在汇编语言程序中使用Linux系统调用; ● 如何在应用程序中使用奔腾处理器的MMX和SSE功能。 第一部分 汇编语言程序设计环境基础 1 第1章 什么是汇编语言 1 1.1 处理器指令 1 1.1.1 指令码处理 1 1.1.2 指令码格式 2 1.2 高级语言 5 1.2.1 高级语言的种类 5 1.2.2 高级语言的特性 7 1.3 汇编语言 8 1.3.1 操作码助记符 8 1.3.2 定义数据 9 1.3.3 命令 11 1.4 小结 11 第2章 IA-32平台 13 2.1 IA-32处理器的核心部分 13 2.1.1 控制单元 14 2.1.2 执行单元 18 2.1.3 寄存器 19 2.1.4 标志 21 2.2 IA-32的高级特性 23 2.2.1 x87浮点单元 23 2.2.2 多媒体扩展 24 2.2.3 流化SIMD扩展 24 2.2.4 超线程 25 2.3 IA-32处理器系列 25 2.3.1 Intel处理器 25 2.3.2 非Intel处理器 26 2.4 小结 27 第3章 相关的工具 29 3.1 开发工具 29 3.1.1 汇编器 29 3.1.2 连接器 31 3.1.3 调试器 31 3.1.4 编译器 32 3.1.5 目标代码反汇编器 32 3.1.6 简档器 33 3.2 GNU汇编器 33 3.2.1 安装汇编器 33 3.2.2 使用汇编器 35 3.2.3 关于操作码语法 36 3.3 GNU连接器 37 3.4 GNU编译器 39 3.4.1 下载和安装gcc 39 3.4.2 使用gcc 40 3.5 GNU调试器程序 42 3.5.1 下载和安装gdb 42 3.5.2 使用gdb 42 3.6 KDE调试器 44 3.6.1 下载和安装kdbg 44 3.6.2 使用kdbg 45 3.7 GNU objdump程序 46 3.7.1 使用objdump 46 3.7.2 objdump范例 47 3.8 GNU简档器程序 48 3.8.1 使用简档器 48 3.8.2 简档范例 50 3.9 完整的汇编开发系统 51 3.9.1 Linux基础 51 3.9.2 下载和运行MEPIS 52 3.9.3 新的开发系统 53 3.10 小结 53 第4章 汇编语言程序范例 55 4.1 程序的组成 55 4.1.1 定义段 55 4.1.2 定义起始点 55 4.2 创建简单程序 56 4.2.1 CPUID指令 56 4.2.2 范例程序 58 4.2.3 构建可执行程序 60 4.2.4 运行可执行程序 60 4.2.5 使用编译器进行汇编 60 4.3 调试程序 61 4.4 在汇编语言中使用C库函数 65 4.4.1 使用printf 66 4.4.2 连接C库函数 67 4.5 小结 68 第二部分 汇编语言程序设计基础 71 第5章 传送数据 71 5.1 定义数据元素 71 5.1.1 数据段 71 5.1.2 定义静态符号 73 5.1.3 bss段 73 5.2 传送数据元素 75 5.2.1 MOV指令格式 75 5.2.2 把立即数传送到寄存器和内存 76 5.2.3 在寄存器之间传送数据 77 5.2.4 在内存和寄存器之间传送数据 77 5.3 条件传送指令 83 5.3.1 CMOV指令 83 5.3.2 使用CMOV指令 85 5.4 交换数据 86 5.4.1 数据交换指令 87 5.4.2 使用数据交换指令 91 5.5 堆栈 93 5.5.1 堆栈如何工作 93 5.5.2 压入和弹出数据 94 5.5.3 压入和弹出所有寄存器 96 5.5.4 手动使用ESP和EBP寄存器 97 5.6 优化内存访问 97 5.7 小结 98 第6章 控制执行流程 99 6.1 指令指针 99 6.2 无条件分支 100 6.2.1 跳转 100 6.2.2 调用 103 6.2.3 中断 106 6.3 条件分支 106 6.3.1 条件跳转指令 106 6.3.2 比较指令 108 6.3.3 使用标志位的范例 109 6.4 循环 112 6.4.1 循环指令 112 6.4.2 循环范例 113 6.4.3 防止LOOP灾难 113 6.5 模仿高级条件分支 114 6.5.1 if语句 115 6.5.2 for循环 118 6.6 优化分支指令 120 6.6.1 分支预测 120 6.6.2 优化技巧 122 6.7 小结 124 第7章 使用数字 126 7.1 数字数据类型 126 7.2 整数 127 7.2.1 标准整数长度 127 7.2.2 无符号整数 128 7.2.3 带符号整数 129 7.2.4 使用带符号整数 131 7.2.5 扩展整数 131 7.2.6 在GNU汇编器中定义整数 134 7.3 SIMD整数 135 7.3.1 MMX整数 136 7.3.2 传送MMX整数 136 7.3.3 SSE整数 137 7.3.4 传送SSE整数 138 7.4 二进制编码的十进制 139 7.4.1 BCD是什么 140 7.4.2 FPU BCD值 140 7.4.3 传送BCD值 141 7.5 浮点数 142 7.5.1 浮点数是什么 143 7.5.2 标准浮点数据类型 144 7.5.3 IA-32浮点值 146 7.5.4 在GNU汇编器中定义浮点值 146 7.5.5 传送浮点值 146 7.5.6 使用预置的浮点值 148 7.5.7 SSE浮点数据类型 149 7.5.8 传送SSE浮点值 150 7.6 转换 153 7.6.1 转换指令 154 7.6.2 转换范例 154 7.7 小结 155 第8章 基本数学功能 157 8.1 整数运算 157 8.1.1 加法 157 8.1.2 减法 165 8.1.3 递增和递减 169 8.1.4 乘法 169 8.1.5 除法 173 8.2 移位指令 175 8.2.1 移位乘法 175 8.2.2 移位除法 177 8.2.3 循环移位 178 8.3 十进制运算 178 8.3.1 不打包BCD的运算 178 8.3.2 打包BCD的运算 180 8.4 逻辑操作 181 8.4.1 布尔逻辑 182 8.4.2 位测试 182 8.5 小结 183 第9章 高级数学功能 185 9.1 FPU环境 185 9.1.1 FPU寄存器堆栈 185 9.1.2 FPU状态、控制和标记寄存器 185 9.1.3 使用FPU堆栈 190 9.2 基本浮点运算 193 9.3 高级浮点运算 196 9.3.1 浮点功能 196 9.3.2 部分余数 199 9.3.3 三角函数 201 9.3.4 对数函数 203 9.4 浮点条件分支 205 9.4.1 FCOM指令系列 205 9.4.2 FCOMI指令系列 207 9.4.3 FCMOV指令系列 208 9.5 保存和恢复FPU状态 209 9.5.1 保存和恢复FPU环境 209 9.5.2 保存和恢复FPU状态 210 9.6 等待和非等待指令 213 9.7 优化浮点运算 213 9.8 小结 214 第10章 处理字符串 216 10.1 传送字符串 216 10.1.1 MOVS指令 216 10.1.2 REP前缀 220 10.1.3 其他REP指令 224 10.2 存储和加载字符串 225 10.2.1 LODS指令 225 10.2.2 STOS指令 225 10.2.3 构建自己的字符串函数 226 10.3 比较字符串 227 10.3.1 CMPS指令 228 10.3.2 CMPS和REP一起使用 229 10.3.3 字符串不等 230 10.4 扫描字符串 232 10.4.1 SCAS指令 232 10.4.2 搜索多个字符 233 10.4.3 计算字符串长度 235 10.5 小结 236 第11章 使用函数 237 11.1 定义函数 237 11.2 汇编函数 238 11.2.1 编写函数 239 11.2.2 访问函数 240 11.2.3 函数的放置 242 11.2.4 使用寄存器 242 11.2.5 使用全局数据 243 11.3 按照C样式传递数据值 244 11.3.1 回顾堆栈 244 11.3.2 在堆栈之中传递函数参数 244 11.3.3 函数开头和结尾 246 11.3.4 定义局部函数数据 246 11.3.5 清空堆栈 247 11.3.6 范例 248 11.3.7 在操作之中监视堆栈 249 11.4 使用独立的函数文件 252 11.4.1 创建独立的函数文件 252 11.4.2 创建可执行文件 253 11.4.3 调试独立的函数文件 254 11.5 使用命令行参数 255 11.5.1 程序剖析 255 11.5.2 分析堆栈 255 11.5.3 查看命令行参数 257 11.5.4 查看环境变量 258 11.5.5 使用命令行参数的范例 259 11.6 小结 261 第12章 使用Linux系统调用 262 12.1 Linux内核 262 12.1.1 内核组成 262 12.1.2 Linux内核版本 267 12.2 系统调用 268 12.2.1 查找系统调用 268 12.2.2 查找系统调用定义 269 12.2.3 常用系统调用 270 12.3 使用系统调用 271 12.4 复杂的系统调用返回值 275 12.4.1 sysinfo系统调用 276 12.4.2 使用返回结构 277 12.4.3 查看结果 278 12.5 跟踪系统调用 278 12.5.1 strace程序 278 12.5.2 高级strace参数 279 12.5.3 监视程序系统调用 280 12.5.4 附加到正在运行的程序 282 12.6 系统调用和C库 284 12.6.1 C库 284 12.6.2 跟踪C函数 285 12.6.3 系统调用和C库的比较 287 12.7 小结 287 第三部分 高级汇编语言技术 289 第13章 使用内联汇编 289 13.1 什么是内联汇编 289 13.2 基本的内联汇编代码 292 13.2.1 asm格式 292 13.2.2 使用全局C变量 294 13.2.3 使用volatile修饰符 296 13.2.4 使用替换的关键字 296 13.3 扩展asm 296 13.3.1 扩展asm格式 296 13.3.2 指定输入值和输出值 297 13.3.3 使用寄存器 298 13.3.4 使用占位符 299 13.3.5 引用占位符 301 13.3.6 替换的占位符 302 13.3.7 改动的寄存器列表 303 13.3.8 使用内存位置 304 13.3.9 使用浮点值 305 13.3.10 处理跳转 306 13.4 使用内联汇编代码 308 13.4.1 什么是宏 308 13.4.2 C宏函数 309 13.4.3 创建内联汇编宏函数 310 13.5 小结 311 第14章 调用汇编库 312 14.1 创建汇编函数 312 14.2 编译C和汇编程序 313 14.2.1 编译汇编源代码文件 314 14.2.2 使用汇编目标代码文件 314 14.2.3 可执行文件 315 14.3 在C程序中使用汇编函数 317 14.3.1 使用整数返回值 317 14.3.2 使用字符串返回值 318 14.3.3 使用浮点返回值 321 14.3.4 使用多个输入值 322 14.3.5 使用混合数据类型的输入值 323 14.4 在C++程序中使用汇编函数 327 14.5 创建静态库 328 14.5.1 什么是静态库 328 14.5.2 ar命令 328 14.5.3 创建静态库文件 329 14.5.4 编译静态库 331 14.6 使用共享库 331 14.6.1 什么是共享库 331 14.6.2 创建共享库 332 14.6.3 编译共享库 332 14.6.4 运行使用共享库的程序 333 14.7 调试汇编函数 334 14.7.1 调试C程序 334 14.7.2 调试汇编函数 336 14.8 小结 337 第15章 优化例程 338 15.1 优化编译器代码 338 15.1.1 编译器优化级别1 338 15.1.2 编译器优化级别2 339 15.1.3 编译器优化级别3 341 15.2 创建优化的代码 341 15.2.1 生成汇编语言代码 341 15.2.2 查看优化的代码 344 15.2.3 重新编译优化的代码 345 15.3 优化技巧 345 15.3.1 优化运算 345 15.3.2 优化变量 348 15.3.3 优化循环 352 15.3.4 优化条件分支 356 15.3.5 通用子表达式消除 361 15.4 小结 363 第16章 使用文件 365 16.1 文件处理顺序 365 16.2 打开和关闭文件 366 16.2.1 访问类型 366 16.2.2 UNIX权限 367 16.2.3 打开文件代码 368 16.2.4 打开错误返回代码 369 16.2.5 关闭文件 370 16.3 写入文件 370 16.3.1 简单的写入范例 370 16.3.2 改变文件访问模式 372 16.3.3 处理文件错误 372 16.4 读取文件 373 16.4.1 简单的读取范例 374 16.4.2 更加复杂的读取范例 375 16.5 读取、处理和写入数据 377 16.6 内存映射文件 379 16.6.1 什么是内存映射文件 379 16.6.2 mmap系统调用 380 16.6.3 mmap汇编语言格式 381 16.6.4 mmap范例 383 16.7 小结 387 第17章 使用高级IA-32特性 388 17.1 SIMD简介 388 17.1.1 MMX 388 17.1.2 SSE 389 17.1.3 SSE2 389 17.2 检测支持的SIMD操作 390 17.2.1 检测支持 390 17.2.2 SIMD特性程序 391 17.3 使用MMX指令 392 17.3.1 加载和获得打包的整数值 393 17.3.2 执行MMX操作 393 17.4 使用SSE指令 400 17.4.1 传送数据 400 17.4.2 处理数据 401 17.5 使用SSE2指令 405 17.5.1 传送数据 405 17.5.2 处理数据 406 17.6 SSE3指令 408 17.7 小结 409
©️2020 CSDN 皮肤主题: 书香水墨 设计师:CSDN官方博客 返回首页
实付 49.90元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值