F
lucky uppe schrieb:
void IDCT::iDCT(int startmatrix[8][8], int check){
Check = check;
coscalc();
for(int i = 0; i<8; ++i){
for(int j = 0; j<8; ++j){
for(int k = 0; k<8; ++k){
for(int l = 0; l<8; ++l){
Result += 0.25*(ccalc(k)*ccalc(l)*startmatrix[k][l]*LUT_idct[i][j]*LUT_idct[k][l]);//iDCT
}//l
}//k
Result += 128;
colorfiller(Result, Check);
Result = 0;
}//j
}//i
Check = 0;
}
Jetzt kommt der nächste Schritt: Schau dir das doch mal an von was das jeweils abhängig ist:
0.25 // konstante
*ccalc(k)*ccalc(l) // l+k
*startmatrix[k][l]* // l+k
LUT_idct[i][j]* // i+j
LUT_idct[k][l]; // l+k
Konstanten kann man ausklammern und das, was nur von i+j abhängig ist kann man ausklammern.
Wenn ich nichts übersehe, wäre das ja:
void IDCT::iDCT(int startmatrix[8][8], int check){
Check = check;
coscalc();
// der k+l-Teil:
float kl_result = 0;
for(int k = 0; k<8; ++k){
for(int l = 0; l<8; ++l){
Result += ccalc(k)*ccalc(l)*startmatrix[k][l]*LUT_idct[k][l];// loop unrolling macht hoffentlich das ccalc weg
}//l
}//k
kl_result *= 0.25;
for(int i = 0; i<8; ++i){
for(int j = 0; j<8; ++j){
float Result = kl_result * LUT_idct[i][j];
Result += 128;
colorfiller(Result, Check);
Result = 0;
}//j
}//i
Check = 0;
}
Von O(8^4) auf O(8^2), das bringt mehr als SSE oder Lookup.
Wow danke schön das hat wirklich viel gebracht!
hustbaer schrieb:
@Fuchs aus dem Wald
Wie geht's deinem JPEG Devocer?
Ganz gut läuft zu mindestens. Wie du siehst optimiere ich grade noch ein bisschen. Also es ist irgendwie nicht wunderschön aber es funktioniert! Ja geschafft hab ich es!
EDIT:
Für die ccalc könnte ich auch einfach ein Array nehmen mit den Werten: array = {0,1,1,1,1,1,1,1}
EDIT2:
Bin jetzt mal vorher nachher mit callgrind rüber. ^^
Von 460.000.000 auf 3.600.000 aufrufe. Ich finde das schon ziemlich gut!