15

Tôi đang xem xét việc nghịch đảo của một ma trận lớn, kích thước phổ biến 1000 x 1000, nhưng đôi khi vượt quá 100000 x 100000 (hiện không thành công do thời gian và bộ nhớ). Tôi biết rằng tình cảm bình thường là 'đừng lấy nghịch đảo, tìm cách khác để làm điều đó', nhưng điều đó là không thể vào lúc này. Lý do cho điều này là do việc sử dụng phần mềm đã được thực hiện mà hy vọng sẽ có được nghịch đảo ma trận. (Lưu ý: Tôi đang tìm cách thay đổi điều này, nhưng điều đó sẽ mất nhiều thời gian)Đảo ngược ma trận lớn

Hiện tại chúng tôi đang sử dụng phương pháp phân tích LU từ các lần recopies số và tôi hiện đang trong quá trình thử nghiệm thư viện riêng . Thư viện eigen có vẻ ổn định hơn và nhanh hơn một chút, nhưng tôi vẫn đang trong giai đoạn thử nghiệm về độ chính xác. Tôi đã xem qua nhanh các thư viện khác như ATLAS và LAPACK nhưng chưa thực hiện bất kỳ thử nghiệm đáng kể nào với các thư viện này. Có vẻ như thư viện eigen không sử dụng các phương thức đồng thời để tính toán nghịch đảo (mặc dù không cho phần hệ số LU của nghịch đảo) và theo như tôi có thể nói ATLAS và LAPACK giống nhau trong giới hạn này. (Tôi hiện đang thử nghiệm sự khác biệt về tốc độ cho eigen với openMP và không có.)

Câu hỏi đầu tiên là bất cứ ai có thể giải thích làm thế nào để tối ưu hóa ma trận đảo ngược bằng cách song song. Tôi tìm thấy một bài báo here mà nói về ma trận đảo ngược các thuật toán song song, nhưng tôi không hiểu. Có vẻ như this bài viết về một phương pháp khác? Tôi cũng không chắc chắn nếu scaLAPACK hoặc PETSc là hữu ích?

Câu hỏi thứ hai, tôi đọc this bài viết sử dụng GPU để tăng hiệu suất, nhưng tôi chưa bao giờ được mã hóa cho GPU và do đó không có ý tưởng gì đang cố gắng truyền đạt, nhưng các biểu đồ ở phía dưới trông khá đáng báo động. Làm thế nào điều này thậm chí có thể, và làm thế nào để tôi bắt đầu đi về việc thực hiện một cái gì đó như thế này nếu nó là đúng.

Tôi cũng tìm thấy this bài viết, chưa có thời gian để đọc qua nó để hiểu, nhưng nó có vẻ đầy hứa hẹn, vì bộ nhớ là một vấn đề hiện tại với phần mềm của chúng tôi.

Mọi thông tin về các bài viết này hoặc các vấn đề nói chung sẽ giúp ích rất nhiều. Và một lần nữa tôi xin lỗi nếu câu hỏi này có vẻ mơ hồ, tôi sẽ cố gắng mở rộng hơn nếu cần thiết.

+0

là ma trận thưa thớt hay dày đặc? có rất nhiều cách tốt và nhanh để hoạt động trên các ma trận thưa thớt, vì vậy hy vọng rằng bạn là một trong số đó. – vlsd

+1

