2009-09-12 10 views
16

Tôi muốn biết liệu có bất kỳ thuật toán phổ biến nào (sắp xếp, tìm kiếm, đồ thị, v.v.) được chuyển sang OpenCL (hoặc bất kỳ ngôn ngữ GPU nào) hay không. thuật toán được thực hiện bởi CPU. Tôi đặc biệt quan tâm đến kết quả (số).GPU và hiệu năng CPU cho các thuật toán phổ biến

Cảm ơn!

Trả lời

3

quite a few samples loại điều này trên trang web của NVIDIA. Hãy nhớ rằng một số thứ như phân loại cần các thuật toán đặc biệt cho tính song song hiệu quả và có thể không hoàn toàn hiệu quả như một thuật toán không có luồng trên một lõi đơn.

9

GPU là phần cứng chuyên dụng cao được thiết kế để thực hiện một bộ công việc nhỏ rất tốt và song song cao. Về cơ bản, đây là số học (đặc biệt là tính toán điểm nổi chính xác đơn, mặc dù các GPU mới hơn hoạt động khá tốt với độ chính xác gấp đôi). Vì vậy, chúng chỉ phù hợp với các thuật toán cụ thể. Tôi không chắc chắn nếu phân loại phù hợp với loại đó (trong trường hợp chung ít nhất).

Ví dụ phổ biến hơn là định giá các công cụ tài chính, số lượng lớn ma trận và thậm chí là defeating encryption (bằng vũ lực). Điều đó đang được nói, tôi đã tìm thấy Fast parallel GPU-sorting using a hybrid algorithm.

Một ví dụ thường được trích dẫn khác là running [email protected] on an Nvidia GPU nhưng nó so sánh táo với cam. Các đơn vị làm việc cho GPU khác nhau (và rất hạn chế) so với những gì CPU thường làm.

5

Có một cái nhìn tại thrust:

Thrust là một thư viện CUDA của thuật toán song song với một giao diện giống như C++ Standard Template Library (STL). Lực đẩy cung cấp giao diện cấp cao linh hoạt cho GPU lập trình giúp tăng cường năng suất của nhà phát triển .

+0

Lực đẩy cũng vừa phát hành phiên bản 1.1. – Eric

4

BE WARY, RẤT WARY của bất kỳ số hiệu suất nào được trích dẫn cho GPGPU. Rất nhiều người thích đăng những con số thực sự ấn tượng mà không tính đến thời gian truyền cần thiết để lấy dữ liệu đầu vào từ CPU tới GPU và dữ liệu đầu ra, cả hai đều đi qua một nút cổ chai PCIe.

+0

Điểm cảm ơn. – Chris

+3

Điều này đúng, nhưng nhiều ví dụ trên trang web của NVIDIA là các ứng dụng hoàn chỉnh và chắc chắn bao gồm các lần chuyển này. Mối quan tâm thực sự là: làm thế nào tối ưu hóa là phiên bản CPU trong benchmark? – Eric

0

Thay đổi kích thước hình ảnh phải phổ biến trên nhiều trang web chấp nhận tải lên hình ảnh.

Thay đổi kích thước hình ảnh jpeg có kích thước 2600 x 2000 2 2000MB (thành 512x512) mất 23,5 mili giây trong C# với các tùy chọn chất lượng thấp nhất tuyệt đối và lấy mẫu lân cận gần nhất. Hàm được sử dụng là graphics.DrawImage() dựa trên một. Mức sử dụng CPU cũng là% 21.5.

Lấy mảng "rgba byte array" trên mặt C# và gửi nó tới GPU và thay đổi kích thước trong GPU và đưa kết quả trở lại vào hình ảnh mất 6,3 mili giây và mức sử dụng CPU là% 12,7. Điều này đã được thực hiện với một CPU 55% rẻ hơn chỉ với 320 lõi.

Chỉ có hệ số tăng tốc 3.73X.

Yếu tố giới hạn ở đây là gửi dữ liệu rgb 20MB được trích xuất (jpeg chỉ 2MB!) Tới GPU. Phần thời gian đó chiếm gần 90% tổng thời gian, bao gồm khai thác mảng byte bên C#! Vì vậy, tôi gues sẽ có khoảng 30X tăng tốc ít nhất là nếu một phần khai thác có thể được thực hiện trong GPU quá.

30X không phải là xấu.

Sau đó, bạn có thể tạo đường dẫn lớp tách bằng lớp thay đổi kích thước để ẩn thời gian chờ sao chép bộ nhớ để tăng tốc độ hơn nữa! Đây có thể là 40X-50X.

Sau đó tăng chất lượng lấy mẫu (chẳng hạn như bicubic thay vì hàng xóm gần nhất), bạn thậm chí còn có nhiều lợi thế hơn ở phía GPU. Thêm bộ lọc Gaussian 5x5 chỉ thêm 0,77 milliseond. CPU sẽ nhận được một số thời gian cao hơn trên đó, đặc biệt nếu các tham số Gaussian cần thiết khác với C# .Net thực hiện.


Thậm chí nếu bạn không hài lòng với tốc độ tăng tốc, việc tải xuống GPU và có "lõi miễn phí" trên CPU vẫn thuận lợi để đẩy nhiều công việc hơn cho máy chủ đó.

Bây giờ, hãy thêm thực tế mức tiêu thụ điện năng GPU (30W so với 125W trong ví dụ này), nó sẽ thuận lợi hơn nhiều.


CPU khó có thể giành chiến thắng trong

C[i]=A[i]+B[i] 

chuẩn khi cả hai bên chạy trên mã tối ưu hóa và bạn vẫn có thể giảm tải một nửa số mảng để GPU và kết thúc nhanh hơn sử dụng CPU + GPU cùng lúc.


GPU không được xây dựng cho các công trình không đồng bộ. GPU có đường ống dẫn sâu nên đứng lên sau một gian hàng vì phân nhánh, mất quá nhiều thời gian. Ngoài ra phần cứng kiểu SIMD cũng buộc phải làm điều tương tự trên tất cả các workitems trên đó. Khi một workitem làm một điều khác hơn so với nhóm, nó mất theo dõi và thêm bong bóng trong toàn bộ đường ống SIMD hoặc chỉ đơn giản là những người khác chờ cho điểm đồng bộ. Vì vậy, brancing ảnh hưởng đến cả hai lĩnh vực đường ống sâu và rộng và làm cho nó thậm chí còn chậm hơn so với CPU trong điều kiện hỗn loạn hoàn toàn.