2015-04-05 31 views
5

Tôi đang tìm cách làm việc với khoảng 4000 ma trận kích thước cố định (3x3, 4x4), làm những việc như đảo ngược ma trận và eigendecomposition.Làm việc với nhiều ma trận kích thước cố định trong hạt CUDA

Dường như với tôi cách tốt nhất để song song điều này sẽ là để cho mỗi chủ đề GPU hoạt động trên một trường hợp đơn lẻ của sự cố.

Có cách nào hợp lý để thực hiện việc này không? Tôi đã đọc: http://www.culatools.com/blog/2011/12/09/batched-operations/ nhưng theo như tôi có thể nói, nó luôn luôn là một cái gì đó là "được làm việc trên" không có giải pháp trong tầm nhìn. Ba năm sau, tôi hy vọng có một giải pháp tốt.

Cho đến nay, tôi đã xem xét:

  • Sử dụng Eigen trong hạt nhân CUDA: http://eigen.tuxfamily.org/dox-devel/TopicCUDA.html. Nhưng đây là trong giai đoạn trứng nước: do đó, nó không có vẻ hoạt động tốt và một số thứ không được thực hiện. Hơn nữa, tôi không chắc chắn nếu nó được tối ưu hóa cho CUDA ở tất cả. Hầu như không có tài liệu nào và ví dụ duy nhất của mã là một tệp thử nghiệm (eigen/test/cuda_basic.cu). Khi tôi cố gắng sử dụng Eigen trong hạt nhân CUDA, những thứ đơn giản như tuyên bố một số Eigen::MatrixXf trong hạt nhân không tồn tại biên dịch với nvcc V7.0.27 và Eigen 3.2.90 (mercurial).
  • Sử dụng thư viện API thiết bị cuBLAS để chạy các thủ tục BLAS trong hạt nhân. Có vẻ như cuBLAS và ilk của nó được viết để được song song ngay cả đối với ma trận nhỏ, có vẻ quá mức cần thiết và có khả năng làm chậm cho ma trận 3x3 và 4x4 mà tôi quan tâm. Ngoài ra, tôi không chắc liệu có bất kỳ điều gì giống như cuBLAS cũng có thể làm eigendecomposition hoặc SVD. (Theo như tôi biết, CULA không hỗ trợ gọi các thường trình của nó từ bên trong các hạt nhân).
  • Nhân xử lý lô bằng luồng CUDA. Trong phần 2.1.7 "Nhân bản phân tử" của tài liệu cuBLAS cho Bộ công cụ CUDA v7.0, điều này được đề xuất. Nhưng "" "trong thực tế, không thể có hơn 16 hạt nhân đồng thời thực thi cùng một lúc" "" và do đó sẽ là khủng khiếp khi xử lý 4000 ma trận nhỏ. Trong một liên kết đã nói trên đến bài đăng trên blog của CULA, tôi trích dẫn, "" "Theo lý thuyết, có thể sử dụng luồng CUDA cho mỗi vấn đề và khởi chạy một vấn đề tại một thời điểm. Điều này sẽ không thành công vì hai lý do. Đầu tiên là Số lượng chủ đề cho mỗi khối sẽ quá thấp, [...] Thứ hai là chi phí phát sinh bằng cách khởi chạy hàng nghìn hoạt động theo cách này sẽ là không thể chấp nhận được, vì mã khởi chạy là đắt tiền (nếu không đắt hơn) khi thực hiện ma trận trên CPU. "" "
  • Thực hiện phép nhân và ma trận eigendecomposition của riêng tôi trong nhân. Điều này có thể rất chậm, và có thể ngoài ra tốn thời gian để thực hiện.

Tại thời điểm này, tôi bị cám dỗ từ bỏ việc này trên GPU. Đó là một điều đáng tiếc, vì tôi đã hy vọng cho hiệu suất thời gian thực cho một thuật toán đòi hỏi đảo ngược 4000 x 3 ma trận khoảng 100 lần mỗi 0,1 giây.

+0

Tôi có cùng một vấn đề: phân tích eigen cho nhiều ma trận 3x3 nhỏ. Sẽ được tốt đẹp để xem một số giải pháp gpu. Bài đăng hay. –

Trả lời

3

Các chức năng cublas getrfBatched và getriBatch được thiết kế để đảo ngược hàng loạt các ma trận nhỏ. Điều này nên được nhanh hơn hoặc song song năng động hoặc suối (phương pháp tiếp cận thứ 2 và thứ 3 của bạn.) Ngoài ra một loạt giải quyết có sẵn trong source code form mà có thể làm đảo ngược ma trận. Bạn sẽ cần đăng nhập với tư cách là nhà phát triển đã đăng ký tại developer.nvidia.com để truy cập liên kết này.

Ngoài ra, tôi không chắc chắn nếu có bất kỳ điều gì giống như cuBLAS cũng có thể làm eigendecomposition hoặc SVD. (Theo như tôi biết, CULA không hỗ trợ gọi các thường trình của nó từ bên trong các hạt nhân).

Cusolver cung cấp một số eigen solver functions.Tuy nhiên, chúng không được sắp xếp theo lô và cũng không thể gọi từ mã thiết bị, vì vậy bạn phải đối mặt với luồng là tùy chọn duy nhất vượt ra ngoài đó.

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