Tengo un bucle anidado muy grande en el que se realizan algunas multiplicaciones y adiciones en números de coma flotante.¿Acelera el código matemático en C# escribiendo un C dll?
for (int i = 0; i < length1; i++)
{
double aa = 0;
for(int h = 0; h < 10; h++)
{
aa += omega[i][outsideGeneratedAddress[h]];
}
double alphaOld = alpha;
alpha = Math.Sqrt(alpha * alpha + aa * aa);
s = -aa/alpha;
c = alphaOld/alpha;
for(int j = 0; j <= i; j++)
{
double oldU = u[j];
u[j] = c * oldU + s * omega[i][j];
omega[i][j] = c * omega[i][j] - s * oldU;
}
}
Este ciclo está ocupando la mayor parte de mi tiempo de procesamiento y es un cuello de botella.
¿Sería probable que viera alguna mejora de velocidad si reescribo este bucle en C y lo conecto desde C#?
EDIT: Actualicé el código para mostrar cómo se generan s y c. También el bucle interno en realidad va de 0 a i, aunque probablemente no hay mucha diferencia a la pregunta
Edit2: he implementado el algoritmo en VC++ y vinculado con C# a través de una DLL y vi a un 28% aumento de velocidad sobre C# cuando todas las optimizaciones están habilitadas. El argumento para habilitar SSE2 funciona particularmente bien. La compilación con MinGW y gcc4.4 solo dio un impulso de velocidad del 15%. Acabo de probar el compilador de Intel y vi un aumento de velocidad del 49% para este código.
Las operaciones de coma flotante son tan rápidas en C# como en C. Probablemente solo la comprobación de límites de matriz haría que C# fuera un poco más lenta. Puedes deshacerte de eso usando un código inseguro. Es probable que solo vea mejoras masivas si su código C se compila según instrucciones SIMD (o similares). Pero llamar al código nativo tiene algún costo que la mejora debería valer. ... Si publica más código (GetS, GetC) quizás podamos ayudarlo a acelerar su código. – dtb
tal vez obtenga más velocidad tomando en cuenta la localidad de referencia para su matriz 2D ... como @dtb dice que las operaciones de coma flotante son tan rápidas en ambos idiomas –
¿Cuál es el rango general de longitud1 y longitud2? ... por curiosidad . – Rusty