Makefile并发执行

引言

最近在编译项目代码的时候,发现全量编译一次代码需要十分钟,加了多核编译参数之后,还会出现各种错误,导致编译失败。于是我就想改造下makefile文件,使其能够多核编译,经过改造之后,效果显著,8核编译的情况下,只要1分半,编译速度提高了7倍(为之惊奇)。

多核编译失败的原因

要实现多核编译最重要的一点就是:确定正确的依赖关系。如下Makefile文件:

all: d c b a
a: # 执行一些规则
b: c# 执行一些规则
c: d# 执行一些规则
d:# 执行一些规则

如果直接执行make all,完全没有问题,他会依照d、c、b、a的顺序去执行各个规则。那我如果使用make all -j4会怎么样?那么就有可能是a、d先并行执行,然后再c、d顺序去执行。因为依赖关系是c依赖d,那么必须等d执行完,而b又依赖c,就得等c执行完。那么问题来了:如果a实际上要依赖b呢?必须等b执行完产出a执行时所依赖的文件。那么很明显,此时多核编译就会失败。

如何提高多核编译的效率

不要在一个目标下写多个规则或者命令,因为那样会导致他们只能是串行执行,如下:

a:make all -C dir1make all -C dir2make all -C dir3

上述写法就只能串行执行各个命令。改成如下方式:

DIRS = dir1 dir2 dir3
.PHONY: $(DIRS)
all: aa: $(DIRS)$(DIRS): %: make all -C $@

此时如果执行make all -j4,就可以并发执行三条命令了。
再比如,编译生成某个库文件或者可执行文件时,千万不要写成如下方式:

app: *.cppg++ -o $@ $^ -I./ 

这种情况下显然效率极低,即不利于多核编译,也不利于增量编译。正确写法应该如下:

