Я строю несколько двоичных файлов в C ++ и CUDA с парой файлов в Fortran. Я нашел этот вопрос , и у меня возникла похожая проблема. Пользователь недавно попросил меня перестроить трехлетнюю версию хранилища (до того, как мы выполнили масштабную миграцию и переименование), и я был потрясен, увидев, как быстро он построил . Было бы невозможно / невероятно трудоемко определить, какие именно изменения между этой версией и теперь заставили сборку занимать так долго.
Однако я заметил в комментарии к ответу на вышеупомянутый вопрос:
В частности, не забудьте использовать: = вместо =, так как: = выполняет расширение
немедленно, что экономит время. - Джек Келли 23 марта в 22: 38
Есть ли другие предложения, о которых мне следует знать?
Примечание:
- Я использую парадигму «include», в которой каждый каталог, который я хочу создать, имеет файл
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 строк, но я был бы рад обновить вопрос с помощью фрагментов кода, если это поможет.
Обновление: Вот мое правило генерации зависимостей и правило компиляции:
#
# 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, я смог разложить генерацию зависимостей, и время создания файла составило примерно 14,2% от общего времени компиляции. Поэтому я собираюсь сосредоточиться на минимизации включения заголовка в мой код C ++. Спасибо вам обоим за ваши предложения !!