2012-05-03 37 views
5

Tôi khá ấn tượng bởi thư viện C++ Eigen sử dụng các mẫu biểu thức để đạt được tốc độ cực lớn trong tính toán ma trận/vector.Scala LMS để viết đại số tuyến tính Lib

Tôi muốn sao chép thư viện này trong scala. Theo như tôi biết hệ thống kiểu scalas không đủ mạnh để làm một cái gì đó như thế này, nhưng nó sẽ có thể nhẹ LMS dàn dựng mô-đun. Dường như có một vài dự án ở đó (Delight, virtualization-lms, v.v.). Điều gì sẽ là quyền sử dụng cho loại dự án này về độ tin cậy và hiệu suất?

Cảm ơn

Chỉnh sửa: Tôi chỉ gặp các macro trong scala 2.10. Có lẽ đây là những gì tôi muốn sử dụng ở đây.

@ om-nôm-nom

Phần quan trọng được giải thích trong http://eigen.tuxfamily.org/dox/TopicInsideEigenExample.html

Ví dụ giải thích rằng một bổ sung vector

u = v + w 

không có hiệu suất tốt trong (bản địa) C++ từ một biến tạm thời được tạo cho phần bổ sung và biến này được gán cho u là

for(int i = 0; i < size; i++) tmp[i] = v[i] + w[i]; 
for(int i = 0; i < size; i++) u[i] = tmp[i]; 

Eigen sử dụng mẫu Lập trình meta (bước giải thích từng bước trong liên kết ở trên) để giảm này tại thời gian biên dịch để

for(int i = 0; i < size; i++) u[i] = v[i] + w[i]; 

mà rõ ràng là nhanh hơn và không cần một biến thêm.

+0

Nó có thể giúp, nếu bạn mô tả ngắn gọn cơ chế của các mẫu biểu thức. –

Trả lời

1

Để trả lời một cách chính xác câu hỏi này, bạn cần phải tự hỏi mình câu hỏi thêm:

  1. Bạn có thực sự chắc chắn rằng mã C++ với các mẫu thực hiện tốt hơn so với mã Scala? Điểm chuẩn hiện đại cho thấy Java nhanh hơn C++ trên đảo ngược ma trận. Điều này chủ yếu là do một sự cải tiến trong máy ảo, cũng như trong HW.

  2. Lợi ích kinh doanh lớn như thế nào bạn có được bằng cách có công cụ ma trận nhanh hơn so với chi phí tăng lên đối với bộ nhớ không được quản lý, con trỏ nguy hiểm và tăng lỗi và lỗi do mã hóa trong C++? Nếu các vấn đề có thể được giải quyết với các màn trình diễn thỏa đáng ở Scala ở quy mô nhỏ, và sự khác biệt chỉ trở nên quan trọng ở quy mô cao, sẽ không hợp lý khi xem xét phân chia vấn đề (phép nhân/vectơ) thành các nhiệm vụ khác nhau có thể được thực hiện song song?

lưu ý cá nhân: Tôi có vài cuộc thảo luận email với Joshua Bloch, một trong những ảnh hưởng nhất Java Developers bao giờ hết và là tác giả của Java có hiệu lực, và ông đã chỉ cho tôi hướng tới một bài thuyết trình thú vị bởi Brian Goletz (tác giả của Java Concurrency in Practice và rất có ảnh hưởng trong thế giới Java cũng): Not Your Father's Von Neumann Machine: A Crash Course in Modern Hardware


Nếu bạn kết luận rằng lợi ích là có và điều này rất có ý nghĩa, và rằng trong tương lai vấn đề siz của bạn sẽ không phát triển để y Bạn sẽ không cần lợi ích của việc thực hiện đa lõi, có thể bạn cần phải ở trong C++. Trong trường hợp khác, hãy xem Scala Macros, có sẵn từ 2.10-M3.

* Thêm: tránh biến trung gian không thực sự hợp lý khi sử dụng các ngôn ngữ chạy trên một máy ảo như Java hoặc C#. Trong thực tế, như bài viết bạn đã chỉ ra một cách chính xác được mô tả, có một mối nguy hiểm nhất định trong cách JVM dịch java bytecode thành assembler với JIT. Nhiều người trong số các tối ưu hóa bạn có thể chạy bằng tay đã được áp dụng bởi JVM, và hầu hết các lý do này là vô dụng nếu bạn đề phòng việc khai báo các phương thức và các biến FINAL. *

+0

Cảm ơn bạn đã bình luận của bạn. Có thực sự là câu hỏi nếu C++ vẫn nhanh hơn Java. [link] (https://github.com/mikiobraun/jblas/wiki/Java-Native-Code-Background) đưa ra một số gợi ý, và có những dự án như magma có thể được sử dụng bằng cách sử dụng JNI. Tuy nhiên, câu hỏi của tôi là khác nhau. Nó là nhiều hơn về tránh các biến tạm thời và tính toán không cần thiết (ví dụ như nhân với một ma trận nhận dạng). –

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