Ese problema lo tuve con un simulador electrostático, hay una manera de invertir matrices que reduce el tiempo un 40%, pero no más pues los resultados de un kernel los tiene que hacer otro y no funciona. En mi caso invertía hasta 10mil x 10mil, el problema de invertir matrices grandes (que se lo digan a Ansys) es que a veces un término es "casi 0" y no sabes si considerarlo 0 o no, combinado además de si hay líneas que son proporcionales a las otras el determinante es 0 y no se puede invertir.
Notra: no usar floats, para no encontrarse overflows y suma de elementos inferiores al número de dígitos (en parte relacionado a lo que dice Baldo)
Yo al menos no logro que vaya más rápido, claro que yo uso diagonalizar...
a menos que disponga de una GPU con 10.000 núcleos es imposible que se ejecuten 10.000 kernel1 simultáneamente
Sí, empleando una tarjeta gráfica, pero es muy muy difícil y no creo merezca la pena
¡No me jodas fusión! el primer requisito para que 10.000 núcleos funcionen simultáneamente es que existan.
No entiendo a qué os referís exactamente con los métodos de invertir o diagonalizar, pero sospecho que no son más que variantes del mismo algoritmo de Gauss.
Estoy absolutamente convencido de que es posible un algoritmo que crezca con la segunda potencia del rango, pero la intuición y el rigor matemático no se llevan muy bien.
Bueno, se me ha ido un poco la mano, absolutamente convencido solo estoy de que sí es posible una solución en tiempo proporcional a rango*rango*rango/núcleos. Que es precisamente el planteamiento inicial de mi consulta.
fusion, seguro que esto te interesa: “Estos problemas se obtienen cuando el elemento pivotal es cercano a cero en vez de ser exactamente igual, por lo que si la magnitud del elemento pivotal es pequeño comparado con los otros elementos, entonces se introducen errores de redondeo. Por lo tanto, antes de normalizar cada renglón, es ventajoso determinar el coeficiente mayor disponible. Entonces se pueden intercambiar los renglones de tal forma que el elemento mayor sea el pivotal. A este método se le conoce con el nombre de pivoteo parcial.”
Supongo que el algoritmo de “pivoteo parcial” también se podrá paralelizar
¡No me jodas fusión! el primer requisito para que 10.000 núcleos funcionen simultáneamente es que existan.
La gráfica que usé tenía 3500 kernels y me costó 350 euros (hace 4 años), en el ordenador cabían dos, pero seguro los hay que se puedan meter más.
Eso sí, si usas double en vez de float tienes la mitad de núcleos
No se me ocurrió elegir el elemento pivotal mayor ¿o será mejor el medio?, en cualquier caso me parece una gran idea