当前位置: 首页 > news >正文

d跨语言链接优化

原文
使用LDC(LTO)链接时优化的简短文章,包含演示了如何提高程序性能简单示例.因为LTOLLVMIR级别工作,因此可跨越C++/D语言优化!

重要提示:LDC/LLVMLTO窗口上不可用.

链接时优化

(LTO)链接时优化是指链接时的程序优化.链接器提取所有目标文件在一起,并合并一个程序中.链接器可看见整个程序,因此可分析和优化整个程序.
但是,一般链接器只有在程序已转换为机器码时才可见程序.在该级别上,应仍可优化,但这很难.不能使用GCCLLVM的优化器.

GCC相同,LLVMLTO机制基于传递LLVM优化器可理解的(LLVMIR)代码给链接器,从而可在链接过程中执行全程序分析和优化.

所谓的"完整"LTO组合单独目标文件的所有LLVMIR代码到一个大的LLVM模块中,然后优化它并如常生成机器码.
"ThinLTO"分开模块,但从其他模块按需导入函数,并并行优化和生成机器码.更多

可在一次编译调用中改进全LTO的所有优化,一次编译就可.一次编译所有是配音(dub),也是目前LDC自身(D部分)的构建方式.

LTO而不是一次编译的优点是,LTO的(部分)编译是并行完成的.对完整的LTO(-flto=full),只有语义分析是并行完成的,而优化和生成机器码是在单线程中完成的.
ThinLTO(-flto=thin),除全局分析步骤外,所有步骤都是并行完成的.因此,ThinLTO比全LTO一次编译快得多,尤其是在拥有多个可用内核机器时.

要使用LTO,只需要在命令行上指定-flto=thin-flto=full!

链接器支持

LTO的工作方式是,编译器输出的目标文件不是普通目标文件:它们是LLVMIR位码文件,仅由目标文件扩展名伪装成目标文件.表明链接器必须支持此LLVM的LTO机制.

MacOSX上,LLVM/Clang用作系统编译器,链接器知道如何用libLTO.DYLIB库处理LTO.适合MacOSXLDC附带此库,因此它是LDCLLVM版本的最新版本.

Linux上,黄金链接器支持插件,LLVM黄金插件用来处理LTO.
然后,可复制二进制文件LDClib目录,或传递-flto-binary=<pluginfile>LDC,以便链接器可找到它.
LTO选项(如增量构建的ThinLTO缓存)可像一般的链接器选项一样传递:

OS X: ldc2 -L-cache_path_lto -L/path/to/cache ...
gold: ldc2 -L-plugin-opt=cache-dir=/path/to/cache ...

简单示例

考虑以下示例,代码分布在(lto_a.dlto_b.d)两个文件中:

// File lto_b.d
//用`extern(C++)`来允许用`C++`定义它
extern(C++) void doesNothing() {}
// File lto_a.d
extern(C++) void doesNothing(); //仅声明void main() {for (ulong i = 0; i < 1_000_000_000; ++i) {doesNothing();}
}

先编译lto_b.dlto_b.o,然后再编译lto_a.d,并与lto_b.o链接.该程序闲着,优化器应可弄清楚这一点,但是,优化器不能.编译lto_a.d时,它不知道Nothing()做了什么,因此不能做太多优化:程序循环1亿次调用立即返回的函数.在我机器上,大约需要2秒:

>  ldc2 -c -O3 lto_b.d -of=lto_b.o
>  ldc2 -O3 lto_a.d lto_b.o -of=program
>  time ./program
./program  1.81s user 0.01s system 98% cpu 1.845 total

使用LTO,导入doesNothing()lto_a模块中,优化器可发挥其神力:

>  ldc2 -c -O3 -flto=thin lto_b.d -of=lto_b.o
>  ldc2 -O3 -flto=thin lto_a.d lto_b.o -of=program_lto
>  time ./program_lto
./program_lto 0.00s 用户 0.00s 系统 28% CPU 总计 0.012 总计

一次编译器调用中,编译所有源码可获得相同运行时:

>  ldc2 -O3 lto_a.d lto_b.d -of=program_allatonce
>  time ./program_allatonce
./program_allatonce  0.00s user 0.00s system 44% cpu 0.008 total

打破C++/D语言障碍

D可(相对)轻松地与C++代码互操作.LDC自身就是个很好示例:LDC的前端是用D编写的,而它的后端(LLVM)是用C++编写的.
但是,不能一次编译所有源码来跨C++/D语言优化,因为C++D的编译器都无法理解对方.因此,如下C++函数不会内联到D函数中:

