2013-09-01 49 views
5

Tôi đang tìm hàm multiscan/đa tiền tố hiệu suất cao (nhiều hàng trong một thực thi hạt nhân) cho dự án của tôi trong CUDA.chức năng tổng hợp/quét tiền tố hiệu năng cao trong CUDA, tìm kiếm lực đẩy, thư viện cuDPP thay đổi

Tôi đã thử một từ thư viện Thrust nhưng đó là một cách quá chậm. Ngoài ra lực đẩy đâm sau khi được biên dịch với cờ gỡ lỗi nvcc (-g -G).

Sau khi thất bại với Lực đẩy, tôi tập trung vào thư viện cuDPP vốn từng là một phần của bộ công cụ CUDA. Hiệu suất cuDPP thực sự tốt nhưng thư viện không cập nhật với cuda 5.5 mới nhất và có một số vấn đề vi phạm bộ nhớ toàn cục trong hàm cudppMultiScan() trong khi gỡ rối với bộ kiểm tra bộ nhớ. (cuda 5.5, nsight 3.1, studio trực quan 2010, gtx 260 cc 1.3)

Có ai có ý tưởng gì để sử dụng thay vì hai thư viện này không?

R.

+0

Bạn đã xem [ArrayFire] (http://accelereyes.com/arrayfire), chúng tôi làm việc với AccelerEyes chưa? – arrayfire

+0

không, chưa từng thấy trước đây, trông khá thú vị! cảm ơn! :) những gì về hiệu quả của nó? Có năng suất hay thư viện định hướng hiệu suất hơn không? – user1946472

+0

Nếu bạn muốn sử dụng Lực đẩy để quét các hàng của ma trận, không gọi lại 'bao gồm_scan'. Chỉ định mỗi hàng một chỉ mục và sử dụng 'including_scan_by_key'. Bạn có thể điều chỉnh [ví dụ] này (https://github.com/thrust/thrust/blob/master/examples/sum_rows.cu). –

Trả lời

2

Những thư viện, đặc biệt là lực đẩy, cố gắng càng generic càng tốt và tối ưu hóa thường đòi hỏi chuyên môn: Ví dụ một chuyên môn hóa của một thuật toán có thể sử dụng bộ nhớ chia sẻ với nhiều loại cơ bản (như int hoặc float) nhưng phiên bản chung không thể. Nó xảy ra rằng đối với một tình huống cụ thể một chuyên môn là mất tích!

Bạn nên sử dụng những thư viện chung được thử nghiệm này càng nhiều càng tốt nhưng đôi khi, đối với một số phần quan trọng về hiệu suất, việc triển khai của riêng bạn là một tùy chọn để xem xét.

Trong trường hợp của bạn, bạn muốn quét nhiều lần song song với các hàng khác nhau. Việc triển khai tốt sẽ không chạy quét riêng cho các hàng khác nhau: Nó sẽ có cùng một cuộc gọi hạt nhân chạy đồng thời cho tất cả các phần tử của tất cả các hàng. Tùy thuộc vào chỉ mục của nó, một luồng có thể biết được hàng nào đang xử lý và sẽ bỏ qua tất cả dữ liệu ngoài hàng.

Chuyên môn hóa đó yêu cầu một hàm trả về giá trị hấp thụ ngăn chặn các hàng trộn. Tuy nhiên, việc triển khai cẩn thận của riêng bạn có thể sẽ nhanh hơn.

2

Để viết prefix quét riêng bạn, bạn có thể tham khảo

  1. Ví dụ quét của CUDA SDK;
  2. Chương 13 của N. Wilt, "Sổ tay CUDA";
  3. Chương 6 của S. Cook, "Lập trình CUDA, Hướng dẫn của nhà phát triển về tính toán song song với GPU";
  4. Parallel Prefix Sum (Scan) with CUDA.

Để thực hiện nhiều tiền tố, bạn có thể khởi chạy nhiều lần cùng một hạt nhân (như đề xuất bởi a.lasram) hoặc cố gắng đạt được cuncurrency bằng luồng CUDA, mặc dù tôi không biết điều này sẽ hoạt động hiệu quả cho thẻ của bạn .

+0

Sử dụng luồng là ý tưởng tuyệt vời nhưng tôi nghĩ tốt hơn nên khởi chạy một hạt nhân duy nhất trong đó mỗi chuỗi sẽ "kẹp" tính toán trong một hàng được chọn –

+0

Tôi có 231 hàng 1424 float để thực thi mỗi hàng trong hạt nhân riêng biệt cho thời gian quá lớn chi phí do cudalaunch gây ra. cuDPP thực hiện công việc này trong khoảng 0,11 ms trên máy tính của tôi (gtx260) mà đối với tôi là kết quả tuyệt vời! Trong trường hợp hiệu suất cuDPP lib là hoàn hảo. Bây giờ tôi sẽ thử thư viện arrayFire được gợi ý bởi @accelereyes. Cảm ơn bạn vì câu trả lời. – user1946472