编译器 编译过程 compiling 动态链接库 Linking 接口ABI LTO PGO inline bazel增量编译

编译器 编译过程 compiling 动态链接库 Linking 接口ABI LTO PGO

Theory

  • Shared Library Symbol Conflicts (on Linux)

    • 从左往右查找:Note that the linker only looks further down the line when looking for symbols used by but not defined in the current lib.
  • Linux 下 C++so 热更新

  • ABI (Application Binary Interface)

    • 应用程序的二进制接口,对于一个二进制的动态库或者静态库而言,可以详细描述在其中的函数的调用方式,定义在其中的数据类型的大小,数据结构的内存布局方式等信息
    • ABI 信息 对不同操作系统、不同编译链版本、不同二进制库对应源码版本 有或大或小的差异,从而造成预编译二进制库的兼容性问题,导致 compile error 或 执行时coredump
  • 编译器有能力让不同 target 的 cpp 文件的不同编译选项,有区分地生效。但无法控制其它cpp文件对头文件的使用,因此头文件为主体的开源项目,经常不得不很小心地去处理各种使用情况。

Linking

linking with libraries: -lXXX

  • statically-linked library: libXXX.a(lib)
  • dynamically-linked library : libXXX.so(dll)
  • -I /foo/bar : 头文件路径 compile line
  • -L 库文件路径: link line

Separate Compilation: -c, 只产生object file, 不link, 后面联合link-editor

LTO (Link Time Optimization)
  • 本质想解决的问题:编译 a.cpp 的时候看不到 b.cpp,编译器做不了优化
  • 解决方法:翻译 a.cpp 代码成中间语言 (LLVM IR Bitcode),放到 a.o 里;链接阶段把它们都放在一起,一个大文件来做优化
  • 运行方式:linker调用编译器提供的plugin
  • 开启方式:-flto
GTC2022 - Automated Performance Improvement Using CUDA Link Time Optimization [S41595]
  • CUDA 5.0:separate compilation

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • LTO

    • how to use 如上图
    • Partial LTO,需要 execuable 支持 LTO
  • JIT LTO (just in time LTO)

    • linking is performed at runtime
    • Generation of LTO IR is either offline with nvcc, or at runtime with nvrtc
  • Use JIT LTO

    • 用法见下图
    • The CUDA math libraries (cuFFT, cuSPARSE, etc) are starting to use JIT LTO; see GTC Fall 2021 talk “JIT LTO Adoption in cuSPARSE/cuFFT: Use Case Overview”
      • indirect user callback 转化为 JIT LTO callback
      • another use case: configure the used kernels —> minimal library size
// Use nvrtc to generate the LTOIR (“input” is CUDA C++ string):
nvrtcProgram prog;
nvrtcCreateProgram(&prog, input, name, 0, nullptr, nullptr);
const char *options[2] = {"-dlto", "-dc"};
const nvrtcResult result = nvrtcCompileProgram(prog, 2, options);
size_t irSize;
nvrtcGetNVVMSize(prog, &irSize);
char *ltoIR = (char*)malloc(irSize);
nvrtcGetNVVM(prog, ltoIR); // returns LTO IR

// LTO inputs are then passed to cuLink* driver APIs, so linking is performed at runtime
CUlinkState state;
CUjit_option jitOptions[] = {CUjit_option::CU_JIT_LTO};
void *jitOptionValues[] = {(void*) 1};
cuLinkCreate(1, jitOptions, jitOptionValues, &state);
cuLinkAddData(state, CUjitInputType::CU_JIT_INPUT_NVVM,
ltoIR, irSize, name, 0, NULL, NULL);
cuLinkAddData( /* another input */);
size_t size;
void *linkedCubin;
cuLinkComplete(state, linkedCubin, &size);
cuModuleLoadData(&mod, linkedCubin);

