Utilizo un ejemplo de la teoría de elementos finitos, pero cualquiera que mantenga una gran estructura de datos y la extienda sucesivamente encontrará algo similar.
Suponga que tengo una malla no estructurada de puntos y triángulos, donde los puntos están dados por coordenadas (digamos e ) y los triángulos consisten en tres índices de puntos (digamos , y ).
Como es común en FEM, la malla será sucesivamente refinada. Si recurrimos al refinamiento regular global, el número de triángulos crecerá en un factor con cada iteración del refinamiento. Dependiendo de cómo se haga esto, el diseño de la memoria se desarrollará de manera diferente.
Digamos que la malla oculta las celdas de memoria 1 a 300, cualquier cosa más allá de eso está libre.
Ejemplo 1:
Asignamos el espacio para la nueva malla, celdas 301 a 1501, la llenamos con los datos de la malla refinada y olvidamos la anterior. La siguiente malla refinada se colocará en las celdas 1501 a 6300, la siguiente en 6301 a 21500, y así sucesivamente. La ubicación de la malla actual se moverá en la memoria "hacia la derecha", mientras que no se utilizará un parche enorme. Podemos quedarnos sin memoria prematuramente.
Se podría observar en el ejemplo anterior, que esto solo nos dificultará un paso más, porque incluso sin esa fragmentación nos quedaríamos sin memoria total un refinamiento más tarde. A medida que también se tiene en cuenta la matriz de vértices, el problema puede ser más grave.
¿Cómo se puede evitar esto?
Ejemplo 2
Vuelva a asignar la matriz de triángulos a las celdas 1..1200. Cree la nueva malla en las celdas 1201 a 2400. Copie el contenido de esa copia de trabajo en las celdas 1..1200 y olvide la copia de trabajo. Repite de manera similar.
Ok, todavía nos quedamos sin memoria prematuramente, porque necesitamos una copia que funcione. Qué tal esto:
Ejemplo 3
Vuelva a asignar la matriz de triángulos a las celdas 1..1500. Copie la malla antigua a 1201 .. 1500. Cree una nueva malla en las celdas 1..1200. Luego olvida la copia de la malla vieja.
El caso aquí es artificial, porque uno no usaría el refinamiento de malla global en estas escalas. Si el crecimiento es mucho menor, la realineación de la memoria es posible para evitar la fragmentación. Sin embargo,
Preguntas:
¿La fragmentación de la memoria se vuelve crítica en la informática científica práctica / informática de alto rendimiento?
Si es así, ¿cómo lo evitas? Tal vez mi modelo de máquina está incluso equivocado, y el sistema operativo, por magia pesada, realinea la memoria tácitamente o gestiona bloques fragmentados en el montón.
Más específicamente, ¿cómo afecta a la gestión de la red?