Tôi đang sử dụng Armadillo để thực hiện các phép nhân ma trận rất chuyên sâu với độ dài cạnh , trong đó n có thể lên tới 20 hoặc thậm chí hơn. Tôi đang sử dụng Armadillo với OpenBLAS để nhân ma trận, dường như đang làm rất tốt trong các lõi song song, ngoại trừ việc tôi gặp vấn đề với phép nhân trong Armadillo để tối ưu hóa hiệu suất.
Nói rằng tôi có một vòng lặp ở dạng sau:
arma::cx_mat stateMatrix, evolutionMatrix; //armadillo complex matrix type
for(double t = t0; t < t1; t += 1/sampleRate)
{
...
stateMatrix = evolutionMatrix*stateMatrix;
...
}
Trong C ++ cơ bản, tôi thấy vấn đề ở đây là C ++ sẽ phân bổ một đối tượng mới của cx_mat
cửa hàng evolutionMatrix*stateMatrix
, và sau đó sao chép các đối tượng mới để stateMatrix
có operator=()
. Điều này rất, rất không hiệu quả. Mọi người đều biết rằng việc trả về các lớp dữ liệu lớn phức tạp là một ý tưởng tồi, phải không?
Cách tôi thấy cách này hiệu quả hơn là với một hàm thực hiện phép nhân dưới dạng:
void multiply(const cx_mat& mat1, const cx_mat& mat2, cx_mat& output)
{
... //multiplication of mat1 and mat2 and then store it in output
}
Theo cách này, Người ta không phải sao chép các đối tượng lớn có giá trị trả về và đầu ra không phải được phân bổ lại với mỗi phép nhân.
Câu hỏi : Làm thế nào tôi có thể tìm thấy một sự thỏa hiệp, trong đó tôi có thể sử dụng Armadillo để nhân với giao diện BLAS đẹp mắt của mình và thực hiện điều này một cách hiệu quả mà không phải tạo lại các đối tượng ma trận và sao chép chúng với mỗi thao tác?
Đây không phải là một vấn đề triển khai trong Armadillo sao?
stateMatrix = evolutionMatrix*stateMatrix
sẽ không sao chép bất cứ điều gì. Thay vào đó, Armadillo thay đổi bộ nhớ ưa thích. Bộ nhớ mới cho kết quả vẫn sẽ được phân bổ (không có cách nào khác), nhưng thay vì sao chép, stateMatrix
ma trận sẽ chỉ sử dụng bộ nhớ mới và loại bỏ bộ nhớ cũ.