Khai thác các mẫu trong ma trận để nhân vectơ ma trận hiệu quả


8

Tôi có một tình huống sau: Tôi có một chuỗi các vectơ và với mỗi tôi muốn tính toán sản phẩm trong đó được cố định ngay từ đầu. Mặc dù không có thông tin về cấu trúc của , thường có một mẫu cụ thể trong đó nhiều giá trị được lặp lại và tôi muốn tính toán các sản phẩm này càng nhanh càng tốt.A x i A x i Ax1,x2,..MộtxTôiMộtxTôiMột

Một ví dụ về trông như thế này:Một

nhập mô tả hình ảnh ở đây

Ở đây các vùng màu trắng là 0.

Tôi tự hỏi nếu có một số cách lưu trữ thông tin về hoặc sửa đổi nó bằng cách nào đó sẽ cho phép tôi giảm số lượng hoạt động cho mỗi sản phẩm. Đối với các hàng là 0, điều này là không quan trọng - người ta chỉ có thể lưu trữ các chỉ báo hàng biểu thị các hàng đó. Cũng có thể lưu trữ thông tin về các hàng được sao chép để sử dụng lại các tính toán hàng. Tôi cũng đã xem xét việc sắp xếp các hàng của ma trận như để giảm thiểu sự khác biệt trung bình giữa mỗi hàng và chỉ tính toán sự khác biệt ở mỗi hàng. Điều này dường như gặp vấn đề cho các mẫu phức tạp hơn, tuy nhiên.Một

Tôi đã tự hỏi nếu có bất kỳ phương pháp được biết đến cho các loại vấn đề.

Chỉnh sửa: một ý tưởng khác tôi đã có là từ khi không. các giá trị duy nhất trong ma trận khá thấp, người ta có thể phân tách sản phẩm dưới dạng trong đó chỉ chứa một giá trị duy nhất, nhưng tôi vẫn không chắc liệu điều này có thể cung cấp bất kỳ lợi thế nào cho vấn đề này không.Một iMộtx= =Một1x+Một2x+Giáo dụcMộtnxMộtTôi


2
Tôi có thể thấy một số khối cột, trong nhiều hàng, giống hệt nhau (ví dụ: một khối cột có màu vàng trong nhiều hàng). Đối với một vectơ , nếu bạn tính tổng các phần tử của x i trong khối đó, thì bạn có thể sử dụng nó để tăng tốc mọi thứ cho các hàng đó. xTôixTôi
DW

Nếu có giá trị riêng biệt trong một hàng của ma trận và d nhỏ hơn nhiều so với tổng số phần tử trong một hàng (có vẻ như thường xảy ra ở đây), bạn chỉ cần sử dụng phép nhân d để tính sản phẩm chấm của hàng đó với vectơ x , vì phép nhân phân phối trên phép cộng: ví dụ: a x i 1 + b x i 2 + b x i 3 + a x i 4 + a x i 5 = a ( x i 1dddx . mộtxTôi1+bxTôi2+bxTôi3+mộtxTôi4+mộtxTôi5= =một(xTôi1+xTôi4+xTôi5)+b(xTôi2+xTôi3)
j_random_hacker

1
1) Bằng cách chia ma trận thành các khối, nếu một khối có tất cả các hàng giống nhau, bạn có thể nhân khối đó với một vectơ cụ thể một lần và sử dụng lại sản phẩm chấm một phần cho mỗi hàng trong khối. 2) Nếu một khối có tất cả các cột giống nhau, tối ưu hóa theo DW hoạt động. 3) Nếu bạn có thể xử lý hàng loạt các vectơ, bạn có thể thực hiện phép nhân ma trận trên GPU. 4) Nếu bạn phân hủy thành sau đó bạn có thể viết mỗi như một hằng số lần một ma trận nhị phân, và nhân bởi một ma trận nhị phân chỉ đòi hỏi bổ sung, do đó bạn chỉ cần một nhân mỗi giá trị riêng biệt. Một1,Một2,Giáo dục

1
Để có được một ý tưởng, bây giờ bạn đang sử dụng Blas?
Mauro Vanzetto

1
Và bây giờ làm thế nào để bạn làm cho sản phẩm? Tôi cố gắng làm một xem xét thực tế. Việc sử dụng, trực tiếp hoặc gián tiếp thông qua thư viện khác, cho phép Blas sử dụng ở chế độ gần tối ưu phần cứng của bạn (điều rất khó có được bởi một sản phẩm vectơ ma trận tùy chỉnh). Vì vậy, có thể với việc sử dụng Blas, bạn có thể lưu trữ một tốc độ lớn với một nỗ lực hạn chế.
Mauro Vanzetto

Câu trả lời:


3

Tôi đề nghị một quan điểm khác nhau. Có thể bạn có thể có được sự cải thiện hiệu suất với một số phép nhân ma trận thông minh, nhưng có nhiều khả năng bạn có được kết quả nhỏ tôn trọng nỗ lực.

138×78

Rất khó, rõ ràng là gần như không thể đối với chúng tôi, hãy cố gắng đạt được hiệu suất tốt nhất tôn trọng chức năng Blas. Các ví dụ cổ điển là các vòng lặp lồng nhau. Ví dụ, Atlas triển khai Blas cụ thể khi được cài đặt để tự động điều chỉnh phần cứng (xem bản pdf này ).

Vì những lý do này, gợi ý nắm tay tôi nói với bạn là hãy thử sử dụng thư viện Blas. Xem trang wiki trước để biết danh sách, có thương mại hoặc miễn phí, ở đây phụ thuộc vào bạn (có thể bạn có thể bắt đầu với OpenBlas). Lưu ý rằng cũng có thư viện sử dụng Blas theo họ và họ cảm thấy thoải mái hơn.

Nếu điều này là không đủ, hãy thử với cách khác, nhưng hãy nhớ sử dụng Blas cho phép nhân.

Trường hợp này là khác nhau nếu số lượng phần tử bằng không ngày càng nhiều, không có trường hợp này, để đưa ra ý tưởng khoảng 90%. Ở đây bạn có ma trận thưa thớt và bạn có thể sử dụng một phương thức lưu trữ khác để có được lợi thế. Lưu ý rằng trong trường hợp này bạn cũng có thể tìm thấy Blas thưa thớt .


Tôi hoàn toàn đồng ý với câu trả lời này, đặc biệt là về những gì nên thử trước. Bắt đầu từ một sản phẩm vector ma trận dày đặc sử dụng thư viện đại số tuyến tính được tối ưu hóa cao là một điều tốt và sau này bạn sẽ có thể đánh giá bất kỳ kỹ thuật thông minh nào bạn nghĩ ra để chống lại điều đó. Nếu cần và mong muốn.
Anton Menshov

0

Tuyên bố miễn trừ trách nhiệm: Tôi không biết liệu điều này có thực sự tăng tốc tính toán của bạn hay không, vì nó bổ sung khá nhiều chi phí tính toán. Vì có vẻ như ma trận của bạn không quá thưa thớt, thật khó tưởng tượng việc đánh bại một triển khai BLAS như Intel MKL .


Điều đó nói rằng, đây là một ý tưởng:

MộtTôiMộtJMộtx

Nếu bạn có một số giá trị trong ma trận không trùng lặp, bạn có thể ném tất cả chúng vào một ma trận thưa thớt thông thường và thực hiện MVP theo cách ma trận thưa thớt "bình thường".

xTôi

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.