Cách nhanh nhất để tìm bản gốc của ma trận không đối xứng nhỏ trên GPU trong bộ nhớ dùng chung


9

Tôi có một vấn đề trong đó tôi cần tìm tất cả các giá trị riêng (như trong giá trị riêng là dương) của một ma trận không đối xứng nhỏ (thường nhỏ hơn 60x60). Tôi có thể ngừng tính toán khi giá trị riêng nhỏ hơn một ngưỡng nhất định. Tôi biết rằng giá trị bản địa là có thật. Bất kỳ đề xuất nào về các thuật toán tôi có thể sử dụng để cố gắng đạt được hiệu suất tốt nhất? Tôi phải thực hiện vài nghìn phân tách này, vì vậy tốc độ rất quan trọng.

Cảm ơn bạn trước.

EDIT: Tôi cần làm điều này trên GPU trong bộ nhớ dùng chung. Các ma trận cũng không nhất thiết phải có cùng kích thước. Tôi không biết bất kỳ thư viện nào làm việc này vào lúc này. Đề xuất các thuật toán phù hợp với vấn đề sẽ được đánh giá cao.


1
Nếu tôi hiểu đúng, bạn có một hạt nhân CUDA tính toán hàng ngàn ma trận nhỏ trong bộ nhớ dùng chung và bạn không sẵn sàng sao chép chúng vào bộ nhớ chung. Trước khi cố gắng đưa ra một câu trả lời, có một số điểm cần làm rõ. Trong CUDA, bộ nhớ chia sẻ trọn đời bị ràng buộc để chặn thời gian tồn tại: bạn có bao nhiêu luồng cho mỗi ma trận để phân tách? Là hiệu suất cực đoan thực sự quan trọng? (Thời gian trích xuất eigenvalue dự kiến ​​so với thời gian tạo ma trận như thế nào?) Dựa trên lập luận nào bạn biết rằng hệ thống eigensystem là có thật? Hệ thống eigens có thể bị lỗi?
Stefano M

Xin chào Stefano và cảm ơn bạn đã bình luận của bạn. Hiện tại, tôi sẽ có bội số gần nhất của kích thước sợi dọc với kích thước của ma trận mà tôi muốn phân tách. Thời gian tạo ma trận thay đổi rất nhiều và có những trường hợp thời gian tạo ma trận đắt hơn, nhưng có nhiều tình huống thời gian tạo ma trận ít hơn thời gian phân tách. Tôi biết các giá trị riêng là có thật do cách tạo ra ma trận. Tôi không muốn đi sâu vào chi tiết ở đây, vì nó sẽ làm mất đi câu hỏi ban đầu. Cuối cùng, có, hệ thống có thể bị lỗi.
Kantoku

Câu trả lời:


3

Không cần thực hiện nhiều tìm kiếm, tôi khuyên bạn nên xem thư viện MAGMA . Mã tự do có sẵn với sự hỗ trợ liên tục. NVIDIA công nhận MAGMA là "Đột phá trong giải quyết vấn đề Eigenvalue".

Ngoài ra còn có thư viện CULA , thường là sản phẩm thương mại, mặc dù gần đây nó đã được cung cấp miễn phí cho mục đích học tập (xem chi tiết tại đây ).


Cảm ơn bạn đã trả lời Alexander. Tôi đã xem xét cả hai thư viện trước đây và theo như tôi biết, các chức năng được gọi từ máy chủ lưu trữ và bộ nhớ cần phải có trong bộ nhớ chung. Tôi tin rằng chi phí sẽ là quá nhiều để biện minh cho việc sử dụng. Tất cả các ma trận này được tạo ra trong bộ nhớ dùng chung, được sử dụng trong kernel và sau đó bị loại bỏ. Tôi muốn giữ chúng ở đó mà không cần phải đưa chúng trở lại bộ nhớ toàn cầu. Ngay cả khi tôi đã đẩy chúng ở đó, vẫn sẽ có vấn đề gọi nhiều hàm kernel từ máy chủ (mặc dù trong nhiều luồng).
Kantoku

1
@Kantoku, vâng, những thư viện đó chung chung hơn và họ lưu trữ toàn bộ ma trận trong bộ nhớ toàn cầu. Nếu ma trận của bạn nằm trong bộ nhớ dùng chung, chỉ có một SM có thể hoạt động trên chúng, phải không? Do đó, việc thực hiện EVD sẽ khá đơn giản.
Alexander

Vâng, tôi sẽ tưởng tượng như vậy, đó là lý do tại sao tôi đang tìm kiếm các thuật toán phù hợp với tình huống này. Tôi không quá quen thuộc với evd không đối xứng, vì vậy tôi đã tìm kiếm gợi ý.
Kantoku

@Kantoku (và Alexander). EVD không đối xứng khác xa với đơn giản, ngay cả trong trường hợp tuần tự. Nó vẫn là một lĩnh vực hoạt động nghiên cứu.
Jack Poulson

@JackPoulson À đúng, bạn đúng, nhưng tôi (và tôi cũng cho rằng Alexander) có nghĩa là sẽ đơn giản để áp dụng một thuật toán đã được thiết lập cho vấn đề, xem xét có nhiều cách đơn giản hóa có thể được thực hiện khi chúng ta có kích thước và tính chất của ma trận vào xem xét. Vấn đề là: thuật toán nào.
Kantoku

2

Sử dụng các chức năng trong LAPACK, không chắc là bạn có thể đánh bại chúng trong quá trình thực hiện của riêng bạn.


Xin chào Wolfgang. Cảm ơn câu trả lời, nhưng tôi dự định thực hiện điều này trên GPU bằng CUDA và cho hàng ngàn ma trận nhỏ này (trong đó mỗi khối xử lý sự phân tách của một ma trận) và các ma trận không nhất thiết phải có cùng kích thước, vì vậy việc triển khai một cái gì đó bản thân sử dụng bộ nhớ chia sẻ dường như là lựa chọn duy nhất của tôi. Bất kỳ ý tưởng nào thuật toán sẽ phù hợp nhất cho các loại ma trận? PS Cảm ơn về thỏa thuận.II bài giảng bạn đã đưa ra tại KAUST học kỳ trước. Tôi rất thích chúng :)
Kantoku

2
@Kantoku Bạn nên thêm các chi tiết này trong câu hỏi của bạn, nếu không nó là sai lệch.
Alexander

@Alexander Tôi đã cập nhật câu hỏi với nhiều chi tiết hơn. Cám ơn vì sự gợi ý!
Kantoku

1
@Kantoku: GPU vượt xa lĩnh vực của tôi một chút nhưng tôi chắc chắn rằng có những thư viện ngoài kia đã làm những gì bạn muốn (và thực tế tôi thấy rằng các câu trả lời khác đã liên kết với chúng). Rất vui khi biết bạn thích lớp học của tôi!
Wolfgang Bangerth
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.