// Math libraries hide the cuLink details in their CreatePlan APIs.
  • LTO WITH REFERENCE INFORMATION
    • Starting in CUDA 11.7, nvcc will track host references to device code, which LTO can use to remove unused code.
    • JIT LTO needs user to tell it this information, so new cuLinkCreate options:
      • CU_JIT_REFERENCED_KERNEL_NAMES
      • CU_JIT_REFERENCED_VARIABLE_NAMES
      • CU_JIT_OPTIMIZE_UNUSED_DEVICE_VARIABLES
      • The *NAMES strings use implicit wildcards, so “foo” will match a mangled name like “Z3fooi”.
__device__ int array1[1024];
__device__ int array2[256];
__global__ void kernel1 (void) {
… array1[i]…
}
__global__ void kernel2 (void) {
… array2[i]…
}
….
kernel2<<<1,1>>>(); // host code launches kernel2
  • 收益来源
    • Much of the speedup comes from cross-file inlining, which then helps keep the data in registers.
    • Seeing the whole callgraph also helps to remove any dead code.
  • References:
    • https://developer.nvidia.com/blog/improving-gpu-app-performance-with-cuda-11-2-device-lto/ – offline LTO
    • https://developer.nvidia.com/blog/discovering-new-features-in-cuda-11-4/ – JIT LTO
    • https://docs.nvidia.com/cuda/cuda-compiler-driver-nvcc/index.html#optimization-of-separate-compilation – nvcc
    • https://docs.nvidia.com/cuda/nvrtc/index.html – nvrtc
    • https://docs.nvidia.com/cuda/nvrtc/index.html – cuLink APIs
    • https://docs.nvidia.com/cuda/nvrtc/index.html – compatibility guarantees
    • Application paper
PGO (Profile Guided Optimization)

PGO(Profile Guided Optimization)是一种代码优化技术,它根据程序运行时的行为来优化代码。以下是关于PGO的详细介绍:

工作原理:PGO的基本思想是在程序运行时对代码进行测量,并使用这些测量数据来优化代码。例如,如果某个函数在运行时经常被调用,则可以使用PGO优化来使这个函数的执行速度更快。PGO通过缩小代码大小、减少分支错误预测和重新组织代码布局来减少指令缓存问题,从而提高应用程序性能。
工作阶段:PGO优化通常包含三个阶段或步骤。首先,编译器从源代码和编译器的特殊代码创建并链接插桩程序。然后,运行检测的可执行文件,每次执行检测代码时,检测程序都会生成一个动态信息文件,该文件用于最终编译。最后,在第二次编译时,动态信息文件将合并到摘要文件中。使用此文件中的配置文件信息摘要,编译器尝试优化程序中旅行最频繁的路径的执行。
应用场景:PGO特别适合于大型复杂项目,因为当项目代码量大且复杂时,手动寻找性能问题变得困难,而PGO可以快速定位问题点。此外,对于性能敏感应用,如实时性要求高的游戏引擎、数据库系统或科学计算应用,PGO的优化效果可能更为显著。同时,PGO还可以集成到自动化测试和构建流程中,每次迭代后自动分析性能变化,确保优化方向正确。
工具支持:PGO优化可以通过使用编译器工具链来实现,例如GCC和Clang。这些工具可以通过命令行或者集成开发环境(IDE)进行使用。同时,有一些专门的工具如PGOAnalyzer,它提供了跨平台支持、易用性、深度洞察和开源社区等优势,可以帮助开发者更好地利用PGO优化技术。

C++

  • 常用编译宏
    • inline
      • inline 的坏处:代码变多了,变量变多了,可能寄存器不够分配了,只能偷内存,性能变差,尤其是发生在 loop 中
      • 编译器基本无视普通的 inline 关键字,根据自己的决策来做,内部有 cost model 评判 inline 是否有收益
      • 如果一个inline会在多个源文件中被用到,那么必须把它定义在头文件中,否则会找不到符号
#pragma once

#define likely(x) __builtin_expect(!!(x), 1)
#define unlikely(x) __builtin_expect(!!(x)<

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【C++题解】1697. 请输出n~1之间所有的整数

