Trước hết, để rõ ràng, tôi biết rằng một số lượng lớn các triển khai MD5 tồn tại trong C++. Vấn đề ở đây là tôi tự hỏi nếu có một so sánh trong đó thực hiện nhanh hơn so với những người khác. Vì tôi đang sử dụng hàm băm MD5 này trên các tệp có kích thước lớn hơn 10GB nên tốc độ thực sự là mối quan tâm chính ở đây.Thực hiện nhanh MD5 trong C++
Trả lời
Tôi nghĩ rằng avakar điểm đang cố gắng để thực hiện là: với sức mạnh xử lý hiện đại tốc độ IO của ổ cứng của bạn là nút cổ chai không phải là tính toán của băm. Bắt một thuật toán hiệu quả hơn sẽ không giúp bạn vì đó không phải là (có thể) điểm chậm nhất.
Nếu bạn đang làm bất cứ điều gì đặc biệt (ví dụ 1000 vòng) thì có thể khác, nhưng nếu bạn chỉ tính toán giá trị băm của một tệp. Bạn cần tăng tốc độ IO của bạn, chứ không phải toán học của bạn.
Tôi chắc chắn có rất nhiều bản chỉnh sửa CUDA/OpenCL của thuật toán ngoài đó sẽ giúp bạn tăng tốc rõ ràng. Bạn cũng có thể sử dụng thuật toán cơ bản và suy nghĩ một chút -> có được triển khai CUDA/OpenCL.
Mật mã khối là ứng cử viên hoàn hảo cho loại triển khai này.
Bạn cũng có thể cài đặt C và lấy bản sao của trình biên dịch C của Intel và xem nó tốt như thế nào. Các phần mở rộng vectorization trong CPU Intel là tuyệt vời cho tăng tốc độ.
bảng có sẵn ở đây:
http://www.golubev.com/gpuest.htm
trông giống như lẽ nút cổ chai của bạn sẽ được ổ cứng IO của bạn
Tôi không nghĩ rằng nó quan trọng nhiều (trên cùng một phần cứng, nhưng thực sự GPGPU-s là khác nhau, và có lẽ nhanh hơn, phần cứng cho loại vấn đề). Phần chính của md5 là một vòng lặp phức tạp của các phép toán số học phức tạp. Vấn đề là chất lượng tối ưu hóa trình biên dịch.
Và điều gì cũng quan trọng là cách bạn đọc tệp. Trên Linux, mmap và madvise và readahead có thể có liên quan. Tốc độ đĩa có thể là nút cổ chai (sử dụng SSD nếu bạn có thể).
Và bạn có chắc chắn muốn md5 cụ thể không? Có các thuật toán mã hóa băm đơn giản và nhanh hơn (md4, v.v.). Vẫn còn vấn đề của bạn là nhiều I/O bị ràng buộc hơn CPU bị ràng buộc.
Bạn có các ổ đĩa siêu hiện đại, nhanh hơn SSD này, phải không? – avakar
Câu hỏi này (http://stackoverflow.com/questions/2717216/what-hash-algorithms-are-allelizable-optimizing-the-hashing-of-large-files-u) có thể hữu ích. Tôi sẽ đề nghị một cái gì đó bạn có thể song song, nhưng tôi cho rằng nó phụ thuộc vào cách dữ liệu của bạn được lưu trữ. – Vlad
@avakar: Nếu dữ liệu được nhân rộng, ít nhất cũng hợp lý để tăng tốc độ tính toán bằng cách chạy nó song song với các bản sao khác nhau, nếu hệ thống cho phép nó. – Vlad