2011-07-25 8 views
5

Me disculpo por adelantado que no tengo la jerga adecuada para describir mi problema, y ​​que probablemente no he dado suficiente información.¿GCC 4.5/Ubuntu 11.04 es un código de autoenlace?

He estado ejecutando mi código MPI en gcc 4.4 y OpenMPI/MPICH2 durante meses sin problemas en una variedad de plataformas. Recientemente actualicé un conjunto de servidores y mi escritorio a Ubuntu 11.04 (ejecutando gcc 4.5 ahora) y ejecuté un trabajo de 8 tareas en un nodo con 8 procesadores. Normalmente veo casi el 100% de utilización de la CPU del usuario, y ahora veo solo el 60% de CPU del usuario y más del 30% de la CPU del sistema. Esto conduce a una desaceleración notable de mi código cuando se ejecuta de esta manera.

Investigando aún más, simplemente ejecuté un trabajo en serie, y noté que el proceso informaba que se estaba utilizando un 150% de tiempo de CPU. Entonces, mi programa era multiproceso en muchos procesadores. Verifiqué esto explícitamente usando 'ps -eLF' y mirando las cargas por procesador.

Esto es algo increíblemente malo e ineficiente para mi código MPI, y no tengo ni idea de dónde viene. Nada ha cambiado más que el cambio a Ubuntu 11.04 y gcc 4.5. Lo he verificado contra varias versiones de OpenMPI.

También moví binarios entre dos máquinas compatibles con binary. Si compilo en otra máquina (ubuntu 10.10/gcc 4.4) y corro allí, todo está bien. Al mover el binario a la máquina Ubuntu 11.04, el mismo binario comienza a enhebrarse.

Vale la pena señalar que he deshabilitado explícitamente todas las optimizaciones (-O0), pensando que mi valor predeterminado (-O3) podría incluir algo que no entendí en 4.5. Obtengo un comportamiento idéntico independientemente del nivel de optimización.

Háganme saber qué información adicional puedo proporcionar para determinar el origen de este problema.

* INFORMACIÓN ADICIONAL *

Resultados de LDD en respuesta a la solicitud. Simplemente, es OpenMPI, libconfig y ScaLAPACK, junto con la materia gcc estándar:

linux-vdso.so.1 => (0x00007ffffd95d000) 
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f2bd206a000) 
libconfig.so.8 => /usr/lib/libconfig.so.8 (0x00007f2bd1e60000) 
libscalapack-openmpi.so.1 => /usr/lib/libscalapack-openmpi.so.1 (0x00007f2bd151c000) 
libmpi.so.0 => /usr/lib/libmpi.so.0 (0x00007f2bd126b000) 
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f2bd0ed7000) 
libblacsCinit-openmpi.so.1 => /usr/lib/libblacsCinit-openmpi.so.1 (0x00007f2bd0cd4000) 
libblacs-openmpi.so.1 => /usr/lib/libblacs-openmpi.so.1 (0x00007f2bd0aa4000) 
libblas.so.3gf => /usr/lib/libblas.so.3gf (0x00007f2bd022f000) 
liblapack.so.3gf => /usr/lib/liblapack.so.3gf (0x00007f2bcf639000) 
libmpi_f77.so.0 => /usr/lib/libmpi_f77.so.0 (0x00007f2bcf406000) 
libgfortran.so.3 => /usr/lib/x86_64-linux-gnu/libgfortran.so.3 (0x00007f2bcf122000) 
libopen-rte.so.0 => /usr/lib/libopen-rte.so.0 (0x00007f2bceed3000) 
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f2bcecb5000) 
/lib64/ld-linux-x86-64.so.2 (0x00007f2bd22fc000) 
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f2bcea9f000) 
libopen-pal.so.0 => /usr/lib/libopen-pal.so.0 (0x00007f2bce847000) 
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f2bce643000) 
libutil.so.1 => /lib/x86_64-linux-gnu/libutil.so.1 (0x00007f2bce43f000) 

Todo lo mejor.

+0

¿Qué bibliotecas utiliza su código? ¿Puedes mostrar los resultados de 'ldd your_programme' para la versión en serie? – osgx

+0

seguro. es MPI, libconfig y scalapack. He agregado los resultados de ldd a la publicación principal. cada una de estas bibliotecas las he usado desde los repositorios de apt y las he compilado de forma personalizada en ambas plataformas (las buenas 4.4 y las malas 4.5). nada parece cambiar nada sobre el comportamiento. – coastal

+0

me di cuenta de que los resultados eran para la versión paralela. Nunca construyo una versión en serie, MPI está procesada. Notarás muchas otras cosas allí, la que más me preocupa es libpthread aunque mi archivo MAKE nunca vincule explícitamente esa biblioteca, así que debería ver de dónde vienen esas cosas. . sin embargo, si tomo este binario, compilado en gcc 4.5 con estas bibliotecas y lo ejecuto en una instalación ubuntu 10.10 compatible con binarios, todo funciona como se espera. todo con las mismas bibliotecas. es realmente extraño. – coastal

Respuesta

1

¿es posible que se encuentre con esta característica? http://gcc.gnu.org/onlinedocs/libstdc++/manual/parallel_mode.html

básicamente, ciertas rutinas de biblioteca estándar tienen implementaciones paralelas. Sin embargo, solo se enciende cuando se define la macro _GLIBCXX_PARALLEL.

+0

este programa está escrito completamente en C, no en C++, y no estoy usando nada disponible en C1X, etc. todo es estricto C99. ciertamente no he definido tal macro. – coastal

1

Ver 60%/40% no dice nada, tal vez el procesamiento se haya contabilizado de manera diferente. La única cifra interesante aquí sería comparar el tiempo de reloj de pared de la ejecución total de tu código.

Además, creo que (si es así) no es el binario en sí lo que se paraleliza sino las librerías MPI. Para comprobar que no solo tendrías que compilar tu código en la otra máquina sino también vincularlo estáticamente. Solo entonces puede estar seguro de que ejecuta exactamente el mismo código binario en todos sus aspectos en la otra máquina.

Entonces, tampoco puede estar seguro de que la biblioteca MPI no use C++ bajo el capó. Recuerdo que era bastante difícil para una de las librerías MPI (no recuerdo cuál) instalarla para no compilar contra la interfaz C++, incluso si solo estaba haciendo C.

+0

El procesamiento no se tiene en cuenta de manera diferente. Hay una desaceleración muy obvia en el código mismo. Ejecutar 8 tareas es menos de la mitad de la velocidad en Ubuntu 11.04 que en 10.10. Me resulta difícil creer que un sistema diseñado para la paralelización explícita de memoria no compartida pueda desentrañar copias de mi código, incluso cuando se ejecuta ** sin ** MPI, como en el caso de serie que menciono en mi publicación original. Idénticas versiones de MPI fueron compiladas por mí de forma idéntica en ambas plataformas sin ningún efecto. La versión del repositorio apt de MPI produce el mismo comportamiento. – coastal

+0

Esta habría sido una información interesante que podría haber dado en su pregunta. –

+0

Agregaré esta información a la publicación original como usted sugiera. – coastal

Cuestiones relacionadas