2009-10-07 17 views
15

Jaka konfiguracja działa dla GNU, aby wykonywać zadania równoległe (-j) w systemie Windows?Tworzenie (zadania równoległe) w systemie Windows

Próbowałem ustawić powłokę do cmd.exe przy użyciu MinGW zrobić 3.81, to działa w tworzeniu wielu procesów, ale nie powiedzie się z komunikatem "oczekiwanie na zadanie".

Czy to działa i jaka jest najlepsza konfiguracja? (MinGW/Cygwin/???) Czy ktoś może wskazać mi przykład do przetestowania?

Odpowiedz

2

Nigdy nie miałem żadnych promblemów używając make -jn pod Cygwin. Działa całkiem dobrze. Regularnie używam go z kompilatorem Microsoft cl.exe. Po prostu działa po wyjęciu z pudełka. Bardzo UNIX jak, co jest dobre Thing ™. Buduj skrypty ładnie portuj do Linuksa i Maca. Dokładnie zalecane.

Nigdy nie lubiłem gry MinGW, ponieważ dotarłem do miejsca, gdzie 5 ukośników było zbyt mało, ale sześć było za dużo. Westchnienie! (Aby zrobić z wtyczkami MinGW, aby nazwy odwróconych odwróconych znaków były dozwolone w ustawieniach AFAIK.)

+0

Twoje prawo. Zrobiłem to, aby działało, jak opisujesz - musiałem tylko rozszyfrować okropny plik makefile, aby znaleźć odpowiedni punkt do zrobienia -j (spraw, aby wywołanie sprawiało, że ...). – Oliver

+0

jeśli używasz powłoki cygwin/MinGW: nie zapomnij ustawić zmiennej systemowej 'shell' na' cmd' (w przeciwnym wypadku domyślnie użyjesz sh lub sh.exe (na przykład na Cygwin ...) i wygrałeś nie będzie w stanie obsługiwać wielu procesów). po prostu wyeksportuj 'SHELL = CMD'. łatwo. –

+0

@Karako Nieee, proszę, nie rób tego. 'sh' po prostu działa. Jest to platforma wieloplatformowa. Nie ma problemów z równoległością. (na _cygwin _ tak - nie mogę ręczyć za _mingw_.) 'cmd' jest po prostu okropne. – bobbogo

3

O ile mogę zrozumieć, zadania równoległe GNU Make zależą od podstawowej platformy dostarczającej informacje o obciążeniu procesora (CPU). Dzieje się tak niestety w sposób niezgodny z Windows, a jedynie polecenie "make -j" robi wszystko według skali. To polecenie (bez maksymalnej liczby zadań) jest potencjalnie dość niebezpieczne, ponieważ będzie jedzić pamięć jak wściekły głodny pies (próbowałem go na Qt i rozbił się na QtWebkit, największym projekcie w Qt, 4GB RAM, Win7).

Po dłuższej chwili mam wrażenie, że make-j3 działa szybciej niż marka, ale w świetle tego, co mogę znaleźć w Internecie (forach, instrukcji ...), wydaje się bardzo funkcjonalną POSIX/linux.

BTW, jestem zaskoczony, że twoje pytanie zostało odrzucone.

3

Znalazłem this Danny Thorpe's blog entry, który wyjaśnia problemy z równoległym budowaniem w systemie Windows. W zasadzie to, co sugeruje, aby ustawić następującą zmienną środowiskową pierwszy:

set SHELL=cmd.exe 

Z tym, że jestem w stanie uruchomić komendę make -j stylu, ale niestety nie komenda styl kontrolowane make -jN.

3

Rozwiązałem ten problem, więc udostępniam rozwiązanie wszystkim.

