我正在使用C ++和C ++构建多个二进制文件。 CUDA在Fortran中有几个文件。我找到了this question,我遇到了类似的问题。一位用户最近要求我重新构建一个三年前版本的存储库(在我们执行大规模迁移和重命名之前),我感到非常震惊,看看它的构建速度有多快。确切地确定该版本之间的哪些更改以及现在导致构建过长的时间是不可能/非常耗时的。
然而,我在回答对上述问题的评论中注意到:
特别要记住使用:=而不是=,as:=进行扩展 马上,这节省了时间。 - 杰克凯利3月23日22:38
我还应该注意其他建议吗?
注意:
module.mk
文件,该文件直接包含在一个Makefile中。(降价..)
#
# CUDA Compilation Rules
#
define cuda-compile-rule
$1: $(call generated-source,$2) \
$(call source-dir-to-build-dir, $(subst .cu,.cubin, $2)) \
$(call source-dir-to-build-dir, $(subst .cu,.ptx, $2))
$(NVCC) $(CUBIN_ARCH_FLAG) $(NVCCFLAGS) $(INCFLAGS) $(DEFINES) -o $$@ -c $$<
$(call source-dir-to-build-dir, $(subst .cu,.cubin, $2)): $(call generated-source,$2)
$(NVCC) -cubin -Xptxas -v $(CUBIN_ARCH_FLAG) $(NVCCFLAGS) $(INCFLAGS) $(DEFINES) $(SMVERSIONFLAGS) -o $$@ $$<
$(call source-dir-to-build-dir, $(subst .cu,.ptx, $2)): $(call generated-source,$2)
$(NVCC) -ptx $(CUBIN_ARCH_FLAG) $(NVCCFLAGS) $(INCFLAGS) $(DEFINES) $(SMVERSIONFLAGS) -o $$@ $$<
$(subst .o,.d,$1): $(call generated-source,$2)
$(NVCC) $(CUBIN_ARCH_FLAG) $(NVCCFLAGS) $3 $(TARGET_ARCH) $(INCFLAGS) $(DEFINES) -M $$< | \
$(SED) 's,\($$(notdir $$*)\.o\) *:,$$(dir $$@)\1 $$@: ,' > $$@.tmp
$(MV) $$@.tmp $$@
endef
最后:如何确定编译时间或make
时间是否真的放慢了速度?
我不想附加整个Makefile。这是914行,但我很乐意用片段更新问题,如果有帮助的话。
更新:这是我的依赖关系生成规则&amp;编译规则:
#
# Dependency Generation Rules
#
define dependency-rules
$(subst .o,.d,$1): $2
$(CC) $(CFLAGS) $(DEFINES) $(INCFLAGS) $3 $(TARGET_ARCH) -M $$< | \
$(SED) 's,\($$(notdir $$*)\.o\) *:,$$(dir $$@)\1 $$@: ,' > $$@.tmp
$(MV) $$@.tmp $$@
endef
%.d: %.cpp
$(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -M $< | \
$(SED) 's,\($(notdir $*)\.o\) *:,$(dir $@)\1 $@: ,' > $@.tmp
$(MV) $@.tmp $@
更新2:使用@ Beta的建议,我能够分辨出依赖关系生成,Makefile时间大约是整个编译时间的14.2%。所以我将首先关注最小化我的C ++代码中的头部包含。感谢你们两位的建议!!
答案 0 :(得分:3)
答案 1 :(得分:3)
ElectricMake(emake)是gmake的直接替代品,可以很容易地回答这样的问题。 emake可以生成带注释的构建日志,其中包含有关构建中每个作业的详细时序信息,然后您可以将其加载到ElectricInsight中以生成例如按类型划分的作业时间报告:
如果您想尝试一下,可以get an eval copy。
(免责声明:我是ElectricMake和ElectricInsight的架构师和首席开发人员!)
答案 2 :(得分:1)
我真的怀疑make的变量赋值(立即使用:=或recursive =)会对速度产生重大影响。一个特别明显的情况是它产生严重影响的是shell命令:
VAR := $(shell ...)
可能还有其他隐藏的消费过程并不明显。例如,在我们的环境中,标准临时Windows目录位于网络驱动器上。因此,当在该驱动器上存储/更新文件时(即使使用1G LAN) - 它非常慢。你需要的是调试makefile。 This maybe helpful
根据上面提到的文档,您可以以 $(警告去做bla-bla-bla)的形式放置调试打印,然后观察进程最终冻结的位置。