Tôi sử dụng một biến thể của bộ lọc trung bình 5 chữ thập trên dữ liệu hình ảnh trên một hệ thống nhúng nhỏ, tức là
x
x x x
x
Thuật toán thực sự đơn giản: đọc 5 giá trị nguyên không dấu, lấy 2 giá trị cao nhất, thực hiện một số phép tính trên các giá trị đó và ghi lại kết quả số nguyên không dấu.
Điều tuyệt vời là 5 giá trị đầu vào số nguyên đều nằm trong phạm vi 0-20. Giá trị nguyên được tính cũng nằm trong phạm vi 0-20!
Thông qua hồ sơ, tôi đã nhận ra rằng việc có được hai số lớn nhất là nút cổ chai nên tôi muốn tăng tốc phần này lên. Cách nhanh nhất để thực hiện lựa chọn này là gì?
Thuật toán hiện tại sử dụng mặt nạ 32 bit với 1 ở vị trí được cho bởi 5 số và hàm CLZ được CTNH hỗ trợ.
Tôi nên nói rằng CPU là độc quyền, không có sẵn bên ngoài công ty của tôi. Trình biên dịch của tôi là GCC nhưng được thiết kế riêng cho CPU này.
Tôi đã cố gắng tìm hiểu xem tôi có thể sử dụng bảng tra cứu hay không nhưng tôi đã thất bại trong việc tạo khóa mà tôi có thể sử dụng.
Tôi có kết hợp cho đầu vào nhưng thứ tự không quan trọng, nghĩa là giống như .[5,0,0,0,5]
[5,5,0,0,0]
Nó xảy ra rằng hàm băm dưới đây tạo ra một hàm băm hoàn hảo mà không bị va chạm!
def hash(x):
h = 0
for i in x:
h = 33*h+i
return h
Nhưng hàm băm là rất lớn và đơn giản là không đủ bộ nhớ để sử dụng.
Có một thuật toán tốt hơn mà tôi có thể sử dụng? Có thể giải quyết vấn đề của tôi bằng cách sử dụng bảng tra cứu và tạo khóa không?
hash
đã thực hiện nhiều hoạt động hơn. Các cuộc gọi tiếp theo đến phương thức có liên quan không, ví dụ: trung tâm cóx
di chuyển qua ma trận từng hàng không?