Quy tắc ngón tay cái để lưu trữ ma trận thưa thớt và dày đặc


9

Giả sử tôi biết độ thưa thớt dự kiến ​​của một ma trận (tức là số lượng không số không / tổng số không có số không). Có một quy tắc ngón tay cái (có lẽ gần đúng) để quyết định có nên sử dụng lưu trữ ma trận thưa thớt (cụ thể là lưu trữ hàng nén) so với lưu trữ dưới dạng ma trận dày đặc không?

  1. Tốc độ là quan trọng trong ứng dụng của tôi hơn bộ nhớ. Nhưng vì tò mò chung, tôi quan tâm đến câu trả lời từ cả góc độ tốc độ và trí nhớ.
  2. Sau khi tạo ma trận, tôi chỉ áp dụng các phép toán cộng và nhân trên nó.
  3. Tôi chỉ có thể tìm thấy câu trả lời định tính, ví dụ câu hỏi nàycâu hỏi này nhưng tôi đang tìm kiếm một cái gì đó như

... Nếu độ thưa là hơn , thì hãy sử dụng bộ nhớ dày đặc.x%

Câu trả lời:


8

Tất cả các hoạt động ma trận được giới hạn bộ nhớ (và không tính toán ràng buộc) trên các bộ xử lý ngày nay. Vì vậy, về cơ bản, bạn phải hỏi định dạng nào lưu trữ ít byte hơn. Điều này rất dễ tính toán:

  • Đối với một ma trận đầy đủ, bạn lưu trữ 8 byte (một đôi) cho mỗi mục nhập
  • Đối với một ma trận thưa thớt, bạn lưu trữ 12 byte cho mỗi mục nhập (một nhân đôi cho giá trị và một số nguyên cho chỉ mục cột của mục nhập).

Nói cách khác, nếu độ thưa của bạn dưới 67% - nghĩa là, đối với gần như bất kỳ ma trận nào, bất kỳ người hợp lý nào cũng sẽ gọi là thưa thớt -, định dạng ma trận thưa thớt sẽ không chỉ mang lại hiệu quả sử dụng bộ nhớ tốt hơn mà còn tính toán thời gian tốt hơn.


Tôi muốn nghe lý do tại sao một người nào đó đã đánh giá thấp câu trả lời này. Đó là định tính, định lượng và đưa ra một quy tắc tốt. Nếu tôi có thể nâng cấp nó hai lần, tôi sẽ làm thế.
Charles

3
Bạn sẽ cần dung lượng lưu trữ lớn hơn một chút - bạn cũng cần theo dõi các hàng. Một bit mỗi hàng là đủ.
Brian Borchers

3
Phép nhân ma trận của ma trận dày đặc là một nơi bạn có thể sử dụng lại bộ đệm đầy đủ để bạn có thể tiến gần đến FLOPS cao nhất. Tôi đồng ý rằng phép nhân vectơ ma trận sẽ bị giới hạn băng thông bộ nhớ.
Brian Borchers

1
67% thực sự là rất xa từ điểm tính toán sẽ thu được lợi nhuận từ sự thưa thớt. Phép nhân vectơ ma trận dày đặc có thể thu lợi lớn hơn đáng kể từ bộ nhớ đệm. (Bạn cần truy cập bộ nhớ rất bất thường để nhân vectơ ma trận thưa thớt.) Nếu nói về việc giải hệ phương trình tuyến tính với bộ giải trực tiếp, đôi khi người ta nói rằng một ma trận thưa thớt nếu nó có ít hơn 0,1% giá trị khác không. Nhưng trong thực tế, khả năng kết nối thực tế của các mục ma trận quan trọng hơn nhiều so với số lượng khác không.
Henrik Schumacher

1
@WolfgangBangerth: Định nghĩa của bạn về thưa thớt ("thưa thớt" có nghĩa là số lượng mục nhập khác nhau trên mỗi hàng không phụ thuộc vào kích thước của một tập hợp ma trận phát triển ngày càng lớn hơn.), Khác một chút so với định nghĩa (làm việc không chính thức) của JH Wilkinson : "bất kỳ ma trận nào có đủ số 0 mà nó trả để tận dụng lợi thế của chúng", thường được trích dẫn trong tài liệu. Tôi thích định nghĩa của Wilkinson.
wim

11

Với giá trị của nó, đối với các ma trận thưa thớt ngẫu nhiên có kích thước 10.000 đến 10.000 so với các ma trận dày đặc có cùng kích thước, trên máy trạm Xeon của tôi sử dụng MATLAB và Intel MKL làm BLAS, phép nhân vectơ ma trận thưa thớt nhanh hơn với mật độ 15% hoặc ít hơn. Ở mức 67% (như được đề xuất bởi một câu trả lời khác ), phép nhân vectơ ma trận dày đặc nhanh hơn khoảng ba lần.


