2015-03-03 14 views
9

Sự khác biệt giữa cụm và lõi trong registerDoParallel khi sử dụng gói doParallel là gì?doParallel, cluster vs core

là hiểu biết của tôi đúng khi cho rằng trên máy tính đơn lẻ đây là những hoán đổi cho nhau và tôi sẽ nhận được kết quả tương tự cho:

cl <- makeCluster(4) 
registerDoParallel(cl)  

registerDoParallel(cores = 4) 

Sự khác biệt duy nhất tôi thấy rằng makeCluster() phải được dừng lại một cách rõ ràng sử dụng stopCluster().

+0

Không chắc chắn, nhưng tôi đoán bạn sẽ bị giới hạn về số lượng lõi, nhưng không phải theo số lượng cụm, tức là số lượng "bản sao R chạy song song và giao tiếp trên ổ cắm". Tất nhiên, các cụm có thể có khả năng chia sẻ cùng một lõi, tùy thuộc vào số lượng các cụm/số lõi. –

+1

Tôi có xu hướng đồng ý với @Pascal và rằng không có bất kỳ sự khác biệt nào trên một máy tính duy nhất, ngoài việc thực sự cố gắng tìm hiểu những gì có thể đạt được và cách mọi thứ hoạt động. Nếu bạn chỉ muốn song song một số mã, thì nó cũng không thành vấn đề. – LauriK

Trả lời

5

Có, nó ngay từ chế độ xem phần mềm.

trên máy đơn này có thể hoán đổi cho nhau và tôi sẽ nhận được kết quả tương tự.


Để hiểu 'cụm' và 'lõi' rõ ràng, tôi đề nghị phải suy nghĩ từ 'phần cứng' và mức độ 'phần mềm'.

Ở cấp phần cứng, 'cụm' có nghĩa là các máy được kết nối mạng có thể làm việc cùng nhau bằng các liên lạc như ổ cắm (Cần thêm các hoạt động init/stop như stopCluster bạn đã chỉ định). Trong khi 'lõi' có nghĩa là một số lõi phần cứng trong CPU cục bộ và chúng hoạt động cùng nhau bằng bộ nhớ chia sẻ thông thường (không cần gửi thông báo rõ ràng từ A đến B).

Ở cấp phần mềm, đôi khi ranh giới của clustercores không rõ ràng. Chương trình có thể được chạy bằng cục bộ hoặc từ xa theo cụm, và phần mềm mức cao không cần biết chi tiết. Vì vậy, chúng ta có thể kết hợp hai chế độ như sử dụng giao tiếp rõ ràng ở địa phương như thiết lập cl trong một máy, và cũng có thể chạy đa lõi trong mỗi máy từ xa.


Về câu hỏi của bạn, được thiết cl hoặc cores bình đẳng?

Từ phần mềm, sẽ giống như chương trình sẽ được chạy bởi cùng số lượng máy khách/máy chủ và sau đó nhận được kết quả tương tự.

Từ phần cứng, nó có thể khác. cl có nghĩa là giao tiếp rõ ràng và cores cho bộ nhớ dùng chung nhưng nếu phần mềm cấp cao được tối ưu hóa rất tốt. Trong máy cục bộ, cả hai thiết lập sẽ đi vào cùng một dòng chảy. Tôi không nhìn vào doParallel rất sâu bây giờ, vì vậy tôi không chắc chắn nếu hai cái này giống nhau.

Nhưng trong thực tế, tốt hơn là chỉ định cores cho máy đơn lẻ và cl cho cụm.

Hy vọng trợ giúp này dành cho bạn.

+0

Điều này quá chung chung. Câu hỏi của OP là một câu hỏi cụ thể về gói doParallel, không phải là một câu hỏi khái niệm chung. Đối với câu hỏi này, đó là nhiều hơn về triển khai nền tảng và chúng khác nhau ngay cả đối với máy đơn lẻ. – dracodoc

1

Tôi nghĩ câu trả lời được chọn quá chung chung và thực sự không chính xác, vì nó không chạm vào chi tiết của gói doParallel. Nếu bạn đọc các họa tiết, nó thực sự khá rõ ràng.

Gói song song về cơ bản là một sự hợp nhất của gói đa lõi , được viết bởi Simon Urbanek, và gói tuyết, được viết bởi Luke Tierney và những người khác. Chức năng đa phương tiện chỉ hỗ trợ nhiều người lao động trên những hệ điều hành hỗ trợ cuộc gọi hệ thống ngã ba; điều này không bao gồm Windows. Theo mặc định , doParallel sử dụng chức năng đa lõi trên các hệ thống giống như Unix và chức năng tuyết trên Windows.

Chúng tôi sẽ sử dụng chức năng tuyết giống như trong họa tiết này, vì vậy chúng tôi bắt đầu bằng cách tải gói và bắt đầu một cụm

Để sử dụng chức năng đa lõi như, chúng tôi sẽ xác định số lượng lõi để sử dụng thay

Tóm lại, điều này phụ thuộc vào hệ thống. Cụm là chế độ tổng quát hơn bao gồm tất cả các nền tảng và lõi chỉ dành cho hệ thống giống Unix.

Để làm cho giao diện nhất quán, gói sử dụng cùng chức năng cho hai chế độ này.

> library(doParallel) 
> cl <- makeCluster(4) 
> registerDoParallel(cl) 
> getDoParName() 
[1] "doParallelSNOW" 

> registerDoParallel(cores=4) 
> getDoParName() 
[1] "doParallelMC" 
3

Hành vi của doParallel::registerDoParallel(<numeric>) phụ thuộc vào hệ điều hành, xem print(doParallel::registerDoParallel) để biết chi tiết.

Trên máy Windows,

doParallel::registerDoParallel(4) 

hiệu quả làm

cl <- makeCluster(4) 
doParallel::registerDoParallel(cl) 

tức là nó thiết lập bốn ("PSOCK") công nhân chạy trong phiên R nền. Sau đó, %dopar% về cơ bản sẽ sử dụng máy móc parallel::parLapply(). Với thiết lập này, bạn phải lo lắng về các biến toàn cầu và các gói được gắn vào mỗi công nhân.

Tuy nhiên, trên máy không phải là Windows,

doParallel::registerDoParallel(4) 

kết quả sẽ là %dopar% sẽ sử dụng các máy móc parallel::mclapply(), mà lần lượt dựa vào chia hai quy trình. Kể từ khi sử dụng forking, bạn không phải lo lắng về globals và gói.

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