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.
Lực đẩy cũng vừa phát hành phiên bản 1.1. – Eric