Możesz wypróbować MinGW-TDM (strona główna: http://tdm-gcc.tdragon.net/) lub równanie MinGW (strona pobierania: http://www.equation.com/servlet/equation.cmd?fa=fortran).

Instalacja wersja 32-bitowa do D:\MinGW\MinGW32 na przykład (i 64 bitowa do D: \ MinGW \ MinGW64 jeśli chcesz korzystać z 64-bitowych plików binarnych kompilacji)

Utwórz plik wsadowy następująco następnie uruchomić go na swojej kompilacji katalog:

Set MinGW_bin=D:\MinGW\MinGW32\bin 
Set MSys_bin=D:\MinGW\msys\bin 
Set Path=%MSys_bin%;%MinGW_bin% 
mingw32-make SHELL=CMD.exe -j6 -f makefile 

Możesz pobrać MSYS od http://sourceforge.net/apps/trac/mingw-w64/wiki/MSYS. Ma wiele programów typu UNIX, które wymagały budowania wielu bibliotek, aplikacji.

Gdzie -j6 to opcja uruchamiania 6 równoległych zadań kompilacji.

WSKAZÓWKA: można ustawić opcję -jN, gdzie N = liczba rdzeni procesora (wątków) jest większa o 1,5. W moim przypadku mój procesor ma 4 wątki, więc ustawię tę wartość na 6.

Uwaga: można uruchomić

make.exe -jN -f makefile

bezSHELL=CMD.exe opcję i Twoja kompilacja jest prowadzony równolegle, ale to nie jest kompatybilny w niektórych przypadkach (gdzie make.exe pochodzi z katalogu MSYS).

Pozdrawiam,

+0

pojawia się normalny MinGW również z tym, nie tylko TDM, i działa, w końcu działająca równolegle marka, która nie tylko zawiesza się używając 100% procesora LOL – rogerdpack

3

cynk, które mogą pomóc użytkownikom CWprowadä

Opcja -jN nie działa, gdy dzwoni makefile zrobić rekurencyjnie jako CWprowadä-makefile zazwyczaj zrobić. Ale istnieje remedium, które znowu działa, ponieważ w wygenerowanych plikach Makefile wywołania CMake za pomocą takiej składni.

$(MAKE) -f CMakeFiles\Makefile2 <subproject> 

Oznacza to, że można zmodyfikować zmienną Marka:

mingw32-make "MAKE=mingw32-make -j3" 

Teraz za każdym razem podprojektem-make jest uruchomiona, to znowu dostanie opcję "-j3". Należy jednak zauważyć, że to faktycznie nie ogranicza liczby równoległych kompilacji do 3, jak można się spodziewać. Jeśli masz więcej niż 3 projekty, które nie zależą od siebie nawzajem w tej samej hierarchii, wszystkie 3 projekty będą budowane równolegle, a każda z nich uruchomi 3 etapy kompilacji. W wyniku 9 równoległych kroków kompilacji.

Kiedy przyjrzymy się bliżej górze pliku Makefile generowanego przez cmake, widzimy, że cel "wszystko" w zasadzie uruchamia tylko sub-make.

$(MAKE) -f CMakeFiles\Makefile2 all 

Więc możemy zdjąć jedną warstwę podprojektu równoległości wywołując

mingw32-make "MAKE=mingw32-make -j3" -f CMakeFiles\Makefile2 all 

Ale to poświęca raportowania postępów.

Mam nadzieję, że to pomoże.

+0

Działa to bardzo dobrze jako obejście, dzięki! Jestem pewien, że nie jest to użyteczne dla użytkowników cmake :-) - rekurencyjna marka nie jest niczym niezwykłym. –

+0

Urk! Brzmi to jak robota _bad_ do zrobienia w dużym rekurencyjnym systemie make. _Every_ _make_ invocation będzie wykonywał 3 zadania (dla '-j3').To może z łatwością zabrać się do kilkudziesięciu równoczesnych prac! Zauważ, że właściwa równoległa marka wymaga, aby wszystkie instancje _make_ rozmawiały ze sobą, aby utrzymać maksymalnie 3 zadania (w tym przypadku) we wszystkich instancjach. Sprytny. – bobbogo

Powiązane problemy