// File lto_b.cpp
void doesNothing() {}
>  clang -c -O3 lto_b.cpp -o lto_b.o
>  ldc2 -O3 lto_a.d lto_b.o -of=program_cpp
>  time ./program_cpp
./program_cpp  2.09s user 0.01s system 99% cpu 2.125 total

好消息是:LTO没有语言障碍.因为LTOLLVMIR级别工作,且LDCClang都编译为相同的LLVMIR语言,因此仅C++,仅DC++/D混合程序可实现相同优化潜力!

对给定示例,可通过以下构建步骤减少执行时间"零":

>  clang -c -O3 -flto=thin lto_b.cpp -o lto_b.o
>  ldc2 -O3 -flto=thin lto_a.d lto_b.o -of=program_cpp_lto -mtriple=x86_64-apple-macosx10.11.0
>  time ./program_cpp_lto
./program_cpp_lto  0.00s user 0.00s system 61% cpu 0.005 total

注意,调用ldc2时,必须显式指定目标三元组(这仅在OSX上需要).在MacOSX上,LDCClang默认使用略有不同的三元组.
三元组不同时,LTO代码生成器会抱怨.有趣的是,反向调用编译器时不需要显式提及三元组,但是必须显式传递D运行时库给Clang.

相关文章:

d跨语言链接优化

原文 使用LDC的(LTO)链接时优化的简短文章,包含演示了如何提高程序性能的简单示例.因为LTO在LLVMIR级别工作,因此可跨越C/D语言优化! 重要提示:LDC/LLVM的LTO在窗口上不可用. 链接时优化 (LTO)链接时优化是指链接时的程序优化.链接器提取所有目标文件在一起,并合并到一个程序…...

【Linux】-- 进程概念的引入

目录 硬件 冯诺依曼体系结构 冯诺依曼体系结构推导 重点概念 网络数据流向 软件 操作系统(Operator System - OS) 概念 定位 进程内核数据结构PCB&#xff08;task_struct&#xff09; 通过系统调用创建进程-fork初始 fork基本用法 使用if进行分流 查看运行效果 …...

一文看懂“低代码、零代码”是什么?有什么区别?

低代码和零代码近几年热度一直居高不下&#xff0c;乍一看&#xff0c;很容易混淆低代码和零代码开发平台—— 因为它们都是传统开发的替代方案&#xff0c;旨在通过类似于可视化编程的功能加速软件开发过程。 但二者根本不是一回事。从开发人员经验 、目标角色到使用场景&…...

【华为OD机试真题】去除多余的空格(java)

去除多余空格 知识点字符串数组Q队列时间限制:2s空间限制:256MB限定语言:不限 题目描述: 去除文本多余空格,但不去除配对单引号之间的多余空格。给出关键词的起始和结束 下标,去除多余空格后刷新关键词的起始和结束下标。 输入: Life is painting a picture, not …...

【SQL 必知必会】- 第十三课 创建高级联结

目录 使用表别名 Oracle 中没有AS 使用不同类型的联结 自联结 用自联结而不用子查询 自然联结 外联结 全外联结 使用带聚集函数的联结 使用联结和联结条件 使用表别名 SQL 除了可以对列名和计算字段使用别名&#xff0c;还允许给表名起别名。这样做有两个主要理由&#xff…...

ios逆向工具有那些

以下是一些常用的 iOS 逆向工具&#xff1a; Cycript&#xff1a;一种用于在运行时动态分析和修改 iOS 应用程序的强大工具&#xff0c;可以与应用程序进行交互式调试和注入代码。 Frida&#xff1a;一个强大的动态二进制插桩工具&#xff0c;可以在运行时修改应用程序的行为&…...

【软件设计师14】UML建模

UML建模 稳定出一个&#xff0c;但是由于UML的图比较多&#xff0c;所以这种题比数据流图和数据库难度高 一般都会考用例图和类图&#xff0c;再附加其他的图 1. 用例图 包含关系include&#xff1a;比如登记外借信息必须先有用户登录 扩展关系extend&#xff1a;修改书籍…...

容器镜像的设计原理

