Cómo minimizar las operaciones de puntos flotantes en el siguiente código

StackOverflow https://stackoverflow.com/questions/9463493

  •  13-11-2019
  •  | 
  •  

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

¿Fue útil?

Solución

Derecha, no leí todas las últimas líneas, pero parece que eres simplemente:

  1. generando un ATS al azar
  2. almacenándolos como doubles
  3. agregándolos
  4. 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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top