2009-10-07 77 views
15

Thiết lập nào hoạt động cho GNU thực hiện các công việc song song (-j) trên Windows?Thực hiện (Công việc song song) trên Windows

Tôi đã thử cài đặt trình bao thành cmd.exe bằng cách sử dụng MinGW tạo 3.81, điều này hoạt động trong việc tạo nhiều quy trình nhưng không thành công với thông báo "đang chờ công việc".

Điều này có thể hoạt động và thiết lập tốt nhất không? (MinGW/Cygwin/???) Ai đó có thể chỉ cho tôi một ví dụ làm việc để kiểm tra không?

Trả lời

2

Tôi chưa bao giờ có bất kỳ biểu tượng nào bằng cách sử dụng make -jn trong Cygwin. Nó hoạt động khá tốt. Tôi thường xuyên sử dụng nó với trình biên dịch cl.exe của Microsoft. Nó chỉ hoạt động ra khỏi hộp cho tôi. Rất giống UNIX, đó là một điều tốt ™. Xây dựng kịch bản cổng độc đáo với Linux và Mac. Khuyên dùng kỹ lưỡng.

Không bao giờ thích MinGW thực hiện kể từ khi tôi đến một nơi mà 5 back-slashes quá ít, nhưng sáu là quá nhiều. Thở dài! (Để thực hiện với các hack của MinGW để làm cho các tên đường dẫn bị gạch chéo ngược cho phép trong AFAIK.)

+0

Quyền của bạn. Tôi đã làm cho nó hoạt động như bạn mô tả - tôi chỉ cần gỡ rối một makefile khủng khiếp để tìm một điểm thích hợp để làm -j (gọi điện thoại làm cho gọi làm ...). – Oliver

+0

nếu bạn đang sử dụng trình bao Cygwin/MinGW: đừng quên đặt biến hệ thống 'shell' thành' cmd' (nếu không sh hoặc sh.exe sẽ được sử dụng theo mặc định (ví dụ trên cygwin ...) và bạn đã thắng không thể hỗ trợ thực thi đa tiến trình). chỉ cần xuất 'SHELL = CMD'. dễ dàng. –

+0

@Karako Noooo, xin vui lòng _don't_ làm điều đó. 'sh' chỉ hoạt động. Nó là nền tảng chéo. Nó không có vấn đề song song. (trên _cygwin_ anyway - không thể xác minh cho _mingw_.) 'cmd' chỉ là khủng khiếp. – bobbogo

3

Theo như tôi có thể hiểu, các công việc song song của GNU Make phụ thuộc vào nền tảng cơ bản để cung cấp thông tin tải (CPU). Điều này không may được thực hiện theo cách không tương thích với Windows và chỉ lệnh "make -j" thực hiện bất cứ điều gì theo chiều rộng. Lệnh đó (không có số lượng công việc tối đa) có khả năng khá nguy hiểm, vì nó sẽ ăn bộ nhớ giống như một con chó chết đói (tôi đã thử nó trên Qt, và nó bị rơi trên QtWebkit, dự án lớn nhất trong Qt, RAM 4GB, Win7). Trong suy nghĩ thứ hai, tôi có cảm giác make -j3 chạy nhanh hơn thực hiện, nhưng với những gì tôi có thể tìm thấy trên web (diễn đàn, hướng dẫn ...) có vẻ như chức năng đặc biệt của POSIX/linux.

BTW, tôi rất ngạc nhiên khi câu hỏi của bạn bị bỏ phiếu.

3

Tôi đã tìm thấy this Danny Thorpe's blog entry giải thích sự cố với việc tạo song song trên Windows. Về cơ bản những gì nó gợi ý là để thiết lập biến môi trường sau đây đầu tiên:

set SHELL=cmd.exe 

Với điều đó, tôi đã có thể chạy lệnh make -j phong cách, nhưng tiếc là không phải là kiểm soát make -jN lệnh phong cách.

3

Tôi đã giải quyết vấn đề này vì vậy tôi chia sẻ giải pháp cho mọi người.