1 概述&#xff1a; 1.1 历史概要 2016年&#xff0c;Docker制定了镜像规范v2&#xff0c;并在Docker 1.10中实现了这个规范。镜像规范v2分为Schema 1和Schema 2。 Schema 1主要兼容使用v1规范的Docker客户端&#xff08;从2017年2月起&#xff0c;镜像规范v1不再被Registry支…...

arm64异常向量表

arm64异常向量表1 arm64异常向量表2 linux arm64异常向量表3 kernel_ventry宏4 异常向量表的保存4. VBAR_ELx寄存器4.2 __primary_switched4.3 __primary_switched1 arm64异常向量表 When an exception occurs, the processor must execute handler code which corresponds to …...

【测试面试】吐血整理,大厂测试开发岗面试题(1~4面),拿下年40w...

目录&#xff1a;导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09;前言 自动化测试面试题&am…...

SpringSecurity之权限模块设计

目录 前言 实现思路 代码结构 使用说明 前言 前面我们了解了关于微服务权限设计方案以及J W T的相关介绍&#xff0c;今天我们来聊一下&#xff0c;如何避免自己重复的写相同的代码&#xff0c;一次代码实现&#xff0c;即可完美复制到任何项目中实现权限相关的功能。 实现…...

002_双指针法

1.移除元素 目标&#xff1a;移除数组中的某一个元素 数组的元素在内存地址中是连续的&#xff0c;不能单独删除数组中的某个元素&#xff0c;只能覆盖。 1.1暴力解法 建立两个for循环&#xff0c;当查找到某个元素以后&#xff0c;将此元素后面的元素全部往前移动 时间复…...

超实用的 Linux 高级命令,程序员一定要懂

前言 在运维的坑里摸爬滚打好几年了&#xff0c;我还记得我刚开始的时候&#xff0c;我只会使用一些简单的命令&#xff0c;写脚本的时候&#xff0c;也是要多简单有多简单&#xff0c;所以有时候写出来的脚本又长又臭。 像一些高级点的命令&#xff0c;比如说 Xargs 命令、管…...

AI+明厨亮灶智能算法 yolo

AI明厨亮灶智能算法通过pythonyolo网络模型分析算法&#xff0c;AI明厨亮灶模型算法可接对后厨实现如口罩识别、厨师服穿戴、夜间老鼠监测、厨师帽识别、厨师玩手机打电话识别、抽烟识别等实时分析监测。Python是一种由Guido van Rossum开发的通用编程语言&#xff0c;它很快就…...

gRPC-Go源码解读一 客户端请求链路分析

最近在学习gRPC相关的知识&#xff0c;为啥要学呢&#xff1f;因为一直在用&#xff0c;古人云&#xff0c;“工欲善其事&#xff0c;必先利其器”。为此&#xff0c;花了不少时间阅读gRPC-Go的源码&#xff0c;收货甚多&#xff0c;比如透过服务发现和负载均衡这俩组件来学习复…...

Word控件Spire.Doc for .net 功能详解

Spire.Doc for .NET是一款专门对 Word 文档进行操作的 .NET 类库。在于帮助开发人员无需安装 Microsoft Word情况下&#xff0c;轻松快捷高效地创建、编辑、转换和打印 Microsoft Word 文档。拥有近10年专业开发经验Spire系列办公文档开发工具&#xff0c;专注于创建、编辑、转…...

联想服务器配置RAID

一、背景描述 目前有台联想服务器&#xff0c;配置如下&#xff1a; CPU&#xff1a;2颗处理器&#xff0c;40核 内存&#xff1a;512GB 磁盘&#xff1a;2*960GB SATA 4*2.4TB SAS 计划在联想物理机上安装 Vmware 的 ESXi 6.7 虚拟化管理软件&#xff0c;作为虚拟化服务器。…...

C++ 虚函数表

在 C 中&#xff0c;虚函数表&#xff08;Virtual Function Table&#xff0c;简称 vtable&#xff09;是一种用于实现多态性&#xff08;Polymorphism&#xff09;的机制。它是一种编译器和链接器生成的数据结构&#xff0c;用于处理虚函数调用。 虚函数是在基类中声明的&…...

rancher2.7丢失集群信息

使用Docker 单节点安装rancher&#xff0c;然后在rancher中创建了一个k8s的集群。重启rancher所在的虚拟机后&#xff0c;登录rancher发现这是新的实例&#xff0c;集群信息丢失了。但是k8s集群还是好好的。 检查k8s的日志&#xff0c;api server日志会报错 time"2023-0…...

数据库管理-第六十八期 Oracle 23c的其他(20230417)

