multithreading - GNU make-如何模拟多个同时作业

标签 multithreading makefile gnu-make

我知道为了允许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将在T1之前构建;我需要修复的大多数错误都是这种错误。

如果X中的--jobs=X大于逻辑或物理数量?核心,同时执行的作业数量将以“逻辑或物理”数量为上限。核心。

我的机器具有4个物理/8逻辑内核,但是将要运行我们的构建的构建计算机将具有多达64个内核。

因此,我担心仅仅因为我的makefile(a)正确构建了最终输出(b)在具有--jobs=4的计算机上运行没有错误并不意味着它会在64核计算机上正确运行并且在--jobs=64上没有错误。

是否有一个工具可以模拟在内核比物理机多的环境中执行的make

如何创建一个具有64核的虚拟机并在我的4核计算机上运行它? VMPlayer甚至允许吗?

更新1

我意识到我对make的理解是不正确的:job slots make创建的数量等于--jobs=N参数,而不是我的PC拥有的内核或线程的数量。

但是,这本身并不一定意味着make也将并行执行那些作业,即使我通过使用任务切换而内核比作业少时也是如此。

我需要确认所有作业都是并行执行的,而不仅仅是“排队”并等待 Activity 执行的作业完成。

因此,我创建了一个包含16个目标的makefile-超过了我拥有的线程数或内核数-每个配方仅对目标名称echos进行了可配置的次数设置。

make.mk
all: 1 2 3 4 ... 14 15 16

<target X>:
    @loop_output.bat $@

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

另一种选择是,make完成作业(1-#of内核/线程),然后再执行另一个等于#num内核/线程的作业,但这不是正在发生的事情。

最佳答案

参见我的“UPDATE 1”:

不需要特殊的软件或make技巧。无论您拥有多少内核,Make都会通过产生多个进程并使OS与其他进程一样多任务来真正并行地执行作业。

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).

关于multithreading - GNU make-如何模拟多个同时作业,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37734959/

相关文章:

java - 如何知道线程是 "waiting"的条件?

java - Java线程同步中的通知

python - 多处理列表中的多个文件

java - Nashorn 以线程安全的方式

makefile - 获取包含在 Makefile 中的文件的路径

c - 如何为词法分析器创建makefile?

c - Makefile目标文件生成、变量替换等问题

makefile可以用来插入代码吗?

makefile目标不关注修改时间

R make install 失败,文件丢失