Bạn có thể muốn xem [FLAME] (http://z.cs.utexas.edu/wiki/flame.wiki/FrontPage). Nó được cho là tạo ra mã đại số tuyến tính chính xác và hiệu quả được chứng minh toán học hoạt động trên nhiều nền tảng song song khác nhau, bao gồm cả GPU. –

+0

Tôi sẽ xem FLAME, chưa nghe về nó cho đến bây giờ. Cảm ơn. – Onekuo

Trả lời

8

Câu hỏi đầu tiên là bất kỳ ai cũng có thể giải thích cách tối ưu hóa ma trận đảo ngược bằng cách song song.

Tôi rất nguy hiểm khi đoán điều này và các chủ đề liên quan trong đại số tuyến tính, là một trong những chủ đề được nghiên cứu nhiều nhất về tính toán song song. Nếu bạn đang tìm kiếm một nơi nào đó để bắt đầu đọc, tốt cũ Golub and Van Loan có một chương về chủ đề này. Việc liệu Scalapack và Petsc có hữu ích hay không, chắc chắn là trước đây, có lẽ là sau này. Tất nhiên, cả hai đều phụ thuộc vào MPI nhưng đó là loại được đưa cho cấp trong lĩnh vực này.

Câu hỏi thứ hai ...

GPU sử dụng nếu bạn đã có họ và bạn có thể đủ khả năng để dịch mã của bạn vào các mô hình lập trình được hỗ trợ bởi GPU của bạn. Nếu bạn chưa bao giờ được mã hóa cho GPU và có quyền truy cập vào một cụm CPU loại hàng hóa, bạn sẽ tăng tốc nhanh hơn bằng cách sử dụng cụm sao bằng cách đấu vật bằng công nghệ mới.

Đối với bài viết cuối cùng bạn tham khảo, giờ đây đã 10 năm trong một trường thay đổi rất nhanh (hãy thử tìm một bài nghiên cứu 10 năm về sử dụng GPU để đảo ngược ma trận). Tôi không thể bình luận về sự xuất sắc của nó hoặc các thuộc tính khác, nhưng kích thước vấn đề bạn đề cập đến dường như tôi là tốt trong khả năng của các cụm hiện đại cho lõi (để sử dụng một thuật ngữ cũ) tính toán. Nếu ma trận của bạn là rất lớn, họ cũng thưa thớt?

Cuối cùng, tôi ủng hộ mạnh mẽ ý định rõ ràng của bạn khi sử dụng các mã hiện có sẵn thay vì cố gắng phát triển mã của riêng bạn.

+0

Cảm ơn bạn, tôi sẽ xem xét Golub và Văn Loan. Lý do chính tôi nhìn vào GPU là vì phần mềm này được sử dụng liên quan đến phần mềm mô hình hóa. Kể từ khi phần cứng cơ bản là có, tôi đã cố gắng và sử dụng nó. – Onekuo

+0

Ngoài ra, ma trận không thưa thớt, thật đáng buồn. – Onekuo

+1

Vâng, 80GB không nhiều RAM trong những ngày này. –

5

100000 x 100000 là 80GB ở độ chính xác kép. Bạn cần một thư viện hỗ trợ ma trận ánh xạ bộ nhớ trên đĩa. Tôi không thể đề xuất một thư viện cụ thể và tôi không tìm thấy bất kỳ điều gì với các tìm kiếm nhanh trên Google. Nhưng mã từ Numerical Recipes chắc chắn sẽ không đủ.

+0

Có, chúng tôi đang sử dụng độ chính xác gấp đôi. Bạn có biết nơi nào để bắt đầu tìm kiếm giải pháp cho điều này không? – Onekuo

3

Về câu hỏi thứ nhất (làm thế nào để parallellize tính nghịch đảo):

Tôi giả sử bạn đang tính toán nghịch đảo bằng cách thực hiện một phân hủy LU của ma trận của bạn và sau đó sử dụng phân hủy để giải quyết A * B = I trong đó A là ma trận ban đầu của bạn, B là ma trận bạn giải quyết, và tôi là ma trận nhận dạng. Sau đó B là nghịch đảo.

Bước cuối cùng dễ dàng để so sánh. Chia ma trận nhận dạng của bạn dọc theo các cột. Nếu bạn có p CPU và ma trận của bạn là n-by-n, thì mỗi phần có n/p cột và n hàng. Cho phép gọi các phần I1, I2, vv Trên mỗi CPU, giải quyết một hệ thống dạng A * B1 = I1, điều này cho bạn các phần B1, B2, v.v. và bạn có thể kết hợp chúng thành B là nghịch đảo .

+0

Tôi nghĩ rằng tôi hiểu những gì bạn đang cố gắng làm ở đó, tôi sẽ thử nó. Cảm ơn. – Onekuo

2

Bộ giải mã LU trên GPU có thể nhanh hơn gấp 10 lần so với CPU. Mặc dù điều này đang thay đổi, nhưng theo truyền thống, GPU được thiết kế xoay quanh số học chính xác đơn, và vì vậy số học chính xác đơn phần cứng cũ thường nhanh hơn nhiều so với số học chính xác gấp đôi. Ngoài ra, yêu cầu lưu trữ và hiệu suất sẽ bị ảnh hưởng rất nhiều bởi cấu trúc của ma trận của bạn. Một bản phân tích LU thô 100.000 x 100.000 ma trận LU là một vấn đề hợp lý để giải quyết và sẽ không đòi hỏi nhiều bộ nhớ.

Trừ khi bạn muốn trở thành chuyên gia và dành nhiều điều chỉnh thời gian để cập nhật phần cứng, tôi thực sự khuyên bạn nên sử dụng thư viện thương mại. Tôi sẽ đề xuất CULA tools. Họ có cả hai thư viện GPU thưa thớt và dày đặc và trên thực tế, free library của họ cung cấp SGETRF - một độ chính xác đơn giản (dày đặc). Bạn sẽ phải trả tiền cho các thư viện chính xác gấp đôi của họ.

1

Tôi biết đó là bài đăng cũ - nhưng thực sự - OpenCL (bạn tải xuống liên quan dựa trên cạc đồ họa của bạn) + OpenMP + Vectorization (không theo thứ tự đó) là cách để thực hiện. Dù sao đi nữa, đối với tôi, kinh nghiệm của tôi với ma trận là thực sự làm việc với các chi phí từ việc sao chép các mảng kép vào và ra khỏi hệ thống và cũng để đệm lên hoặc khởi tạo ma trận với 0 trước khi bắt đầu tính toán - đặc biệt khi tôi làm việc với việc tạo .xll để sử dụng Excel.

Nếu tôi được reprioritize đầu -

  1. cố gắng để vectorize mã (Visual Studio 2012 và Intel C++ có autovectorization - Tôi không chắc chắn về MinGW hoặc GCC, nhưng tôi nghĩ rằng có cờ cho trình biên dịch để phân tích các vòng lặp của bạn để tạo ra các mã assembly phù hợp để sử dụng thay cho các thanh ghi bình thường để giữ dữ liệu của bạn, để điền vào các thanh ghi vector của bộ xử lý. Tôi nghĩ Excel đang làm điều đó bởi vì khi tôi theo dõi các chủ đề của Excel trong khi chạy MINVERSE() Tôi chỉ biết 1 thread được sử dụng Tôi không biết nhiều ngôn ngữ lắp ráp - vì vậy tôi không biết cách vector hóa thủ công ... (chưa có thời gian để tìm hiểu điều này nhưng sooooo muốn làm điều đó!)
  2. Song song với OpenMP (omp pragma) hoặc MPI hoặc thư viện pthreads (parallel_for) - rất đơn giản - nhưng ...Đây là bắt - tôi nhận ra rằng nếu lớp ma trận của bạn là hoàn toàn đơn luồng ở nơi đầu tiên - sau đó parallelizing hoạt động như mat nhân hoặc nghịch đảo là scrappable - cuz parallelizing sẽ làm giảm tốc độ do khởi tạo hoặc sao chép hoặc chỉ truy cập vào không lớp ma trận song song. Nhưng ... nơi song song giúp là - nếu bạn đang thiết kế lớp ma trận của riêng bạn và bạn song song hoạt động của hàm tạo (đệm với 0 vv), thì tính toán LU (A^-1) = Tôi cũng sẽ nhanh hơn. Nó cũng đơn giản về mặt toán học để tối ưu hóa quá trình phân hủy LU của bạn và cũng tối ưu hóa việc chuyển tiếp ngược về phía trước của ur cho trường hợp đặc biệt của nhận dạng. (Tức là không lãng phí thời gian tạo ma trận nhận dạng - phân tích vị trí của bạn (hàng = col) và đánh giá là hàm với 1 và phần còn lại bằng 0)
  3. Khi nó được song song (trên các lớp ngoài) - các hoạt động ma trận đòi hỏi yếu tố theo yếu tố có thể được ánh xạ để được tính toán bởi GPU (SSSSSS) - hàng trăm bộ vi xử lý để tính toán các phần tử - đánh bại điều đó !. Hiện tại có mẫu mã Monte Carlo có sẵn trên trang web của ATI - sử dụng OpenCL của ATI - đừng lo lắng về việc chuyển mã sang thứ gì đó sử dụng GeForce - tất cả những gì bạn cần làm là biên dịch lại ở đó.

Đối với 2 và 3 mặc dù - hãy nhớ rằng các chi phí phát sinh như vậy không có điểm trừ khi bạn đang xử lý F * K * G ma trận HUGE - nhưng tôi thấy 100k^2? wow ...

Gene

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