问题:1697. 请输出n~1之间所有的整数 类型&#xff1a;循环 题目描述&#xff1a; 从键盘读入一个整数 n &#xff0c;请输出 n∼1 之间所有的整数&#xff0c;每行输出 1 个。 比如&#xff0c;假设读入 n5 &#xff0c;输出结果如下&#xff1a; 5 4 3 2 1 输入&#xff1…

第199题|关于函数的周期性问题|函数强化训练(六)|武忠祥老师每日一题 5月24日

解题思路&#xff1a;解这道题我们要用到下面这个结论 f(x)连续&#xff0c;以T为周期时&#xff0c;原函数以T为周期的充分必要条件是&#xff1a; (A) sin x显然是以π为周期的&#xff0c;我们可以看到并不等于0,根据结论&#xff0c;A的原函数显然不是周期函数。 (B) 的…

移动端仪表盘,支持更多组件

05/22 主要更新模块概览 定位函数 快捷筛选 轨迹图表 时间组件 01 表单管理 1.1 【表单组件】- 表单关联新增支持自定义按钮样式 说明&#xff1a; 表单关联-关联数据按钮&#xff0c;原仅支持默认按钮样式&#xff0c;现增加关联数据按钮自定义功能&#xff0c;满…

【传知代码】掩码自回归编码器法(论文复现)

前言&#xff1a;在探索现代数据科学的前沿领域时&#xff0c;掩码自回归编码器法&#xff08;Masked Autoencoder&#xff0c;简称MAE&#xff09;无疑是一个引人注目的亮点。这一技术&#xff0c;凭借其独特的训练机制和卓越的性能&#xff0c;已经在图像识别、自然语言处理以…

《我的阿勒泰》观后感(二、返璞归真也是一种美)

看了李娟的小说《我的阿勒泰》逐渐悟到一个道理&#xff0c;返璞归真也是一种美&#xff0c;没必要每个人的人生三十年的年华&#xff0c;都去追求房子&#xff0c;车子等逐渐贬值的东西。人究竟应该追求怎样的一种活法&#xff1f; 什么是城市化&#xff1f;这是我听到的最好…

osgearth 3.5 vs 2019编译

下载源码 git clone --recurse-submodules https://github.com/gwaldron/osgearth.git 修改配置文件 主要是修改bootstrap_vcpkg.bat&#xff0c;一处是vs的版本&#xff0c;第二处是-DCMAKE_BUILD_TYPERELEASE 构建 执行bootstrap_vcpkg.bat vs中生成安装 vs2019打开bu…

spring boot打的包直接运行

Spring Boot 提供了一个插件 spring-boot-maven-plugin 把程序打包成一个可执行的jar包&#xff0c;直接执行java -jar xxx.jar即可以启动程序 1、引用 spring-boot-maven-plugin插件 <build><plugins><plugin><groupId>org.springframework.boot<…

LED显示屏的智能化发展与未来趋势

摘要&#xff1a;随着智能化技术的飞速发展&#xff0c;LED显示屏行业也迎来了新的变革。本文将探讨LED显示屏的智能化发展方向&#xff0c;包括人屏互动、大屏中控智能化&#xff0c;以及智能LED显示屏在不同领域的应用前景。 1、引言 在智能化浪潮的推动下&#xff0c;LED显示…

GPT-4o: 未来的智能助手

GPT-4o: 未来的智能助手 在这个信息爆炸的时代&#xff0c;人工智能&#xff08;AI&#xff09;已经成为我们生活中不可或缺的一部分。作为OpenAI最新推出的语言模型&#xff0c;GPT-4o不仅继承了前几代模型的优点&#xff0c;还在多个方面进行了显著的提升。本文将带你深入了解…

家政预约小程序03分类管理

目录 1 创建数据源2 搭建导航菜单3 搭建小程序4 设置变量5 变量绑定总结 家政预约小程序里&#xff0c;在首页需要展示家政可以开展的各类业务。我们把业务按照类别进行划分&#xff0c;本篇我们介绍一下管理后台的维护功能以及小程序的展示功能。 1 创建数据源 为了管理和展示…

WiFi蓝牙模块开发配置过程中需要注意的细节

