2011-08-17 44 views
16

Tôi biết nhiều ví dụ khi GPU nhanh hơn CPU nhiều. Nhưng tồn tại các thuật toán (các vấn đề) rất khó để song song. Bạn có thể cho tôi một số ví dụ hoặc kiểm tra khi CPU có thể vượt qua GPU không?cpu vs gpu - khi CPU tốt hơn

Chỉnh sửa:

Cảm ơn bạn đã đề xuất! Chúng tôi có thể làm cho một so sánh giữa phổ biến nhất và mới nhất của CPU và CPU, ví dụ Core i5 2500k vs GeForce GTX 560 Ti.

Tôi tự hỏi cách so sánh mô hình SIMD giữa chúng. Ví dụ: Cuda gọi một mô hình SIMD chính xác hơn SIMT. Nhưng SIMT nên được so sánh với multhitreading trên CPU của đó là phân phối các chủ đề (nhiệm vụ) giữa các lõi MIMD (Core i5 2500k cho 4 lõi MIMD). Mặt khác, mỗi lõi MIMD này có thể thực hiện mô hình SIMD, nhưng đây là một cái gì đó khác hơn SIMT và tôi không biết làm thế nào để so sánh chúng. Cuối cùng, một kiến ​​trúc fermi với việc thực thi hạt nhân đồng thời có thể được coi là lõi MIMD với SIMT.

+1