Thú vị, cảm ơn. Một số ma trận của tôi có độ thưa thớt lên tới 30-40% (bất tiện ngay giữa ước tính 15% và 67%), vì vậy tôi có thể nên tiến hành các thử nghiệm tương tự như của bạn (đối với các thao tác tôi quan tâm) để xem liệu bộ nhớ lợi thế là giá trị chậm lại.
EM_IE

3
Rất nhiều thứ sẽ phụ thuộc vào phần cứng và phần mềm bạn đang sử dụng. Máy của tôi có bộ nhớ kênh bốn nên có băng thông bộ nhớ nhiều hơn hệ thống kênh đôi thông thường. MKL là một cấu trúc dữ liệu ma trận thưa thớt của BLAS và MATLAB rất tốt có thể không được tối ưu hóa hoàn hảo cho việc này.
Brian Borchers

1
Một vấn đề với lưu trữ hàng nén (hoặc lưu trữ cột nén) là các mục thường được lưu trữ trong một khu vực khác trong bộ nhớ từ thông tin chỉ mục. Điều này thiếu địa phương có thể làm tổn thương hiệu suất. Để so sánh, trong lưu trữ ma trận dày đặc thông thường (theo hàng (C) hoặc cột (Fortran)), bạn có thể tải các mục của ma trận liên tiếp từ bộ nhớ theo cách hiệu quả hơn.
Brian Borchers

1
Trong những năm gần đây, đã có nghiên cứu về các định dạng lưu trữ mới cho ma trận thưa thớt, cho phép tăng hiệu suất cho phép nhân vectơ ma trận thưa thớt trên bộ xử lý mutlcore, máy có hướng dẫn SIMD và GPU. Xem ví dụ: pdfs.semanticscholar.org/041b/ Từ
Brian Borchers

5

Ngay cả khi một ma trận rất thưa thớt, sản phẩm ma trận của nó có thể dày đặc. Lấy ví dụ một ma trận đường chéo và điền vào hàng và cột đầu tiên của nó bằng các mục khác không; sản phẩm của nó với chính nó sẽ hoàn toàn dày đặc. Một ma trận như vậy có thể phát sinh, đối với xét nghiệm, như đồ thị Laplacian của đồ thị trong đó có một đỉnh được kết nối với tất cả các đỉnh khác. Trong thực tế, nó đủ nếu có một vài đỉnh có khả năng kết nối khá cao với phần còn lại của mạng. Đối với phép nhân vectơ ma trận, hiện tượng này ít liên quan hơn mặc dù nó có thể dẫn đến mất cân bằng khi cố gắng song song hóa phép nhân vectơ ma trận.

Những gì tôi muốn làm nổi bật: Nó thực sự phụ thuộc vào mô hình thưa thớt và vào những gì bạn muốn làm với ma trận. Vì vậy, định nghĩa tốt nhất về một ma trận thưa thớt mà tôi có thể đưa ra (điều này khá vô dụng cùng một lúc) như sau:

Một ma trận rất thưa thớt nếu thuận lợi chỉ lưu trữ các giá trị khác không và vị trí của chúng và đầu tư thêm chi phí phát sinh từ việc quản lý cấu trúc dữ liệu phát sinh.

Bài học để học: Nó thực sự phụ thuộc vào những gì bạn muốn làm với nó , thuật toán bạn sử dụng và (như những người khác đã chỉ ra) phần cứng và phần mềm nào bạn sử dụng cho dù ma trận đã cho có thưa thớt hay không (đọc là: cho dù bạn nên sử dụng cấu trúc dữ liệu ma trận thưa thớt hay dày đặc). Không thể có một quy tắc hoàn toàn dựa trên tỷ lệ phần trăm nếu nó không chỉ là về việc lưu trữ dữ liệu hoặc phép nhân vectơ ma trận. Cách tốt nhất để tìm hiểu xem ma trận của bạn có thưa thớt hay không chỉ là thử và so sánh với các phương pháp ma trận dày đặc.


1
JH Wilkinson nổi tiếng đã định nghĩa một ma trận thưa thớt là: "bất kỳ ma trận nào có đủ số 0 mà nó phải trả để tận dụng lợi thế của chúng". Chính xác định nghĩa này đã được trích dẫn bởi những người khác thường xuyên. Tuy nhiên, định nghĩa của bạn cũng khá phù hợp.
wim

1
Đẹp. Đó chính xác là định nghĩa tôi đã cố gắng bắt chước, nhưng tôi không thể nhớ lại nguồn.
Henrik Schumacher
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.