Lời chào. Tôi đang cố gắng để xấp xỉ hàmxấp xỉ log10 [x^k0 + k1]
log10 [x^k0 + k1], nơi .21 < k0 < 21, 0 < k1 < ~ 2000, và x là số nguyên < 2^14.
k0 & k1 là hằng số. Đối với mục đích thực tế, bạn có thể giả sử k0 = 2.12, k1 = 2660. Độ chính xác mong muốn là 5 * 10^-4 lỗi tương đối.
Chức năng này hầu như giống với Nhật ký [x], ngoại trừ gần 0, nơi nó khác rất nhiều.
Tôi đã thực hiện cài đặt SIMD nhanh hơn 1.15x so với bảng tra cứu đơn giản, nhưng muốn cải thiện nó nếu có thể, điều tôi nghĩ là rất khó do thiếu hướng dẫn hiệu quả.
Việc triển khai SIMD của tôi sử dụng số học điểm cố định 16 bit để đánh giá đa thức bậc 3 (Tôi sử dụng ít nhất ô vuông). Đa thức sử dụng các hệ số khác nhau cho các phạm vi đầu vào khác nhau. Có 8 phạm vi, và phạm vi tôi kéo dài (64) 2^i đến (64) 2^(i + 1). Lý do đằng sau này là các dẫn xuất của Log [x] giảm nhanh chóng với x, có nghĩa là đa thức sẽ phù hợp với nó chính xác hơn vì đa thức phù hợp chính xác cho các hàm có đạo hàm 0 vượt quá một trật tự nhất định.
Tra cứu bảng SIMD được thực hiện rất hiệu quả với một đơn _mm_shuffle_epi8(). Tôi sử dụng phao của SSE để chuyển đổi int để có được số mũ và meanand được sử dụng cho xấp xỉ điểm cố định. Tôi cũng phần mềm pipelined vòng lặp để có được ~ 1.25x tăng tốc, vì vậy tiếp tục tối ưu hóa mã có lẽ không.
Điều tôi đang hỏi là liệu có xấp xỉ hiệu quả hơn ở cấp cao hơn không? Ví dụ:
- chức năng này có thể được phân rã thành các chức năng với một miền hạn chế như log2 ((2^x) * significand) = x + log2 (significand)
do đó loại bỏ sự cần để đối phó với các phạm vi khác nhau (tra cứu bảng). Vấn đề chính mà tôi nghĩ là việc thêm thuật ngữ k1 sẽ giết tất cả những thuộc tính log đẹp mà chúng ta biết và yêu thích, làm cho nó không thể. Hoặc là nó?
Phương pháp lặp lại? đừng nghĩ vậy vì phương pháp Newton cho log [x] đã là một biểu thức phức tạp
Khai thác địa phương của các pixel lân cận? - nếu phạm vi của 8 đầu vào nằm trong cùng một phạm vi xấp xỉ, thì tôi có thể tra cứu một hệ số đơn lẻ, thay vì tìm kiếm các hệ số riêng biệt cho từng phần tử. Vì vậy, tôi có thể sử dụng điều này như là một trường hợp phổ biến nhanh, và sử dụng một đường dẫn mã chậm hơn, chung chung khi nó không phải là. Nhưng đối với dữ liệu của tôi, phạm vi cần phải là ~ 2000 trước khi thuộc tính này nắm giữ 70% thời gian, điều này dường như không làm cho phương pháp này cạnh tranh.
Xin vui lòng cho tôi một số ý kiến, đặc biệt nếu bạn là một nhà toán học được áp dụng, ngay cả khi bạn không thể làm được. Cảm ơn.
Bỏ phiếu để đóng, và do đó nghĩ rằng Phương pháp số không phải là chủ đề lập trình phải tuân theo phán quyết Knuth ở thế giới bên kia. –
Bạn nhận được loại độ chính xác nào và bạn cần độ chính xác nào? – RBarryYoung
Xin lỗi, tôi đã quên nêu chính xác. Tôi không chắc chắn, nhưng tôi nghĩ rằng một lỗi tương đối <= 0.0005 là mong muốn. –