2012-03-01 12 views
6

Tôi đã kiểm tra các triển khai CRC64 khác nhau. Ví dụ: this, thisthis. Vấn đề với tất cả những điều này là chúng hoạt động với các byte. Tuy nhiên, trên hệ thống 64 bit, tôi muốn làm việc với long (8 byte). Bằng cách này, tôi sẽ cần phải lặp lại ít hơn. Ví dụ, đối với dữ liệu 128 byte, sử dụng byte, tôi cần lặp lại 128 lần, trong khi với long, tôi sẽ chỉ cần lặp lại 16 lần.Tổng kiểm tra CRC sử dụng dài (64 bit)

Có triển khai CRC64 nào sử dụng long hoặc thậm chí kích thước từ lớn hơn byte không? Các kế hoạch này có thể được sửa đổi để làm như vậy không?

+2

Nếu SSE khả dụng, GCC có nhiều khả năng hủy bỏ vòng lặp của bạn và thậm chí sử dụng thanh ghi XMM 128 bit nếu có thể. Vì vậy, trước khi bạn dành nhiều thời gian tối ưu hóa một cách mù quáng mã - hãy kiểm tra xem trình biên dịch của bạn đang làm gì. –

+1

Ya, nhưng tính toán là tuần hoàn, mà tôi không nghĩ rằng có thể được vectorized. – pythonic

+1

Trước khi bạn cố gắng outsmart trình biên dịch, hãy kiểm tra xem nó thông minh như thế nào. GCC thực hiện nhiều phân tích vòng lặp, một số trong số chúng tôi chắc chắn bạn chưa từng nghe đến. Nó có thể (và trên thực tế, trong những trường hợp nhất định) unroll một vòng lặp ngay cả đối với tính toán tuần hoàn. Tôi không nói nó trong trường hợp của bạn, nhưng bạn phải kiểm tra trước khi tiến hành tối ưu hóa của riêng bạn. –

Trả lời

13

Tính toán CRC sử dụng mẹo để tránh phải xử lý dữ liệu từng bit một: Nó sử dụng bảng tra cứu cho phép xử lý nhiều bit cùng một lúc.

Xử lý n bit cùng một lúc yêu cầu bảng tra cứu có kích thước 2^n. Việc triển khai bạn liên kết đọc 1 byte (8 bit) tại một thời điểm, và thực sự tất cả họ đều sử dụng bảng tra cứu có kích thước 256 == 2^8.

Xử lý 64 bit cùng một lúc sẽ yêu cầu bảng tra cứu có kích thước 2^64, điều này không thực tế. Đây là lý do tại sao việc triển khai phổ biến CRC thực hiện xử lý 1 byte tại một thời điểm.

Mặc dù có thể xử lý 2 byte cùng một lúc bằng mảng nhập 65536, điều này có thể có tác động tiêu cực về hiệu suất do sử dụng bộ nhớ cache CPU nhiều hơn.

+1

BTW, bạn có biết bảng tra cứu được sử dụng trong triển khai phần cứng không? –

+0

@Vlad Tôi không biết nhiều về triển khai phần cứng. – interjay

+0

@VladLazarenko: Có các triển khai phần cứng được liên kết với thông tin liên lạc nối tiếp và chạy ở cùng tốc độ với tốc độ truyền, xử lý từng bit và do đó không cần bảng tra cứu. – quamrana

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