Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用CMake生成的makefile进行并行作业(无速度提升)_Makefile_Cmake_Fortran - Fatal编程技术网

使用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文

我最近开始与CMake一起构建一个项目,并对该项目进行了一些测试。在转到CMake之前,我注意到在我的手写Makefile中使用
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。