Bạn có thể thử MinGW-TDM (Trang chủ: http://tdm-gcc.tdragon.net/) hoặc MinGW-Equation (Tải xuống trang: http://www.equation.com/servlet/equation.cmd?fa=fortran).

Cài đặt phiên bản 32 bit để D:\MinGW\MinGW32 ví dụ (và 64 bit, phiên bản D: \ MinGW \ MinGW64 nếu bạn muốn sử dụng 64 bit nhị phân lập)

Tạo một tập tin thực thi như sau sau đó chạy nó ở xây dựng của bạn thư mục:

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 

Bạn có thể tải xuống MSYS từ http://sourceforge.net/apps/trac/mingw-w64/wiki/MSYS. Nó có nhiều tiện ích giống như UNIX yêu cầu xây dựng nhiều thư viện nguồn mở, các ứng dụng.

Trong đó -j6 là tùy chọn chạy 6 công việc biên dịch song song.

CHỈ DẪN: bạn có thể đặt tùy chọn -jN trong đó N = số lõi CPU của bạn (chủ đề) nhiều gấp 1,5 lần. Trong trường hợp của tôi, CPU của tôi có 4 luồng nên tôi đặt giá trị này thành 6.

Lưu ý: bạn có thể chạy

make.exe -jN -f makefile

mà khôngSHELL=CMD.exe lựa chọn và biên soạn của bạn được chạy song song nhưng nó không tương thích trong một số trường hợp (trong đó make.exe đến từ thư mục MSYS).

Kính trọng,

+0

xuất hiện bình thường MinGW đi kèm với điều này quá, không chỉ TDM, và nó hoạt động, cuối cùng làm việc song song làm cho không chỉ treo bằng cách sử dụng 100% cpu LOL – rogerdpack

3

Một mẹo có thể giúp người sử dụng CMake

Tùy chọn -jN không hoạt động khi một cuộc gọi makefile làm đệ quy như cmake-makefiles thường làm. Nhưng có một biện pháp khắc phục một lần nữa hoạt động vì trong các makefiles tạo ra các cuộc gọi CMake thông qua cú pháp như vậy.

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

Điều này có nghĩa bạn có thể thay đổi MAKE biến:

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

Bây giờ mỗi khi một tiểu dự án-làm được khởi động, nó một lần nữa nhận được tùy chọn "-j3". Nhưng lưu ý rằng điều này có hiệu quả không giới hạn số lượng biên dịch song song thành 3 như bạn mong đợi. Nếu bạn có nhiều hơn 3 dự án không phụ thuộc vào nhau trên cùng một hệ thống phân cấp thì tất cả 3 dự án sẽ xây dựng song song và mỗi dự án khởi chạy 3 bước biên dịch. Kết quả trong 9 bước biên dịch song song.

Khi chúng ta xem xét kỹ hơn Makefile hàng đầu được tạo bởi cmake thì chúng ta thấy rằng đích "tất cả" về cơ bản chỉ bắt đầu tạo phụ.

$(MAKE) -f CMakeFiles\Makefile2 all 

Vì vậy, chúng ta có thể loại bỏ một lớp tiểu dự án xử lý song song bằng cách gọi

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

Nhưng điều này đã hy sinh tiến độ báo cáo.

Tôi hy vọng điều này sẽ giúp ích cho bạn.

+0

Điều này hoạt động rất độc đáo như một workaround, cảm ơn! Tôi khá chắc chắn nó không chỉ hữu ích cho người dùng cmake, quá :-) - đệ quy làm cho không phải là bất thường. –

+0

Urk! Điều này nghe giống như một điều _bad_ để làm trong một hệ thống làm đệ quy lớn. Lệnh _Every_ _make_ sẽ chạy 3 công việc (cho '-j3').Điều đó có thể dễ dàng chạy đến hàng tá công việc đồng thời trong tổng số! Lưu ý rằng việc thực hiện song song phù hợp đòi hỏi tất cả các cá thể _make_ phải nói chuyện với nhau để duy trì tối đa 3 công việc (trong trường hợp này) trên tất cả các trường hợp. Tài giỏi. – bobbogo

Các vấn đề liên quan