source=$(wildcard ./*.cpp)
obj=$(patsubst %.cpp, %.o, $(source))OBJS: $(obj)
$(obj) : %.o : %.cppg++ -c $< -o $@ -I./app: $(obj)g++ $^ -o $@

多核编译的情况下,会并行编译多个cpp文件,从而提高编译效率,并且增量编译也只会编译有修改的cpp文件。

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

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

相关文章

解决:安装MySQL 5.7 的时候报错:unknown variable ‘mysqlx_port=0.0‘

目录 1. 背景2. 解决步骤 1. 背景 吐槽1&#xff0c;没被收购之前可以随便下载&#xff0c;现在下载要注册登录吐槽2&#xff0c;5.7安装到初始化数据库的时候就会报错&#xff0c;而8.x的可以一镜到底&#xff0c;一开始以为是国区的特色问题&#xff0c;google了一圈&#x…

[Algorithm][贪心][最长递增子序列][递增的三元子序列][最长连续递增序列][买卖股票的最佳时机][买卖股票的最佳时机Ⅱ]详细讲解

目录 1.最长递增子序列1.题目链接2.算法原理详解3.代码实现 2.递增的三元子序列1.题目链接2.算法原理详解3.题目链接 3.最长连续递增序列1.题目链接2.算法原理详解3.代码实现 4.买卖股票的最佳时机1.题目链接2.算法原理详解3.代码实现 5.买卖股票的最佳时机 II1.题目链接2.算法…

厂里资讯之总体架构介绍以及环境搭建

本项目是本人根据黑马程序员的微服务项目黑马头条进行包装改造&#xff0c;作为实习简历上面的项目&#xff0c;为了进一步熟悉深挖这个项目&#xff0c;写了这一系列的博客来加深自己对项目的理解。 概述 项目背景 本项目主要着手于使用户获取学校最新最热的资讯&#xff0c…

Django自定义CSS

创建一个CSS文件&#xff08;例如admin_custom.css&#xff09;&#xff0c;并在其中添加针对你希望修改的字段的CSS规则。在你的Django项目的settings.py文件中&#xff0c;添加自定义CSS文件的路径到STATICFILES_DIRS。 # settings.py STATICFILES_DIRS [ os.path.join(BA…

论文阅读(一种新的稀疏PCA求解方式)Sparse PCA: A Geometric Approach

这是一篇来自JMLR的论文&#xff0c;论文主要关注稀疏主成分分析&#xff08;Sparse PCA&#xff09;的问题&#xff0c;提出了一种新颖的几何解法&#xff08;GeoSPCA&#xff09;。 该方法相比传统稀疏PCA的解法的优点&#xff1a;1&#xff09;更容易找到全局最优&#xff…

JavaScript同一性校验

入门版 /*** validCommon* 同一性校验: 满足返回true&#xff0c;不满足返回false。* * param arr: 数组。* param fields: 字段域。* * return bolean: 布尔类型* */ function validCommon (arr, ...fields) {let obj {}return arr.every((item, index) > {return fields…

使用 ML.NET CLI 自动进行模型训练

ML.NET CLI 可为 .NET 开发人员自动生成模型。 若要单独使用 ML.NET API(不使用 ML.NET AutoML CLI),需要选择训练程序(针对特定任务的机器学习算法的实现),以及要应用到数据的数据转换集(特征工程)。 每个数据集的最佳管道各不相同,从所有选择中选择最佳算法增加了复…

leetcode15三数之和(重点讲去重)

本文主要讲解三数之和的要点与细节&#xff0c;主要讲解利用双指针的方法解决&#xff0c;按照步骤一步步思考方便理解 给你一个整数数组 nums &#xff0c;判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k &#xff0c;同时还满足 nums[i] nums[…

seata原理源码分析系列(一)架构, 组件

简介 SEATA开源的分布式事务解决方案&#xff0c;用于解决分布式系统中的数据一致性问题&#xff0c;由阿里巴巴开源。 分布式系统&#xff0c;数据存储在不同的资源管理器(数据库)&#xff0c;需要保证分布式事务的原子性&#xff0c;业界比较常用xa&#xff0c;数据库标准实现…

C语言 | Leetcode C语言题解之第151题反转字符串中的单词

题目&#xff1a; 题解&#xff1a; void myResverse(char* s,int start,int end){while(start<end){char temp s[start];s[start] s[end];s[end] temp;start;end--;} } char* reverseWords(char* s) {int start 0;int end strlen(s)-1;myResverse(s,start,end);if(s[…

面试题:Redis是什么?有什么作用?怎么测试?

有些测试朋友来问我&#xff0c;redis要怎么测试&#xff1f;首先我们需要知道&#xff0c;redis是什么&#xff1f;它能做什么&#xff1f; redis是一个key-value类型的高速存储数据库。 redis常被用做&#xff1a;缓存、队列、发布订阅等。 所以&#xff0c;“redis要怎么测试…

Linux系统使用Docker安装Dashy导航页结合内网穿透一键发布公网

文章目录 简介1. 安装Dashy2. 安装cpolar3.配置公网访问地址4. 固定域名访问 简介 Dashy 是一个开源的自托管的导航页配置服务&#xff0c;具有易于使用的可视化编辑器、状态检查、小工具和主题等功能。你可以将自己常用的一些网站聚合起来放在一起&#xff0c;形成自己的导航…

Android10 动态修改开机动画(二)设置分区权限

Selinux配置策略 配置init.common.rc文件 device\sprd\sharkle\common\rootdir\root\init.common.rc restorecon_recursive /mnt/animchmod 0777 /mnt/animchown root system /mnt/anim restorecon_recursive /mnt/anim &#xff1a;如果anim变成u:object_r:unlabeled:s0 &…

【Linux】linux 添加sftp用户

linux 添加sftp用户 在Linux系统中&#xff0c;可以通过以下方法来添加SFTP用户&#xff1a; 方法一&#xff1a;使用useradd命令手动创建用户&#xff0c;并为其设置SFTP登录权限&#xff1a; sudo useradd -m -s /bin/false <username> # 创建用户&#xff0c;禁用s…

从输入URL到页面加载完中间发生了什么?

当浏览器地址栏的 URL 发生变化时&#xff0c;通常会经历以下步骤&#xff1a; 用户输入或导航操作&#xff1a;用户在地址栏中输入新的 URL 或者通过点击链接、前进/后退按钮等进行导航操作。 URL 解析&#xff1a;浏览器会解析新的 URL&#xff0c;并将其拆分为不同的组成部…

医院信息化运维的监控“神器”有哪些

为了提高医院运维团队的一体化运维监控能力&#xff0c;可以引入以下先进的监控工具&#xff1a; 1. 监控易一体化运维管理软件 - 这是一个分布式、一体化运维管理平台&#xff0c;具备全面、高效、安全、灵活的特点&#xff0c;非常适合医院复杂的信息系统环境。 - 监控易可以…

机器视觉:工业镜头的主要参数

工业镜头是图像采集系统的重要光学设备。它的作用是将目标物体的像成在相机的感光面上。 一、工业镜头原理 镜头是对光线进行调制和变换&#xff0c;使目标能够成像到相机的感光芯片上。将不同折射率的硝材加工成高精度的曲面&#xff0c;再把这些曲面进行组合后设计成能够满…

使用 Selenium 自动化获取 CSDN 博客资源列表详解

使用 Selenium 自动化获取 CSDN 博客资源列表详解 在本文中,我们将详细介绍如何使用 Selenium 自动化工具来滚动页面并获取 CSDN 博客上博主发布的资源列表。我们将逐步展示代码实现过程,并解释每个步骤的作用和原理。 1. 准备工作 在开始之前,请确保已经安装了以下软件和…

秋招突击——6/14——复习{(树形DP)树的最长路径}——新作{非递归求二叉树的深度、重复区间合并}

文章目录 引言复习树形DP——树的最长路径 新作使用dfs非递归计算二叉树的深度多个区间合并删除问题实现思路实现代码参考思路 总结 引言 这两天可能有点波动&#xff0c;但是算法题还是尽量保证复习和新作一块弄&#xff0c;数量上可能有所差别。 复习 树形DP——树的最长路…

React state(及组件) 的保留与重置

当在树中相同的位置渲染相同的组件时&#xff0c;React 会一直保留着组件的 state return (<div><Counter />{showB && <Counter />} </div> ) // 当 showB 为 false, 第二个计数器停止渲染&#xff0c;它的 state 完全消失了。这是因为 React…