有没有办法让当前的工作编号在 makefile 规则中使用?
让我给你一点背景。我正在使用一个在多个文件上运行的工具。自然地,我使用并行作业来加快速度。这里真正的问题是这个工具产生了多个线程,我希望它们在单核中运行——因为这样会更快。我做了一些测试,它运行得更快。
我需要工作编号来设置与 cpu 核心的进程亲和性。
有没有办法让当前的工作编号在 makefile 规则中使用?
让我给你一点背景。我正在使用一个在多个文件上运行的工具。自然地,我使用并行作业来加快速度。这里真正的问题是这个工具产生了多个线程,我希望它们在单核中运行——因为这样会更快。我做了一些测试,它运行得更快。
我需要工作编号来设置与 cpu 核心的进程亲和性。
没有办法获得“工作编号”,因为 make 不跟踪工作编号。基本上,单个构建中的所有 make 实例共享一个相同标记的列表。当 make 想要开始一项工作时,它会获得一个令牌。当 make 完成一项工作时,它会将令牌添加回列表中。如果它试图获取一个令牌并且一个令牌不可用,它将休眠直到一个令牌可用。令牌没有显着特征,因此无法拥有“工作编号”。
要了解有关 GNU make 如何处理并行构建的更多信息,您可以阅读http://make.mad-scientist.net/jobserver.html
无论如何,我不太确定这对您有什么帮助。Make 对线程一无所知,它只启动进程。如果单个进程由多个线程组成,make 仍然会将其视为单个作业。
编辑:假设你在一个单一的、非递归的 make 调用中,你可以这样做:
COUNT :=
%.foo :
$(eval COUNT += x)
@echo "$@: Number of rules run is $(words $(COUNT))"
all: a.foo b.foo c.foo d.foo