我一直在对我最近开始使用CMake构建的项目进行一些测试。在转移到CMake之前,我注意到使用-j
make
选项和我的手写Makefile时,构建时间有了显着改进。
现在使用CMake我做同样的事情并没有明显的速度增加。无论我是否使用-j
运行,我都会为make.exe
获得四个进程,但其中只有一个进程占用CPU时间,而且从不使用超过25%的CPU。
通常,CMake生成的Makefile比我手写的Makefile要慢得多。快速测试显示带有和不带-j
标志的CMake和手写makefile的构建时间:
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
答案 0 :(得分:6)
这是在Windows上吗?如果是这样,那是因为gmake的windows版本没有作业服务器,并且递归makefile不是并行的。我假设你写make.exe意味着windows。我认为CVS gmake现在有一个作业服务器。 cygwin gmake还支持作业服务器。
此链接可能会对您有所帮助:
http://lists.gnu.org/archive/html/make-w32/2011-07/msg00002.html