Tengo este ciclo escrito en C++, que compila con MSVC2010 tarda mucho tiempo en ejecutarse. (300ms)rendimiento extraño en C++ (VC 2010)
for (int i=0; i<h; i++) {
for (int j=0; j<w; j++) {
if (buf[i*w+j] > 0) {
const int sy = max(0, i - hr);
const int ey = min(h, i + hr + 1);
const int sx = max(0, j - hr);
const int ex = min(w, j + hr + 1);
float val = 0;
for (int k=sy; k < ey; k++) {
for (int m=sx; m < ex; m++) {
val += original[k*w + m] * ds[k - i + hr][m - j + hr];
}
}
heat_map[i*w + j] = val;
}
}
}
que parecía un poco extraño para mí, así que hice algunas pruebas y luego cambió unos pocos bits de inline montaje: (en concreto, el código que resume "val")
for (int i=0; i<h; i++) {
for (int j=0; j<w; j++) {
if (buf[i*w+j] > 0) {
const int sy = max(0, i - hr);
const int ey = min(h, i + hr + 1);
const int sx = max(0, j - hr);
const int ex = min(w, j + hr + 1);
__asm {
fldz
}
for (int k=sy; k < ey; k++) {
for (int m=sx; m < ex; m++) {
float val = original[k*w + m] * ds[k - i + hr][m - j + hr];
__asm {
fld val
fadd
}
}
}
float val1;
__asm {
fstp val1
}
heat_map[i*w + j] = val1;
}
}
}
Ahora funciona en la mitad del tiempo, 150 ms. Hace exactamente lo mismo, pero ¿por qué es dos veces más rápido? En ambos casos, se ejecutó en modo de lanzamiento con optimizaciones activadas. ¿Estoy haciendo algo mal en mi código C++ original?
¿Has intentado comparar el código ensamblador generado en ambos casos ... –