我知道要允许make
多线程,我使用命令make --jobs=X
,其中X
通常等于核心数(或者两倍或者其他)。
我正在调试一个makefile - 实际上由许多makefile组成 - 使用--jobs=X
选项。以下是其目前没有的原因示例:
T1:
mkdir D1
output_makefile.bat > ./D1/makefile
T2:
cd D1
make
使用--jobs=X
执行此操作会导致竞争条件,因为T1
未被指定为T2
的依赖项,最终T2
将在{{1}之前构建}};我需要修复的大多数错误都属于这种类型。
T1
中的X
是否大于?{逻辑或物理?核心,同时执行的作业数量将限制为“逻辑或物理”的数量?芯
我的机器有4个物理/ 8个逻辑核心,但是运行我们的构建的构建机器将有多达64个核心。
所以我担心这只是因为我的makefile(a)正确构建了最终输出(b)在--jobs=X
的机器上运行没有错误并不意味着它能够正常运行在64核计算机上--jobs=4
出错。
是否有一个模拟--jobs=64
在具有比物理机器更多内核的环境中执行的工具?
如何创建具有64个内核的虚拟机并在我的4核机器上运行它?是甚至VMPlayer允许的吗?
我意识到我对make
的理解不正确:job slots make
创建的数量等于make
参数,而不是核心或线程的数量PC有。
然而,这本身并不一定意味着--jobs=N
也会执行并行执行这些作业即使我的核心少于作业通过使用任务切换。
我需要确认所有作业是并行执行而不仅仅是排队等等。并等待积极执行的工作完成。
所以我创建了一个包含16个目标的makefile - 超过了我拥有的线程数或核心数 - 并且每个配方只有make
目标名称可配置的次数。
make.mk
echos
loop_output.bat
all: 1 2 3 4 ... 14 15 16
<target X>:
@loop_output.bat $@
输出类似于
@FOR /L %%G IN (1,1,2048) DO @echo (%1-%%G)
格式为(16-1) <-- Job 16
(6-1400)
(12-334)
(1-1616) <-- Job 1
(4-1661)
(15-113)
(11-632)
(2-1557)
(10-485)
(7-1234)
(5-1530)
。我在 Job#X-Echo#Y
之后看到(1-1616)
这一事实意味着(16-1)
确实在与目标make
同时执行目标16
另一种选择是1
完成作业(1 /内核/线程),然后需要另外一块等于#num内核/线程的作业但是这样做不是发生了什么。
答案 0 :(得分:1)
See my "UPDATE 1":
No special software or make
tricks are required. Regardless of number of cores you have, Make
will execute the jobs truly in parallel by spawning multiple processes and letting the OS multitask them just like any other process.
Windows PITFALL #1: The version of Gnu Make available on SourceForge is 3.81 which does NOT have the ability to even execute using
--jobs
. You'll have to download ver 4.2 and build it.
>
Windows PITFALL #2:
make 4.2
source will fail to build because of some header that VS2008 (and older) doesn't have. The fix is easy: you have to replace the invocation of the "symbol not found" with its macro equivalent; it should be obvious what I'm talking about when you try to build it. (I forgot what the missing symbol was).