在很多产品的应用场景中&#xff0c;WIFI网络会给我们提供很多便捷&#xff0c;MCU开发中大多使用串口WIFI蓝牙模块来实现产品接入WIFI网络中。   具体的使用模型如下图所示&#xff1a;整个系统涉及到WIFI网络、手机、服务器平台以及我们设计的产品&#xff0c;一个完整的生…

uniapp+php服务端实现苹果iap内购的消耗性项目和非续期订阅项目,前后端代码加逻辑分析

前言&#xff1a;公司的项目app在上架苹果商店时发现人家要求里面的部分购买项目必须使用iap购买的方式&#xff0c;使用原本的微信支付方式审核不给通过&#xff0c;无奈只能重新研究这个东西。做起来还是有点麻烦&#xff0c;主要是网上的文章很少&#xff0c;不能直接硬抄。…

彩信JSON接口对接发送

随着通讯技术的飞速发展&#xff0c;传统的短信已经无法满足人们日益增长的沟通需求。在这样的背景下&#xff0c;群发彩信作为一种更为先进、更为丰富的信息传递方式&#xff0c;逐渐受到了企业和个人的青睐。那么&#xff0c;群发彩信应该怎么对接&#xff0c;又具体有哪些优…

经常碰到的20个等待事件

经常碰到的20个等待事件 oracle等待事件简介 DBA团队维护的部分应用运行在oracle数据库平台&#xff0c;为及时了解数据库的运行情况&#xff0c;需要建立涵盖各个维度的监控体系&#xff0c;包括实例状态、空间使用率、ORA错误等数十项监控指标。这其中有一个有效判断数据库…

Parasoft C++Test软件静态分析操作指南_软件质量度量

系列文章目录 Parasoft CTest软件安装指南 Parasoft CTest软件静态分析操作指南_编码规范/标准检查 Parasoft CTest软件静态分析操作指南_软件质量度量 Parasoft CTest软件静态分析_自动提取静态分析数据生成文档 Parasoft CTest软件单元测试_操作指南 Parasoft CTest软件单元…

Mqtt_Java_IDEA中编写“发布者”和“订阅者”

1Java创建项目 2导入依赖 将下面Mqtt的库名复制到 <dependencies> 下面 <dependency><groupId>org.eclipse.paho</groupId><artifactId>org.eclipse.paho.client.mqttv3</artifactId><version>1.2.5</version></d…

20212416 2023-2024-2 《移动平台开发与实践》第5次作业

百度地图应用 1.实验内容2.实验过程2.1 Android Studio配置2.1. 创建一个Android项目2.2 在项目中本地集成BaiduMap SDK 2.2 编写代码2.2.1 配置AndroidManifest.xml文件2.2.2 编写UI界面布局文件2.2.3 编写主函数代码2.2.4 运行结果 3.学习中遇到的问题及解决4.学习感悟与思考…

netdiscover一键收集子网内的所有信息(KALI工具系列六)

目录 1、KALI LINUX简介 2、netdiscover工具简介 3、在KALI中使用netdiscover 3.1 目标主机IP&#xff08;win&#xff09; 3.2 KALI的IP 4、命令示例 4.1 扫描子网整个网段 4.2 指定网卡进行扫描 4.3 扫描网卡的公共网络 4.4 快速扫描网卡的公共lan地址 4.5 设置…

网络拓扑—DHCP服务配置

文章目录 DHCP服务搭建相关配置细节前提安装DHCP服务 DHCP服务搭建 相关配置细节前提 系统&#xff1a;Windows Server 2003 IP网段&#xff1a;10.0.0.0/24 三台机子&#xff1a; 普通PC机 DHCP服务器 路由器&#xff08;两块网卡&#xff0c;连接内外网&#xff09; //注…

Java进阶学习笔记6——继承的介绍

继承的学习目标&#xff1a; 认识继承&#xff1b; 继承的好处、应用场景 什么是继承&#xff1f; Java中提供了一个关键字extends&#xff0c;用这个关键字&#xff0c;可以让一个类和另外一个类建立父子关系。 继承的特点: 子类能继承父类的非私有成员&#xff08;成员变…