数据库管理 2023-04-17第六十八期 Oracle 23c的其他1 DGPDB2 无锁并发总结第六十八期 Oracle 23c的其他 由于Oracle 23c的文档相对较少&#xff0c;一是当前文档主要面向开发人员&#xff0c;二是感觉实际内容还在不断增加&#xff0c;主要还有一点就是各种新特性的在官方文档…...

精准关键词获取-行业搜索词分析

SEO关键词的收集通常可以通过以下几种方法&#xff1a; 根据市场价值、搜索词竞争性和企业实际产品特征进行筛选&#xff1a;确定您的关键词列表之前&#xff0c;建议先进行市场分析&#xff0c;了解您的竞争对手、行业状况和目标受众等信息&#xff0c;以更好的了解所需的特定…...

c++学习之c++对c的扩展1

目录 1.面向过程与面向对象的编程 2.面向对象编程的三大特点 3.c对c的扩展&#xff1a; 1.作用域运算符&#xff1a;&#xff1a; 2.命名空间 1.c命名空间&#xff08;namespace&#xff09; 2.命名空间的使用 1.在不同命名空间内可以创建相同的名称 2.命名空间只能在全…...

Redis锁的租约问题

目录Redis的租约问题Redis租约问题的想法Redis租约问题的解决方案Redis的租约问题 首先我们先来说一说什么是Redis的租约问题。   在我们实现Redis分布式锁的时候&#xff0c;我们会出现Redis锁的时间<业务执行执行时间&#xff0c;这其实就是一个典型的租约问题&#xf…...

2023年全国最新高校辅导员精选真题及答案50

百分百题库提供高校辅导员考试试题、辅导员考试预测题、高校辅导员考试真题、辅导员证考试题库等&#xff0c;提供在线做题刷题&#xff0c;在线模拟考试&#xff0c;助你考试轻松过关。 94.一般认为&#xff0c;在具有了道德认知和道德情感的情况下&#xff0c;道德行为的产生…...

mall商城之k8s部署-4

文章目录 一、k8s部署应用服务1)master拷贝yaml2)批量修改镜像地址3)批量修改nacos地址3)创建命名空间4)创建取sercet5)配置yaml6)对象存储oss7)查看nacos1、导入配置文件2、修改配置文件8)部署到ms命名空间一、k8s部署应用服务 1)master拷贝yaml #将源码文件 mkdi…...

使用Go语言打造轻量级Web框架

前言 Web框架是Web开发中不可或缺的组件。它们的主要目标是抽象出HTTP请求和响应的细节&#xff0c;使开发人员可以更专注于业务逻辑的实现。在本篇文章中&#xff0c;我们将使用Go语言实现一个简单的Web框架&#xff0c;类似于Gin框架。 功能 我们的Web框架需要实现以下功能…...

【开源项目】BallCat 项目脚手架

简介 &#x1f389;&#x1f389;&#x1f389; 基于 React 和 Ant Design 版本的前端 ballcat-ui-react 已发布&#xff0c;欢迎大家尝鲜使用 BallCat 组织旨在为项目快速开发提供一系列的基础能力&#xff0c;方便使用者根据项目需求快速进行功能拓展。 在以前使用其他后台管…...

KlayGE-004-InputCaps 例子分析

InputCaps处理外部输入的事件 该例子主要由两部分内容&#xff1a; 外部输入事件获取 ​ 可以处理keyboard、mouse、joystick、touch、sensor的输入事件 显示一个ui图标按钮 Input 定义监听事件类型&#xff1a; KlayGE::InputActionDefine actions[] {InputActionDefin…...

组装机经验、软硬件故障排除、网络问题

目录 主板 CPU 内存 显卡 判断显卡好坏的步骤 新买的显卡安装后显示器不亮 电源 其他 网络问题 主板 1.不同主板对于不同数量的内存条安装的位置有要求&#xff0c;要按照主板规定的位置安装不同数量的内存条&#xff0c;特别是服务器主板&#xff0c;否则系统可能起…...

【行为型模式】责任链模式

文章目录1、简介2、结构3、实现方式3.1、案例引入3.2、结构分析3.3、具体实现4、责任链优缺点5、应用场景1、简介 责任链模式(Chain of Responsibility)是一种行为型设计模式&#xff0c;它允许对象在链上依次处理请求&#xff0c;用户只需要将请求发送到责任链上即可&#xf…...