使用CMake生成makefile的并行作业(无速度提升)

Nea*_*uis 5 fortran makefile cmake

我一直在对我最近开始使用CMake构建的项目进行一些测试.在转移到CMake之前,我注意到在使用我的手写Makefile -j选项时,构建时间有了显着改善make.

现在使用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
Run Code Online (Sandbox Code Playgroud)

一般来说,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)
Run Code Online (Sandbox Code Playgroud)

这是我原来的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
Run Code Online (Sandbox Code Playgroud)

小智 6

这是在窗户上吗?如果是这样,那是因为gmake的windows版本没有作业服务器,并且递归makefile不是并行的.我假设你写make.exe意味着windows.我认为CVS gmake现在有一个作业服务器.cygwin gmake还支持作业服务器.

此链接可能对您有所帮助:

http://lists.gnu.org/archive/html/make-w32/2011-07/msg00002.html