Vui lòng đọc [bài đăng blog] (http://blog.stackoverflow.com/2011/08/gorilla-vs-shark/) trước khi hỏi thêm bất kỳ câu hỏi như thế này trên stackoverflow. – talonmies

+1

@talonmies: Tôi không đồng ý: đây là một câu hỏi rất cụ thể với một câu trả lời rất cụ thể. Điểm duy nhất chống lại nó là nó có thể là một bản sao của một số câu hỏi khác. –

+1

bản sao có thể có của [GPGPU vs. Multicore?] (Http://stackoverflow.com/questions/5919172/gpgpu-vs-multicore) –

Trả lời

15

Dựa trên kinh nghiệm của tôi, tôi sẽ tóm tắt những khác biệt chính về hiệu suất giữa các chương trình song song trong CPU và GPU. Tin tôi đi, một sự so sánh có thể được thay đổi từ thế hệ này sang thế hệ khác. Vì vậy, tôi sẽ chỉ ra những gì là tốt và là xấu cho CPU và GPU. Tất nhiên, nếu bạn thực hiện một chương trình ở mức cực đoan, tức là chỉ có các mặt xấu hoặc tốt, nó sẽ chạy chắc chắn là nhanh hơn trên một nền tảng. Nhưng một hỗn hợp của những người đòi hỏi phải có lý luận rất phức tạp.

cấp chương trình Máy chủ

Một sự khác biệt quan trọng là chi phí chuyển bộ nhớ. Thiết bị GPU yêu cầu một số bộ nhớ chuyển. Chi phí này không quan trọng trong một số trường hợp, ví dụ khi bạn phải thường xuyên chuyển một số mảng lớn. Theo kinh nghiệm của tôi, chi phí này có thể được giảm thiểu nhưng đẩy hầu hết mã máy chủ vào mã thiết bị. Các trường hợp duy nhất bạn có thể làm như vậy là khi bạn phải tương tác với hệ điều hành máy chủ trong chương trình, chẳng hạn như xuất ra để theo dõi.

cấp chương trình Device

Bây giờ chúng ta sẽ thấy một bức tranh phức tạp mà vẫn chưa được tiết lộ đầy đủ được nêu ra. Ý tôi là có nhiều cảnh bí ẩn trong các GPU chưa được tiết lộ. Nhưng vẫn còn, chúng tôi có rất nhiều phân biệt CPU và GPU (mã hạt nhân) về hiệu suất.

Có một vài yếu tố khiến tôi nhận thấy những yếu tố đó góp phần đáng kể vào sự khác biệt.

  • phân phối Workload

GPU, trong đó bao gồm nhiều đơn vị thi công, được thiết kế để xử lý các chương trình ồ ạt song song. Nếu bạn có ít công việc, hãy nói một vài nhiệm vụ tuần tự, và đặt các tác vụ này lên GPU, chỉ một vài trong số đó có nhiều đơn vị thực thi đang bận, do đó sẽ chậm hơn CPU. Bởi vì CPU, mặt khác, tốt hơn để xử lý các nhiệm vụ ngắn và tuần tự. Lý do là đơn giản, CPU phức tạp hơn nhiều và có khả năng khai thác song song mức lệnh, trong khi các GPU khai thác tính song song mức thread. Vâng, tôi nghe nói NVIDIA GF104 có thể làm Superscalar, nhưng tôi không có cơ hội để trải nghiệm với nó mặc dù. Cần lưu ý rằng, trong GPU, khối lượng công việc được chia thành các khối nhỏ (hoặc nhóm làm việc trong OpenCL) và khối được sắp xếp theo khối, mỗi khối được thực hiện trong một bộ xử lý Streaming (Tôi đang sử dụng thuật ngữ từ NVIDIA) . Nhưng trong các CPU, các khối đó được thực thi tuần tự - tôi không thể nghĩ ra bất cứ điều gì khác ngoài một vòng lặp đơn.

Do đó, đối với các chương trình có số lượng khối nhỏ, nó sẽ là có khả năng để chạy nhanh hơn trên CPU.

  • hướng dẫn luồng kiểm soát

Chi nhánh là điều xấu để GPU, luôn luôn. Xin lưu ý rằng GPU thích những thứ như nhau. Các khối bằng nhau, các luồng bằng nhau trong một khối và các luồng bằng nhau trong một sợi dọc. Nhưng điều gì quan trọng nhất?

      ***Branch divergences.*** 

Các lập trình viên Cuda/OpenCL ghét phân kỳ chi nhánh. Vì tất cả các chủ đề được chia thành 32 bộ, được gọi là một sợi dọc, và tất cả các chuỗi trong một warp được thực hiện ở bước khóa, phân nhánh chi nhánh sẽ làm cho một số luồng trong dọc được nối tiếp. Do đó, thời gian thực hiện của sợi dọc sẽ được nhân lên tương ứng.

Không giống như GPU, mỗi lõi trong CPU có thể đi theo đường dẫn riêng của chúng. Hơn nữa, các nhánh có thể được thực thi hiệu quả vì các CPU có dự đoán nhánh.

Do đó, các chương trình có nhiều phân kỳ dọc hơn là có khả năng để chạy nhanh hơn trên CPU.

  • hướng dẫn truy cập bộ nhớ

Đây thực sự là phức tạp đủ để chúng ta hãy làm cho nó ngắn gọn.

Hãy nhớ rằng truy cập bộ nhớ toàn cầu có độ trễ rất cao (400-800 chu kỳ). Vì vậy, trong các thế hệ cũ của GPU, cho dù truy cập bộ nhớ được kết hợp lại là một vấn đề quan trọng. Bây giờ GTX560 (Fermi) của bạn có 2 cấp cache. Vì vậy, chi phí truy cập bộ nhớ toàn cầu có thể giảm trong nhiều trường hợp. Tuy nhiên, bộ nhớ cache trong CPU và GPU khác nhau, vì vậy hiệu ứng của chúng cũng khác nhau. Điều tôi có thể nói là nó thực sự thực sự phụ thuộc vào mẫu truy cập bộ nhớ của bạn, mẫu mã hạt nhân của bạn (cách truy cập bộ nhớ được xen kẽ với tính toán, các loại hoạt động, v.v.) để biết liệu có chạy nhanh hơn trên GPU hay không. hoặc CPU.

Nhưng bằng cách nào đó bạn có thể mong đợi một số lượng lớn bộ nhớ cache bị thiếu (trong GPU) có ảnh hưởng rất xấu đến GPU (mức độ xấu? - tùy thuộc vào mã của bạn).

Ngoài ra, bộ nhớ dùng chung là một tính năng quan trọng của GPU. Việc truy cập vào bộ nhớ dùng chung cũng nhanh như truy cập vào bộ nhớ cache L1 của GPU. Vì vậy, hạt nhân sử dụng bộ nhớ chia sẻ sẽ có nhiều lợi ích.

Một số yếu tố khác mà tôi đã không thực sự đề cập nhưng những người có thể có ảnh hưởng lớn đến hiệu quả hoạt động trong nhiều trường hợp như mâu thuẫn ngân hàng, kích thước của giao dịch bộ nhớ, GPU công suất ...

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