Lực đẩy cho lập trình GPU


10

Tôi rất mới với lập trình GPGPU vì vậy xin vui lòng tha thứ cho tôi nếu câu hỏi không đặc biệt phù hợp. Từ những gì tôi hiểu lập trình GPU là một phần rất phức tạp của công việc kỹ thuật khi so sánh với lập trình CPU thông thường. Người ta phải rất cẩn thận về các vấn đề phân kỳ, ốp lát, cấp phát bộ nhớ được ghim và tính toán giao tiếp / thiết bị máy chủ chồng chéo.

Sau khi thực hiện một chút nghiên cứu, tôi tìm thấy thư viện lực đẩy dường như cố gắng bắt chước C ++ STL. Điều này là khá tốt đẹp. Tuy nhiên, dựa trên kinh nghiệm rất hạn chế của tôi và đã thấy tất cả các quản lý vi mô cần thiết để có được hiệu suất tốt, tôi hơi nghi ngờ về hiệu suất. Lực đẩy có thể xử lý hiệu quả tất cả các phần lập trình phức tạp trong nội bộ? Một số thư viện rất nổi tiếng, chẳng hạn như PETSc, dường như sử dụng gói này khiến tôi tin rằng bằng cách nào đó nên có.

Tôi đã tự hỏi nếu những người có nhiều kinh nghiệm hơn về CUDA và lực đẩy có thể nói một hoặc hai về hiệu suất của gói khi so sánh với chương trình CUDA cấp thấp. Khi nào tôi có thể sử dụng lực đẩy và khi nào tôi nên chuyển về CUDA?


Bạn đã xem ArrayFire chưa?
mảng

Câu trả lời:


2

Tôi không có kinh nghiệm cá nhân với lực đẩy, nhưng tôi sử dụng ViennaCL, một thư viện GPU cấp cao khác ẩn gần như tất cả các chi tiết. Từ điểm chuẩn cá nhân của riêng tôi, tôi có thể thấy tốc độ tăng gấp 2 - 40 lần trên tính toán thực tế nếu bạn bỏ qua thời gian cần thiết để di chuyển xung quanh bộ nhớ.

Khi bạn nên sử dụng CPU so với lực đẩy so với CUDA, tất cả phụ thuộc vào vấn đề bạn đang giải quyết, kỹ năng của bạn và thời gian bạn có sẵn. Tôi khuyên bạn nên bắt đầu bằng cách giải quyết các vấn đề đơn giản với cả 3 phương pháp để xem hiệu suất tương đối của chúng. Sau đó, bạn có thể viết phần mềm thực tế của mình một cách nhanh chóng, đánh giá phần mềm và áp dụng phương pháp gpu thích hợp trong các lĩnh vực cần tăng tốc, thay vì lãng phí thời gian của bạn để viết phần mềm CUDA sẽ chỉ giúp bạn có vài phút thực hiện .


Điều đó làm cho ý nghĩa hoàn hảo với tôi. Một luôn luôn phải hồ sơ đầu tiên. Vì vậy, trong ví dụ của bạn, việc tăng tốc bạn nhận được là từ việc sử dụng ViennaCL. Bạn đã thử OpenCL trực tiếp để kiểm tra sự khác biệt chưa?
GradGuy

Không, giống như bạn, tôi chưa quen với điện toán GPU. Tôi dự định trong một hoặc hai năm tới để từ từ mở rộng các kỹ năng của mình để bao gồm CUDA và OpenCL, nhưng hiện tại tôi chỉ sử dụng thư viện. Tài liệu của ViennaCL tuyên bố rằng có thể tăng tốc hơn nữa với việc triển khai openCL được điều chỉnh có khả năng theo thứ tự của một 2x-10x khác, tuy nhiên tôi đã học được rằng băng thông bộ nhớ là con khỉ đột 900 pound trong phòng thực sự xác định hiệu suất của bạn.
Godric Seer

5

Tôi đã sử dụng Thrust trong dự án mở rộng cụm liên kết của mình. Tùy thuộc vào tình huống, Thrust có thể thực hiện tốt hơn hoặc tốt hơn so với triển khai ở mức độ thấp mà bạn tự cuộn (đặc biệt, reducekernel đã hoạt động khá tốt đối với tôi). Tuy nhiên, tính chất chung và tính linh hoạt của Thrust có nghĩa là đôi khi nó phải thực hiện nhiều thao tác sao chép bổ sung, đệm mảng, v.v ... có thể làm chậm nó đi một chút trong một vài trường hợp cạnh khó chịu. Lần trước tôi sử dụng sortnó khá chậm so với các thư viện khác như b40c hoặc mgpu. Tuy nhiên, NVIDIA đã nỗ lực cải thiện hiệu suất thuật toán của Thrust để có thể ít gặp sự cố hơn trong tương lai.

Bạn nên thử viết mã bằng cả Thrust và CUDA và sau đó sử dụng Visual Profiler để xác định công việc nào tốt hơn cho nhiệm vụ cụ thể mà bạn quan tâm. Nếu việc chuyển bộ nhớ sẽ chiếm thời gian chạy chương trình nhiều nhất và bạn không Tôi không muốn phải lo lắng về việc tối ưu hóa hạt nhân của chính mình cho các xung đột ngân hàng, số chỉ dẫn, v.v. thì tôi sẽ sử dụng Thrust. Nó cũng có lợi ích phụ là làm cho mã của bạn ít dài dòng hơn và dễ dàng hơn cho những người không quen với lập trình GPU để đọc.


3

Mục đích của lực đẩy (như hầu hết các thư viện mẫu) là cung cấp một sự trừu tượng hóa ở mức độ cao, trong khi vẫn giữ được hiệu suất tốt, hoặc thậm chí là xuất sắc.

Tôi đề nghị không nên lo lắng nhiều về hiệu suất, nhưng hãy tự hỏi nếu

  • ứng dụng của bạn có thể được mô tả theo các thuật toán được triển khai trong lực đẩy và nếu

  • bạn thích khả năng viết mã song song "chung chung" mà không cần phải đi sâu vào các chi tiết cơ bản của việc tìm một ánh xạ hiệu quả cho kiến ​​trúc phần cứng / phần mềm nhất định.

Nếu bạn trả lời tích cực cho cả hai câu hỏi, bạn sẽ có thể thực hiện chương trình của mình với ít nỗ lực hơn đối với việc triển khai chỉ CUDA. Sau đó, bạn có thể lập hồ sơ cho ứng dụng của mình và quyết định xem có đáng để thử cải thiện hiệu suất hay không.

Điều này nói rằng, tôi phải thú nhận rằng tôi không thích lập trình "chung chung", bởi vì tôi sẵn sàng học một cái gì đó mới, khi tôi viết một chương trình. Tôi sẽ đi theo một lộ trình khác: viết một triển khai nguyên mẫu bằng python + numpy + scipy, sau đó thêm hạt nhân CUDA cho 1% - 2% mã thực sự cần tối ưu hóa và phù hợp để chạy trên GPU. Tất nhiên, bằng cách đó, bạn cần một số loại tiền khoa học, vì một quyết định sai trong giai đoạn tạo mẫu (ví dụ: cấu trúc dữ liệu không được sử dụng cho hạt nhân CUDA) có thể có kết quả khủng khiếp về hiệu suất. Thông thường cần nhiều lần lặp hơn để có được một mã tốt và không có gì đảm bảo làm tốt hơn lực đẩy.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.