2012-10-09 35 views
5

मैं एक परियोजना पर कुछ परीक्षण कर रहा हूं जिसे मैंने हाल ही में सीएमके के साथ बनाना शुरू कर दिया है। सीएमके में जाने से पहले मैंने अपने हस्तलिखित मेकफ़ाइल के साथ make के लिए -j विकल्प का उपयोग करते समय निर्माण समय में महत्वपूर्ण सुधार देखा।एक सीएमके उत्पन्न मेकफ़ाइल (कोई गति सुधार) का उपयोग कर समांतर नौकरियां

अब सीएमके के साथ मैं वही काम करता हूं और गति में कोई उल्लेखनीय वृद्धि नहीं होती है। चाहे मैं -j के साथ दौड़ूं या नहीं, मुझे make.exe के लिए चार प्रक्रियाएं मिलती हैं, हालांकि उनमें से केवल एक ही CPU समय घड़ी कर रही है और CPU का 25% अधिक उपयोग नहीं करती है।

आम तौर पर, सीएमके ने मेकफ़ाइल उत्पन्न किया है जो मेरे हस्तलिखित मेकफ़ाइल से बहुत धीमा है। एक त्वरित परीक्षण शो के साथ और -j ध्वज के बिना दोनों CMake और हस्तलिखित makefiles के लिए बार का निर्माण:

CMake: "make -j all" = 7min 
CMake: "make all" = 7min 
Handwritten: "make -j all" = 2min 
Handwritten: "make all" = 4min 

सामान्य तौर पर, 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 [email protected] $(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 
+1

आप अपने 'CMakeLists.txt' दिखा सकते हैं? – arrowd

+0

बस मेरी CMakeLists.txt फ़ाइल –

+0

और आपकी मूल मेकफ़ाइल भी पोस्ट की गई। – Offirmo

उत्तर

5

इस खिड़कियों पर है? यदि ऐसा है तो ऐसा इसलिए है क्योंकि जीएमके के विंडोज संस्करण में जॉब सर्वर नहीं है और रिकर्सिव मेकफ़ाइल समानांतर नहीं हैं। मुझे लगता है कि जब आपने make.exe लिखा था जिसका मतलब विंडोज़ है। मुझे लगता है कि सीवीएस जीएमके में अब एक नौकरियां सर्वर है। सिग्विन जीएमके भी जॉब सर्वर का समर्थन करता है।

इस लिंक से आपको मदद कर सकता है:

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

+0

फिर उसके कस्टम मेकफ़ाइल के साथ समांतरता कैसे काम करेगी यदि यह एक लापता विशेषता थी? – Offirmo

+0

उनकी कस्टम मेकफ़ाइल रिकर्सिव नहीं है। यह बनाने से कॉल नहीं करता है। सीएमके ने मेकफ़ाइल जेनरेट की। यहां देखें: http://www.cmake.org/Wiki/CMake_FAQ#Why_does_CMake_generate_recursive_Makefiles.3F –

+0

दिलचस्प। यही कारण हो सकता है। – Offirmo