5

最近 CMake でビルドを開始したプロジェクトでいくつかのテストを行っています。CMake に移行する前に、手書きの Makefile で-jオプション forを使用すると、ビルド時間が大幅に短縮されることに気付きました。make

現在、CMake を使用して同じことを行っていますが、速度が著しく向上することはありません。で実行するかどうかに関係-jなく、 に対して 4 つのプロセスを取得しますmake.exeが、そのうちの 1 つだけが CPU 時間を計時しており、CPU の 25% 以上を使用することはありません。

一般に、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
4

1 に答える 1

6

これはWindows上ですか?その場合、gmake の Windows バージョンにはジョブ サーバーがなく、再帰的な makefile が並列化されていないためです。あなたがmake.exeを書いたとき、それはwindowsを意味すると思います。CVS gmake には現在、ジョブ サーバーがあると思います。cygwin gmake もジョブ サーバーをサポートしています。

このリンクはあなたを助けるかもしれません:

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

于 2012-10-11T00:37:18.567 に答える