2012-07-29 21 views
8

Tôi đang cố tối ưu hóa một ứng dụng trong mô hình 3D thời gian thực. Phần tính toán của ứng dụng chạy gần như hoàn toàn trên GPU trong CUDA. Ứng dụng này yêu cầu giải pháp của một hệ thống tuyến tính xác định kép đối xứng chính xác kép nhỏ (6x6) Ax = b 500+ lần mỗi giây. Hiện tại, việc này đang được thực hiện với thư viện Linear Algebra dựa trên CPU hiệu quả bằng cách sử dụng Cholesky nhưng cần phải sao chép dữ liệu từ CPU - GPU và quay lại GPU hàng trăm lần mỗi giây và chi phí hạt nhân khởi chạy mỗi lần, v.v.Giải quyết xác định nhỏ đối xứng tích cực Ax = b trên GPU chỉ

Cách thế nào tôi có thể tính toán giải pháp cho hệ thống tuyến tính trên GPU mà không cần phải lấy dữ liệu lên CPU? Tôi đã đọc một chút về thư viện MAGMA nhưng dường như nó sử dụng các thuật toán lai thay vì các thuật toán chỉ của GPU. Tôi đã chuẩn bị thực tế rằng giải pháp của một hệ thống tuyến tính riêng lẻ trên GPU sẽ chậm hơn rất nhiều so với thư viện dựa trên CPU hiện tại nhưng tôi muốn xem liệu giải pháp đó có thể được bù đắp bằng cách xóa hay không. giao tiếp dữ liệu giữa máy chủ và thiết bị và chi phí của hạt nhân khởi chạy hàng trăm lần mỗi giây. Nếu không có GPU chỉ LAPACK giống như thay thế ra có làm thế nào tôi sẽ đi về việc thực hiện một cái gì đó để giải quyết trường hợp 6x6 cụ thể này trên GPU chỉ? Nó có thể được thực hiện mà không cần đầu tư thời gian lớn với các thư viện GPU BLAS chẳng hạn?

+0

Hệ thống tuyến tính 6x6 quá nhỏ, bạn có thể tự viết các phương trình bên trong mã CUDA ... Rõ ràng đối với một hệ thống nhỏ như vậy sẽ rất khó để có được bất kỳ lợi ích nào từ bản chất song song của CUDA, nhưng loại bỏ giao tiếp GPU-CPU sẽ mang lại lợi ích to lớn. Nó sẽ có thể, rằng bạn song song theo một cách khác? Giải quyết hệ thống trên một lõi GPU và sau đó sử dụng nhiều lõi đạt được hơn 500 giải pháp/s. Đó sẽ là tốt nhất, trừ khi bạn cần kết quả từ hệ thống trước đó để bắt đầu làm việc trên hệ thống tiếp theo. – Eiver

+1

@Eiver là tiền. bạn có thể làm những 500 song song hoặc là họ phụ thuộc vào nhau? cho 6x6 cách tiếp cận này http://en.wikipedia.org/wiki/Cholesky_decomposition#Block_variant trông có thể mã hóa bằng tay ... –

Trả lời

3

Mã được đăng NVIDIA cho một bộ giải mã Ax = b được trộn theo lô tới trang web dành cho nhà phát triển đã đăng ký mùa thu năm ngoái. Mã này hoạt động cho các ma trận chung, và sẽ hoạt động tốt cho các nhu cầu của bạn với điều kiện bạn có thể mở rộng các ma trận đối xứng thành các ma trận đầy đủ (đó không phải là vấn đề đối với 6x6?). Khi mã thực hiện xoay vòng, không cần thiết cho ma trận xác định dương, nó không phải là tối ưu cho trường hợp của bạn, nhưng bạn có thể sửa đổi nó cho các mục đích của bạn vì mã nằm dưới giấy phép BSD.

Trang web dành cho nhà phát triển chuẩn của NVIDIA đang gặp phải một số sự cố vào lúc này. Đây là cách bạn có thể tải về mã giải batched vào thời điểm này:

(1) Tới http://www.nvidia.com/content/cuda/cuda-toolkit.html

(2) Nếu bạn có một tài khoản NVdeveloper hiện có (ví dụ như thông qua partners.nvidia.com) click vào liên kết "Đăng nhập vào nvdeveloper" màu xanh lục ở nửa bên phải của màn hình. Nếu không, hãy nhấp vào "Tham gia nvdeveloper" để đăng ký tài khoản mới; yêu cầu cho tài khoản mới thường được chấp thuận trong vòng một ngày làm việc.

(3) Đăng nhập tại dấu nhắc với địa chỉ email và mật khẩu của bạn

(4) Có một phần ở phía bên tay phải có tiêu đề "mới Downloads". Mục thứ năm từ trên cùng là "Batched Solver". Bấm vào đó và nó sẽ đưa bạn đến trang tải xuống cho mã.

(5) Nhấp vào liên kết "tải xuống", sau đó nhấp "Chấp nhận" để chấp nhận các điều khoản cấp phép. Quá trình tải xuống của bạn sẽ bắt đầu.

+0

Cảm ơn bạn rất nhiều, từ một cái nhìn ban đầu về Bộ xử lý theo lô có vẻ như nó sẽ làm những gì tôi tìm kiếm. –

+0

Tôi chỉ hỏi một câu hỏi khác về đại số tuyến tính và GPU mà bạn có thể biết điều gì đó về! http://stackoverflow.com/questions/11778981/code-library-to-calculate-determinant-of-a-small-6x6-matrix-solely-on-gpu –