使用CMake生成的makefile进行并行作业(无速度提升)
我最近开始与CMake一起构建一个项目,并对该项目进行了一些测试。在转到CMake之前,我注意到在我的手写Makefile中使用使用CMake生成的makefile进行并行作业(无速度提升),makefile,cmake,fortran,Makefile,Cmake,Fortran,我最近开始与CMake一起构建一个项目,并对该项目进行了一些测试。在转到CMake之前,我注意到在我的手写Makefile中使用make的-j选项时,构建时间有了显著的改进 现在有了CMake,我也做了同样的事情,速度没有明显的提高。无论我是否使用-j运行,我都会得到四个make.exe进程,尽管其中只有一个进程正在计时CPU时间,并且从未使用超过25%的CPU 通常,CMake生成的Makefile比我的手写Makefile慢得多。快速测试显示了使用和不使用-j标志的CMake和手写Make文
make
的-j
选项时,构建时间有了显著的改进
现在有了CMake,我也做了同样的事情,速度没有明显的提高。无论我是否使用-j
运行,我都会得到四个make.exe
进程,尽管其中只有一个进程正在计时CPU时间,并且从未使用超过25%的CPU
通常,CMake生成的Makefile比我的手写Makefile慢得多。快速测试显示了使用和不使用-j
标志的CMake和手写Make文件的生成时间:
CMake: "make -j all" = 7min
CMake: "make all" = 7min
Handwritten: "make -j all" = 2min
Handwritten: "make all" = 4min
一般来说,CMake的速度要慢得多,而且似乎没有利用并行作业
有人能解释为什么我没有看到任何改进吗
(用gfortran构建一个Fortran程序,并使用CMake的自动检测依赖项功能…尽管我不知道这是否与我所看到的相关)
这是我的CMakeLists.txt文件:
## CMake Version
cmake_minimum_required(VERSION 2.8)
## Project Name
project(PROJECT)
## Use FORTRAN
enable_language(Fortran)
## Release compiler options
set (CMAKE_Fortran_FLAGS_RELEASE "-O3 -cpp -ffree-line-length-none -fimplicit-none")
## Debug compiler options
set (CMAKE_Fortran_FLAGS_DEBUG "-g -cpp -ffree-line-length-none -fimplicit-none")
## Set directory for FORTRAN modules
set (CMAKE_Fortran_MODULE_DIRECTORY "${PROJECT_BINARY_DIR}/modules")
## Build Executable
add_executable(EXE
Source1.f90
Source2.f90
.
.
.
Source219.f90
Source220.f90)
这是我的原始Makefile:
PROG = PROGRAM.exe
SRCS = Source1.f90 Source2.f90 ... Source219.o Source220.o
OBJS = Source1.o Source2.o ... Source219.o Source220.o
LIBS =
VPATH = src
BUILDDIR = debug
F90 = gfortran
F90FLAGS = -g -cpp -ffree-line-length-none -fimplicit-none
all: $(PROG)
$(PROG): $(OBJS)
$(F90) -o $@ $(OBJS) $(LIBS)
clean:
erase -f $(BUILDDIR)$(PROG) $(BUILDDIR)\$(OBJS) $(BUILDDIR)\*.mod
.SUFFIXES: $(SUFFIXES) .f90
.f90.o:
$(F90) $(F90FLAGS) -c $<
Source1.o: Dependency1.o Dependency2.o ... DependencyN.o
Source2.o: Dependency1.o Dependency2.o ... DependencyN.o
.
.
.
Source219.o: Dependency1.o Dependency2.o ... DependencyN.o
Source220.o: Dependency1.o Dependency2.o ... DependencyN.o
PROG=PROGRAM.exe
SRCS=Source1.f90 Source2.f90。。。Source219.o Source220.o
OBJS=Source1.o Source2.o。。。Source219.o Source220.o
LIBS=
VPATH=src
BUILDDIR=debug
F90=gfortran
F90FLAGS=-g-cpp-ffree line length none-fimplicit none
全部:$(进度)
$(进度):$(OBJS)
$(F90)-o$@$(OBJS)$(LIBS)
清洁:
擦除-f$(BUILDDIR)$(PROG)$(BUILDDIR)\$(OBJS)$(BUILDDIR)\*.mod
.后缀:$(后缀).f90
.f90.o:
$(F90)$(F90标志)-c$<
Source1.o:Dependency1.o Dependency2.o。。。依附
Source2.o:Dependency1.o Dependency2.o。。。依附
.
.
.
Source219.o:Dependency1.o Dependency2.o。。。依附
Source220.o:Dependency1.o Dependency2.o。。。依附
这在windows上吗?如果是这样的话,那是因为windows版本的gmake没有作业服务器,递归生成文件也不是并行的。我假设当你写make.exe的时候意味着windows。我认为CVS gmake现在有一个作业服务器。cygwin gmake还支持作业服务器
此链接可能会帮助您:
你能展示你的
CMakeLists.txt吗?
?刚刚发布了我的CMakeLists.txt文件和你的原始Makefile。你仍然需要“-j”。试试这个:MAKEFLAGS=“-j4”make@Offirmo,刚刚添加了我的Makefile,那么如果make缺少一个特性,那么如何使用他的自定义Makefile进行并行化呢?他的自定义Makefile不是递归的。它不是从make调用make。CMake生成的makefiles做什么。看这里:有趣。那也许就是原因。谢谢你,比尔!这绝对是正在发生的事情。这里有一些关于在正式发布的MinGW中支持jobserver之前修复此问题的说明:很高兴知道现在有一个修复程序,而不必使用cygwin。