2012-04-09 22 views
5

Chương trình của tôi rất phù hợp với MPI. Mỗi CPU thực hiện công việc riêng, tinh vi (riêng) của nó, tạo ra một double duy nhất, và sau đó tôi sử dụng một MPI_Reduce để nhân kết quả từ mọi CPU.MPI + GPU: cách kết hợp hai kỹ thuật

Nhưng tôi lặp lại điều này nhiều lần, nhiều lần (> 100.000). Vì vậy, nó xảy ra với tôi rằng một GPU sẽ tăng tốc đáng kể mọi thứ lên.

Tôi có google'd xung quanh, nhưng không thể tìm thấy bất cứ điều gì cụ thể. Làm thế nào để bạn đi về trộn MPI với GPU? Có cách nào để chương trình truy vấn và xác minh "oh, này xếp hạng là GPU, tất cả đều là CPU"? Có hướng dẫn được đề xuất hay gì đó không?

Quan trọng, tôi không muốn hoặc cần một bộ đầy đủ các GPU. Tôi thực sự chỉ cần rất nhiều CPU, và sau đó là một GPU duy nhất để tăng tốc độ hoạt động thường được sử dụng MPI_Reduce.

Dưới đây là ví dụ sơ đồ về những gì tôi đang nói về:

Giả sử tôi có 500 CPU. Mỗi CPU bằng cách nào đó tạo ra, ví dụ, 50 double s. Tôi cần nhân tất cả 250,00 trong số double giây này với nhau. Sau đó, tôi lặp lại điều này từ 10.000 đến 1 triệu lần. Nếu tôi có thể có một GPU (ngoài 500 CPU), điều này có thể thực sự hiệu quả. Mỗi CPU sẽ tính 50 double s cho tất cả ~ 1 triệu "trạng thái". Sau đó, tất cả 500 CPU sẽ gửi double s của họ tới GPU. GPU sau đó sẽ nhân 250.000 double s với nhau cho mỗi một triệu "tiểu bang", sản xuất 1 triệu doubles.
Những con số này không chính xác. Tính toán thực sự là rất lớn. Tôi chỉ đang cố gắng truyền đạt vấn đề chung.

+2

Điều này nghe có vẻ không phù hợp lắm với tính toán GPU. Thành phần GPU được đề xuất của bạn chỉ chứa vài trăm MFLops chính xác gấp đôi. Đơn đặt hàng có độ lớn nhỏ hơn lợi nhuận cho GPU và sẽ bị ảnh hưởng bởi chi phí mạng truyền dữ liệu qua dây tới nút Node lưu trữ GPU và qua bus PCI-e vào bộ nhớ GPU – talonmies

+0

@talonmies Xin lỗi cho ví dụ sơ đồ gây hiểu lầm. Tôi sẽ cập nhật trong câu hỏi của mình. phức tạp hơn, tôi cần phải nhân đôi giữa * O * (10k) 'double' lại với nhau, mỗi CPU sẽ tạo ra một loạt các' double '(không chỉ một). Số lượng bang sẽ nằm trong khoảng từ ~ 10.000 đến vài triệu (không phải 100.000 đơn giản) Toàn bộ quá trình này sẽ được lặp lại thường xuyên – cmo

+1

Như tôi đã viết, đó vẫn chỉ là vài trăm MFlops. lượng tính toán, ngay cả đối với CPU. – talonmies

Trả lời

2

Đây không phải là cách để suy nghĩ về những điều này.

Tôi thích nói rằng các công cụ MPI và GPGPU là trực giao (*). Bạn sử dụng MPI giữa các nhiệm vụ (cho các nút suy nghĩ, mặc dù bạn có thể có nhiều nhiệm vụ cho mỗi nút), và mỗi tác vụ có thể hoặc không thể sử dụng một máy gia tốc như GPU để tăng tốc tính toán trong công việc. Không có thứ hạng MPI trên GPU.

Bất kể, Talonmies là đúng; ví dụ cụ thể này không có vẻ như nó sẽ được hưởng lợi nhiều từ một GPU. Và nó sẽ không được giúp đỡ bởi có hàng chục ngàn đôi mỗi nhiệm vụ; nếu bạn chỉ làm một hoặc một vài FLOP mỗi lần, chi phí gửi dữ liệu đến GPU sẽ vượt quá lợi ích của việc có tất cả các lõi đó hoạt động trên chúng.

(*) Điều này được sử dụng để rõ ràng hơn; hiện tại, chẳng hạn như, GPUDirect có thể sao chép bộ nhớ sang GPU từ xa qua vô tuyến, sự phân biệt mờ hơn. Tuy nhiên, tôi duy trì rằng đây vẫn là cách hữu ích nhất để suy nghĩ về mọi thứ, với những thứ như RDMA cho GPU là một tối ưu hóa quan trọng nhưng khái niệm là một tinh chỉnh nhỏ.

+0

Tôi cho rằng tôi đang đánh giá thấp tốc độ của phép nhân 'float' cho một CPU tiêu chuẩn? Tôi đã suy nghĩ: nhân 10.000 'đôi' lại với nhau, và làm điều này ~ 1 triệu lần nghe có vẻ giống như rất nhiều tính toán của helluva (10 tỷ). Không phải nó? – cmo

+0

@CycoMatto: 10.000 nhân đôi của bạn nhân với 1 triệu lần có cùng số lượng flop như nhân một cặp ma trận dày đặc 1800x1800. Một lần. Đó là một vài giây CPU sử dụng ngay cả một bộ vi xử lý x86 khiêm tốn với BLAS được điều chỉnh hợp lý ..... – talonmies

+0

@talonmies OK. Và điều gì sẽ xảy ra nếu có một mức độ reptition/looping khác? tức là: Tôi có ~ 1 triệu thử nghiệm. Mỗi thử nghiệm phải tổng cộng hơn 1 triệu tiểu bang. Mỗi tiểu bang yêu cầu nhân lên ~ 10.000 đôi. Vì những lý do này, tôi đã được khắc phục trên GPU + MPI – cmo

0

Here Tôi đã tìm thấy một số thông tin về chủ đề:

"Bộ KH & ĐT, các MPI, là một API chuẩn để giao tiếp dữ liệu qua tin nhắn giữa các quá trình phân phối thường được sử dụng trong HPC để xây dựng các ứng dụng mà có thể Vì vậy, MPI hoàn toàn tương thích với CUDA, được thiết kế cho tính toán song song trên một máy tính hoặc một nút. Có nhiều lý do để kết hợp hai phương pháp lập trình song song của MPI và CUDA. lý do phổ biến là cho phép giải quyết các vấn đề với kích thước dữ liệu quá lớn để vừa với bộ nhớ của một GPU, hoặc điều đó đòi hỏi thời gian tính toán dài không hợp lý trên một nút.Một lý do khác là tăng tốc một ứng dụng MPI hiện có với GPU hoặc để kích hoạt một ứng dụng multi-GPU đơn nút hiện có để mở rộng trên nhiều nút. Với MPI của CUDA, các mục tiêu này có thể đạt được một cách dễ dàng và hiệu quả. Trong bài này, tôi sẽ giải thích cách thức hoạt động của MPI của CUDA, tại sao nó hiệu quả và cách bạn có thể sử dụng nó. "

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