C Code:
int func(int v, int d) { return (v>=128)? min(max(v, 224), v+d) max(min(v,31), v-d); // clipping }
Hi các bác, em có một giải thuật như dưới đây cần optimize. Mục đích là làm cho đơn giản hơn và nếu có thể thì loại bỏ if-else statement (trong func() thôi, min, max thì ok). Em nghĩ cả tuần nay rồi mà chưa có cách nào, các bác nhiều kinh nghiệm xem có ý tưởng gì giúp em được không ạ. Tks các bác.
C Code:
#include <stdlib.h> #include <stdio.h> int max(int a, int b){ if(a>b){ return a; }else{ return b; } } int min(int a, int b){ if(a>b){ return b; }else{ return a; } } int func(int v, int d){ int max_limit,min_limit; if(v>=128){ max_limit = max(v, 224); v += d; v = min(max_limit, v);//clipping }else{ min_limit = min(v, 31); v -= d; v = max(min_limit, v);//clipping } return v; }
Đã được chỉnh sửa lần cuối bởi quanganh12 : 07-09-2011 lúc 09:42 AM.
C Code:
int func(int v, int d) { return (v>=128)? min(max(v, 224), v+d) max(min(v,31), v-d); // clipping }
Thanks bác, nhưng mà code của bác về mặt code size và time execution thì vẫn giống của em thôi (cùng một mã asm) vì ? operator chỉ là dạng viết tắt của if-else statement. Em muốn tránh branch penalty, đồng thời có thể tính toán song song, muốn như vậy thì chỉ có cách dùng các phép tính số học để biểu diễn :P
Bạn có thể giải thích hơn về ý tưởng tính toán song song của bạn không?
Song song ở đây là có thể tính toán nhiều input cũng một lúc, chẳng hạn dùng các lệnh SIMD của ARM. Muốn vậy thì phải biểu diễn ở dạng các phép toán số học, tránh các câu lệnh điều kiện. Riêng có một số hàm built-in như min, max có thể thực hiện được với vector nên không cần phải thay đôi chúng
Một bài toán optimize khá thú vị đấy !
1. Loại bỏ hai hàm min & max, đã là hàm thì bị tốn time call, mà còn if-else nữa.
2. v & d nên đưa về 8 bit (BYTE), dùng các phép xor, or, and để loại bỏ hai hàm min, max
Có lẽ điều kiện bạn muốn rất gần với code của drivers. Muốn tối ưu thì phải dùng cách code machine/platform specific.
muốn không dùng if thì có một cách bành chướng bộ nhớ.
theo code thì khoảng dữ liệu chia ra làm 4 phần
0...31...128...224....
B1. tạo một mảng 65536 phần tử con trỏ, trỏ vào hàm
B2. tạo 4 hàm như sau
hàm 1: trừ v cho d, trả về giá trị v khi chưa trừ d.
hàm 2: trừ v cho d, trả về 31.
hàm 3: cộng v với d, trả về 224.
hàm 4: cộng v với d, trả về giá trị v khi chưa cộng với d.
b3:
gán toàn bộ 31 con trỏ hàm hàm đầu tiên cho hàm 1
gán toàn bộ 96 con trỏ hàm tiếp theo cho hàm 2
gán toàn bộ 96 con trỏ hàm tiếp theo cho hàm 3
gán các con trỏ hàm còn lại cho hàm 4
b4:
gọi hàm[i].
Xong, không dùng một lệnh if nào.
(chỉ dùng lệnh if và for để khởi tạo, cái này không tính vào thời gian tính toán).