2010-05-31 48 views
7

Tôi đang cố gắng tăng tốc một số phép tính bằng cách sử dụng OpenCL và một phần của thuật toán bao gồm đảo ngược ma trận. Có bất kỳ thư viện mã nguồn mở hoặc mã tự do có sẵn để tính toán lu factorization (lapack dgetrf và dgetri) của ma trận hoặc đảo ngược chung được viết bằng OpenCL hoặc CUDA? Ma trận là thật và vuông nhưng không có bất kỳ đặc tính đặc biệt nào khác ngoài đó. Cho đến nay, tôi đã quản lý để tìm chỉ thực hiện hoạt động ma trận cơ bản-vector cơ bản trên gpu.Đảo ngược ma trận trong OpenCL

Ma trận khá nhỏ, chỉ khoảng 60-100 hàng và cols, vì vậy nó có thể được tính nhanh hơn trên cpu, nhưng nó được sử dụng ở giữa thuật toán, vì vậy tôi sẽ phải chuyển nó sang máy chủ, tính toán nghịch đảo, và sau đó chuyển kết quả trở lại trên thiết bị mà sau đó nó được sử dụng trong các tính toán lớn hơn nhiều.

+0

Bạn cũng nên lưu ý rằng đảo ngược ma trận có thể là một hoạt động tốn kém, đặc biệt là đối với các ma trận lớn và rất thường có một cách khác để giải quyết vấn đề trong tầm tay. LU phân hủy là một "khối xây dựng" có thể được sử dụng để tránh làm một nghịch đảo thực sự. – Tom

Trả lời

5

Tôi không có triển khai trong CL mở, nhưng cả hai "Numerical Recipes" và số "Into to Applied Math" của Gil Strang có các giải thích tuyệt vời có thể dễ dàng viết mã. "NR" có mã C mà bạn có thể điều chỉnh.

tính nghịch đảo

này là không chính xác. Bạn không tính toán nghịch đảo với phân tích LU, bạn đang phân tích ma trận. Nếu bạn muốn nghịch đảo, bạn sẽ phải tiến hành thay thế lùi bằng một loạt các vectơ đơn vị. Đó là một sự khác biệt nhỏ nhưng quan trọng.

11

Nhìn vào ViennaCL: http://viennacl.sourceforge.net/

+0

Đây là những gì tôi muốn. Việc bắt duy nhất là các hạt nhân cho LU factorization không sử dụng xoay vòng, do đó, hiệu suất của họ có thể là khá nghèo và số lượng không ổn định đối với một số đầu vào. – buchtak

1

Tôi biết đây là loại muộn, nhưng nếu bạn đang cố gắng làm bất cứ tính toán ma trận trên một ma trận đó là nhỏ (60-100 hàng), sau đó các tính toán sẽ nhanh hơn nhiều trên CPU chứ không phải là GPU vì thời gian cần để sao chép thông tin từ bộ nhớ chính sang bộ nhớ của GPU. Nếu bạn muốn làm điều này, sau đó tôi sẽ đề nghị xem xét sử dụng một ngôn ngữ song song như OpenMP hoặc MPI vì chúng sẽ cho phép bạn song song mã của bạn để tăng tốc độ tính toán trên CPU.

0

Câu hỏi ban đầu (nay là 7 tuổi) thực sự đã được giải quyết 4 năm sau trong một paper describing matrix inversion in CUDA based on Gauss-Jordan. Nó cố gắng phân phối các tính toán trên các chủ đề khác nhau và đưa ra các chỉ dẫn hiệu suất chi tiết cho các ma trận có kích thước lên đến 2048.

Trong khi không OpenCL, ý tưởng chung sẽ dịch từ CUDA khá dễ dàng.

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