PRODUCTO DE MATRICES: Ejemplo práctico

4

Este fin de semana, Guti me envió una captura del programa Derive 6 (programa para cálculo matemático, estilo Matlab).

En la captura me enseñaba como el programa multiplicaba dos matrices cuadradas de 200×200 en unos 4 segundos. Me creo que tiene un K7 a 2.4Ghz.

Curiosamente por casualidades de la vida, no hace muchos dias, he tenido que implementar una función en C para realizar el productos vectorial de 2 matrices….. Y me puse a comparar tiempos…

En mi portatil clónico P4 a 1.8Ghz con 512kb cache y multiplicando dos matrices de 200×200 de floats…….. 0.17 segundos!!!.

No está mal, y eso que está en C sin utilizar ensamblador, por lo que me temo que aún se puede “tunear” bastante más.

Aquí os pongo el código de la función por si a alguien le puede ser útil.

La función recibe los siguientes parametros:
src1 -> puntero a la primera matrix
xsrc1 -> ancho primera matrix
ysrc1 -> alto primera matrix
src2 -> puntero a la segunda matrix
xsrc2 -> ancho segunda matrix
ysrc2 -> alto segunda matrix
dst -> matriz destino
xdst -> ancho matrix destino
ydst ->alto matrix destino

La función presupone que las matrices se puede multiplicar y que los punteros están reservados correctamente…. que sus aproveche.


void ProductoVectorialNxN(float *src1, int xsrc1, int ysrc1, float *src2, int xsrc2, int ysrc2, float *dst, int *xdst, int *ydst)
{
float *Srca, *Srcb;
float value;

*xdst = xsrc2;
*ydst = ysrc1;

for(int n0=0; n0<ysrc1; n0++)
{
for(int n1=0; n1<xsrc2; n1++)
{
Srca = src1 + (n0*this->m_iWidth*sizeof(float));
Srcb = src2 + (n1*sizeof(DTYPE));
value = 0;
for(int n2=xsrc1; n2>0; n2–)
{
value+= *(Srca++) * *(Srcb);
Srcb+= xsrc2*sizeof(float);
}
*(Dst++) = value;
}
}
}

6 Comments

Leave a Comment