Cómo minimizar las operaciones de puntos flotantes en el siguiente código
Pregunta
Necesito minimizar la cantidad total de flops en el siguiente código, ¿puede alguien echar un vistazo rápido y decirme dónde colocar mi esfuerzo? He intentado varios analizadores de rendimiento, pero los resultados fueron irrelevantes ..
int twoDToOneD(int i, int j, int nRows)
{
return j*nRows + i;
}
double* addMatrices(int m, int n, double* A, double* B, bool add)
{
double* C = new double[m*n];
double* pA = A;
double* pB = B;
double* pC = C;
int i = m*n;
while(i--)
{
if(add)
{
*pC = *pA + *pB;
} else
{
*pC = *pA - *pB;
}
pC++;
pA++;
pB++;
}
return C;
}
gracias, Cho
Solución
Derecha, no leí todas las últimas líneas, pero parece que eres simplemente:
- generando un ATS al azar
- almacenándolos como
double
s - agregándolos
- agregando y multiplicándolos
IOW: no veo ningún uso de la fracción en absoluto , y un entero de tamaño adecuado será superior.Si eso es cierto, puede eliminar cada flop en el programa;)
Si eso no es una señal precisa, aún puede usarlo en un rango apropiado, luego simplemente escalar la señal, almacénela como un número entero y luego traiga el resultado de nuevo al rango correcto en algunos casos.
Para el tamaño adecuado de MUM / ADD, el uso de enteros será mucho más rápido y potencialmente requerirá mucha menos memoria, también puede aplicar las instrucciones de SIMD.
Más allá de eso: su mejora de la localidad de caché, minimizar la ramificación y minimizar las asignaciones dinámicas también podría hacer que el programa unas cuantas veces sea más rápido.