Different approaches for profiling your CUDA application

If GPUs are so amazing new stuff, why is everybody not developing software for this architecture? There are some reasons, for example, not all applications should be offloaded into a GPU. The first question to think about is the possibility of parallelizing the code. If the answer is affirmative it could be a good starting point. However, some problems arise in this first step. Transferring data between GPU and CPU is quite slow so depending on how heavy the computations are against the transfers you are going to speed up your code or not.

However, the main difficulty that remains is the complexity of GPU developing. During the first years, when this technology was immature, the GPU works as a black box for the programmer. Data was transferred, the kernel was executed and the developer had to take a look to the output to try to figure out what was happening in the GPU. When the output was wrong he had to start a very unpleasant work of debugging.
Cuda-gdb was almost the only tool for helping in such tasks but had a high learning curve. Nowadays tools are more helpful and with an intuitive GUI like Allinea DDT’s.

allinea-ddt

Correctness is the first challenge that a GPU developer has to face but the application could be slower than the CPU version. In that moment, efficiency is the key of the future work. We should know which parts of the code are more time consuming, how much time is spent in transfers and computing… And that is profiling.

First approach

Nvidia provides two simple ways of measuring time in our applications: timers and events. They are quite similar and easy to understand as shows the following example:

  cudaEvent_t start, stop;
  float time;
  cudaEventCreate(&start);
  cudaEventCreate(&stop);

  cudaMalloc((void **) &a_d, size);   // Allocate array on device
  cudaMemcpy(a_d, a_h, size, cudaMemcpyHostToDevice);
  cudaEventRecord(start, 0);
  // Do calculation on device:
  square_array <<< n_blocks, block_size >>> (a_d, N);
  cudaEventRecord(stop, 0);
  cudaEventSynchronize(stop);

  // Retrieve result from device and store it in host array
  cudaMemcpy(a_h, a_d, sizeof(float)*N, cudaMemcpyDeviceToHost);
  cudaFree(a_d);
  cudaEventElapsedTime(&time, start, stop);
  printf ("Time for the kernel: %f ms\n", time);

The ouput:

$ ./cuda_app
Time for the kernel: 0.041632 ms

The main pro about using this approach is its simplicity. You don’t need any other tool. In the other hand you have to create graphs by your own to show the results. This task is time consuming and, being frank, quite boring.

Second approach

The Barcelona Supercomputing Centre has developed some profiling tools: Extrae and Paraver. The first one lets you measure time in different points of the application and the second one is focused in data presentation. The following lines give an example of Extrae’s callings:

for (i = 1; i <= MAX_ITERS; i++)
{
Extrae_event (1000, i);
[original loop code]
}
Extrae_event (1000, 0);

You have a lot of different calls for creating event types, start and stop the profiling,  network and task monitoring (MPI)…  You could use a XML configuration file with different types of measurements. Extrae’s output file can be used as the Paraver’s input as you can see in the following figure:

Imagen

Using the information shown in the picture you could understand better how the application performance is in a given hardware.

In conclusion, this approach is better than the first one but you still need to modify your code and learn how to use both tools. And I could say that it isn’t a trivial task.

Third approach

The last tool revised in this post is Allinea Map. This tool tries to ease profiling avoiding all the cons shown in the first two approaches.

Using it is as simple as you can see in the following line:

$ map ./cuda_app datafile.in

Map application has a very intuitive GUI that displays a lot of useful information:

Imagen

Using this tool you could truly understand your application performance. It is important to highlight that, frequently, developers are not always specialised people but scientifics from a wide range of fields: physics, chemistry, biology… For this kind of people Allinea shows its main feature, the mixture of a powerful and an easy-to-learn tool. The next figure could be seen as an illustrative example of the previous words:

map1
In the main panel you could find the source code and it’s annotated with performance percentages for both computation and communication time. Developers could focus in just such functions that are more time consuming.
Another important Allinea Map panel is the one that shows CPU versus GPU computation. Opportunities have arisen to perform future computations  in the CPU instead leaving it idle while the GPU is working.

Charts are not static ones, a developer can zoom in on any part of the chart to view a shorter period of time. He could verify if the application is properly using the hardware. For example, he could look for signs of a cache-related bottleneck.
Summing up, here are the key features of Allinea Map:

  • No need to instrument your code
  • A little runtime overhead (around 5%)
  • An intuitive GUI with low learning curve
  • Easy way to find opportunities to improve your application speed up

As you could see in the previous paragraphs, Allinea Map could become the programmer’s best friend for profiling and tuning GPU applications.

Anuncios

Tráfico en una red

Como administrador de sistemas uno de los primeros problemas a los que tuve que hacer frente es el temido:

La red va lenta.

Y claro, me conecto al firewall y veo que sí, que alguien está descargado a tope y la conexión está al 100%. Pero eso sólo certifica el origen del problema pero no la solución. ¿Cómo puedo saber quién de los casi 100 pcs que hay conectados a mi red está saturando la conexión?

Hay multitud de programas que te permiten ver el tráfico desde un PC en concreto. O que requieren que instales algo en cada uno de los ordenadores que quieres gestionar. Ninguna de las soluciones era factible para mí.

Yo necesito controlar, desde un único punto, qué cantidad de ancho de banda me consume cada usuario. Para ello y teniendo una configuración típica como la siguiente:

red

Hay que realizar los siguientes pasos:

Entrar al último switch, al que se conecta el Firewall o el Router ADSL y hacer un port mirroring. Es decir, que el switch envíe por una boca (a nosotros) una copia de lo que se envía/recibe de Internet. Para conectarnos al switch (en el dibujo un 3COM pero en mi caso particular un D-Link) hay que prepara la conexión como se muestra a continuación (obtenida del manual del fabricante):

Imagen

Yo recomiendo hacerlo con un portátil ya que tendremos que ir al armario de servidores y conectarnos con un cable de red a una de las bocas libres del switch (en mi caso usé la 46).

Con dicha configuración podremos abrir un navegador y conectarnos a la web de configuración del switch: 10.90.90.90 y pedirá contraseña. Si no has configurado ninguna será “admin” pero te recomiendo encarecidamente que la cambies. Esta dirección es la que trae por defecto mi switch D-Link. Consulta el manual de tu fabricante para conocer los parámetros a configurar para poder gestionar el switch.

Cierra la ventana de configuración inicial y podrás acceder a la web de gestión. En ella, tendrás que realizar el port mirroring:

portMirroring

En mi caso, he realizado una copia de todo lo que “se mueva” por la boca 6 hacia la boca 47. ¿Por qué? Porque la boca 6 se conecta con el firewall de salida. En caso de no tener, tendrías que seleccionar la boca que va hacia el router de Telefónica/Ono/Jazztel y que te da conexión a Internet. El puerto 47 es una boca del switch cualquiera que estaba libre.

Ya podemos cerrar todo, volver a establecer nuestra configuración de red usual y conectarnos a dicha boca: la 47. Usando un software que haga de sniffer es posible obtener un gráfico detallado de quién está generando más tráfico.

Yo he optado por el Network Protocol Analyzer de SoftPerfect que ha funcionado a la perfección. Basta con elegir qué tarjeta de red quieres usar (en el caso de que tengas más de una) y sospecho que automáticamente pone la tarjeta de red en modo promiscuo para poder realizar la captura de todo el tráfico.

En la siguiente imagen se puede ver una captura del programa ejecutándose y donde se puede comprobar como un usuario está acaparando casi el 75% de los datos de bajada.

pruebaOK

¡Justo lo que buscábamos!

Otro punto de vista

En el último post comentaba mi visión sobre la investigación.

ImagenMi “jefe” también ha reflexionado sobre el asunto y me gustaría dejarlo reflejado aquí también por si puede servir a algún otro navegante. 

Mi experiencia con los doctorados es limitada: solamente he hecho el mío y dirigido dos tesis: las de Antonio y Ruymán. Así pues, mis conclusiones al respecto no serán tan relevantes como las de otros con más experiencia. Dicho esto he de decir que dgracias a mi tesis doctoral (era imprescindible para el puesto que ocupo) hoy en día tengo un trabajo del que puedo decir que me siento como un privilegiado: me gusta, trabajo en lo que me gusta, mantengo mucho contacto con gente brillante e interesante y no me siento mal pagado. Análogamente, Antonio trabaja en la actualidad en el Instituto de Astrofísica de Canarias y Ruymán en el Edinburgh Parallel Computer Centre. Ambos son centros de excelencia a nivel internacional y en ambos casos, el doctorado era un requisito imprescindible para el puesto. Así que solo puedo decir que mi experiencia con respecto a un doctorado, incluso en España, es muy positiva.

Si estudias Ingeniería Informática, una carrera dura donde las haya y tu única aspiración profesional es cambiar el tóner de las impresoras en cualquier organización, el doctorado no te va a servir de nada. Si acabas los estudios de informática y Google llama a tu puerta interesándose por tus servicios, yo también comprendo que no hagas una tesis (cosa que probablemente Google también valorará). Pero si no es tu caso, y no tienes nada mejor que hacer ni encuentras trabajo, hacer una tesis doctoral así como completar o complementar tu formación informática se me ocurre que es una de las mejores alternativas para tu desarrollo profesional.

Las colas del desempleo, desafortunadamente están llenas de gente. De entre ellos (así lo indican las estadísticas), quienes antes se colocarán serán los más cualificados. Si soy un empresario que busca, pongamos por caso un ‘apretador de tornillos’ y tengo que elegir entre una persona que consta en las listas de desempleo como “mano de obra no cualificada” y otra que figura como “Licenciado en psico-pedagogía”, elegiré al segundo. A pesar de que para apretar tornillos su título no me valga de nada.

Iván: me temo que tu opinión sobre el doctorado está fuertemente influenciada por la lamentable circunstancia económica (crisis la llaman) que atraviesa España. No obstante estoy convencido que los análisis tienen que hacerse con una mayor apertura de miras y perspectiva. Desde mi punto de vista, en épocas de crisis, lo mejor que podemos hacer es incrementar nuestra cualificación. Es lo que recomiendo a todos mis estudiantes, y es lo que recomendaré a mis hijos, cuando les llegue ese momento.

En lo que sí estoy de acuerdo es en que el doctorado tiene que ser para alguien que (a) disfrute con lo que hace y (b) esté dispuesto a hacer un esfuerzo extra en términos de formación, porque una tesis suele durar entre 4-5 años y supone un trabajo duro y concienzudo, con frecuencia realizado en unas condiciones, particularmente económicas, que no suelen ser fáciles. Con la coyuntura actual esas condiciones no están haciendo más que endurecerse, con lo cual entiendo que cada vez menos gente se sienta atraída por la investigación. No obstante sigo pensando que si se tiene el suficiente apoyo económico, no es una vía a despreciar en los tiempos que corren.

 Actualización:

Tener un doctorado puede servir para optar a ofertas de trabajo como la siguiente donde ser doctor es uno de los requisitos:

 

– Perfil de la plaza:
Doctor/a en Informática o titulación asimilable, con menos de 10 años de
experiencia posdoctoral y líneas de investigación activas en computación
de altas prestaciones, arquitecturas heterogéneas, algebra lineal y teoría
de control.
– Duración del contrato: 4 años
– Sueldo bruto: 1.577,70 euros/mes + pagas extraordinarias

Más información:
https://e-ujier.uji.es/pls/www/!gri_www.euji05703?p_tab=2&p_conv=1370&p_conc=3
https://e-ujier.uji.es/pls/www/!gri_www.euji05714?p_conv=3&p_id=14421&p_greid=16983

Cruce de caminos – Mi visión de la investigación

Imagen

Hace tiempo leí algo relacionado sobre los sueldos de los directivos de los bancos. El entrevistado venía a decir que los directivos tenían que cobrar esos sueldos escandalosos porque, en caso contrario, no se atraerían a los mejores profesionales.

A mí me hizo mucha gracia semejante comentario. Me podría haber acordado de los policías, los profesores y maestros o cualquier otra profesión en la que también se debería de pensar en atraer a los mejores. Sin embargo, sus sueldos no son como los directivos de los bancos. Pero no. Me acordé de los investigadores. De esas personas que dedicamos nuestro tiempo a hacer que la ciencia avance mientras conseguimos el doctorado.

¿Qué personas deciden hacer un doctorado? Pues normalmente las mentes más brillantes. Por dos motivos: las becas se conceden por expediente académico y porque son muy duros. Si te ha costado sacar la carrera no te darán ganas de doctorarte.

Bien, intentemos sacar a relucir los pros y los contras de esta situación. Supongamos que estamos en el mejor caso: hemos conseguido una beca FPU/FPI. Nuestro deber será trabajar 8 horas al día en investigación. Leer varios papers a la semana para seguir en la cresta de la ola de los últimos avances. Cada pocos meses un esfuerzo adicional para crear tu propio paper. Muchísimas horas de trabajo que pueden quedar en nada si se rechaza tu trabajo. En caso afirmativo comienza la burocracia para preparar el viaje hacia el congreso. Hacer la presentación, preparar las preguntas…

En resumen, la carga de trabajo es brutal. Y tienes el constante estrés de que si no das el máximo, alguien vendrá y publicará “eso” en lo que estés trabajando. Por lo que debes hacer las cosas rápido y bien.

¿Y la contrapartida a todo esto? Un salario muy bajo. Unos 1.100 €.

En este punto me gustaría aclarar que, si la carrera que has hecho tiene mucho paro, a lo mejor esto es una salida. Pero un informático puede cobrar más que eso incluso sin experiencia. Si le ponemos dos o tres años de experiencia en Java puede cobrar el doble o el triple.

Resumiendo, mientras hace el doctorado cobra menos que el resto de sus compañeros. ¿Y después del doctorado? ¿Cobrará un pastizal teniendo en cuenta que tiene el grado máximo de preparación posible? ¿Las empresas abrirán sus puertas de par en par? ¿Puedes quedarte en la universidad y ser docente?

La cruda realidad es que el doctorado no te brinda ninguna ventaja. La universidad es territorio vedado. La estabilidad brilla por su ausencia. Podrías intentar pedir un posgrado o algo así. Pero nadie te asegura nada. Estás mendigando por unas perras. Por un puesto de trabajo. Ni siquiera eso. Porque todos estos contratos tienen una duración predefinida.

En conclusión, si un amigo A decide lanzarse a la empresa privada y dedicarse a desarrollar en Java, mientras que el otro amigo B hace un doctorado, al finalizar los cuatro años tendríamos que:

  • El amigo A estará cobrando el doble o el triple que B.
  • El amigo A tendrá un contrato indefinido. Podrá pedir una hipoteca para comprarse la casa. El amigo B estará en casa de sus padres, sin cobrar, esperando que el Estado Español resuelva las becas X que ya llevan unos meses de retraso. Si le sale bien, si no, llegará a un callejón sin salida.
  • El amigo A tiene la posibilidad de moverse a cualquier ciudad. Empresas que busquen programadores de Java hay a patadas. El amigo B sólo podrá ir a donde consiga financiación.

¿Esto puede parecer exagerado? ¿Tan “malo” es hacer un doctorado?

Pues como parte positiva decir que en un doctorado te especializas mucho en un campo muy muy concreto. Al 98% de las empresas le dará igual tu doctorado (probablemente ni sepas de qué estás hablando cuando le expliques la temática) pero si tienes suerte y una de esas empresas del 2% restante necesitan a alguien de tu campo… tendrías muchas posibilidades de conseguir el trabajo. Por supuesto, fuera de España.

Por lo tanto creo que hay una ENORME diferencia entre deberes y beneficios. Si a mi me dicen, sácate el doctorado y obtendrás una plaza en la universidad, yo no me saco un doctorado, me saco dos. Pero no me puedo quedar con:

  • Bueno, si dentro de algunos años sale alguna plaza… 
  • Bueno, si tienes suerte y te dan una beca Z…
  • Bueno…

No quiero dejar mi futuro en manos de probabilidades. Y que nadie se engañe, no quiero las cosas fáciles. Si sale una oposición sé que hay posibilidades de no sacarla. Pero sé que, si soy el mejor, tendré una plaza. Eso es lo que le pido al doctorado. Si voy a sacrificar 4 años de mi vida currando a muerte y ganando menos que el resto, exijo una recompensa acorde. Y eso, en España, no se da.

Material para otro post podría ser la poca importancia que se le da a la investigación en España. Pero ése, ya es otro tema.

Resumen

El doctorado lo hace gente que DISFRUTA con lo que hace. No lo hace para conseguir un objetivo u otro. Un buen profesor no da clases por un sueldo alto, lo hace porque le gusta. Así debería ser también para los directivos de los bancos. Buscar gente que disfrute dirigiendo bancos y no que vayan detrás de esos incentivos. Seguro que funcionarían mejor.

Sin embargo, yo disfruto más haciendo otras cosas que investigando. Prefiero dibujar, ver películas, hacer algo de deporte. Pequeñas cosas que me completan y me hacen ser la persona más feliz del mundo. Por eso creo que en mi camino no está el doctorarme. Seguiré buscando. Probando esto y aquello. Buscando el equilibrio perfecto entre trabajo y tiempo libre. Es difícil, lo sé, pero lucharé por ello. Porque creo que es posible.

Cambios

Mordor, originally uploaded by Ivan_Lopez.

Se avecinan cambios importantes en mi vida. Antes de empezar y, enlazando con el post anterior, decir que sí, que me matriculé en el máster y el miércoles lo terminaré.

Han sido nueve meses muy duros. En el que he tenido que trabajar muchísimo y sufrir el estrés. Trabajando por la mañana, en el máster por las tardes e investigando el resto del tiempo. Ha sido un año de sacrificio pero ha merecido la pena. Sin embargo, la crisis comienza a arreciar por el entorno universitario. Eso me empuja a buscar nuevos retos.

Los cambios asustan, sobre todo cuanto mayor te haces, suerte que mi espíritu sigue siendo travieso como el de un niño.

Me vuelvo a ir a Edimburgo por dos meses. ¿Y luego? Pues no está claro. Tendré que hacer como William Wallace y luchar por un trabajo digno con un salario digno. A veces creo que conseguirlo está más difícil que coronar el Everest 😉

En mis planes no incluía la opción de irme fuera, de convertirme en emigrante. Pero la vida es así y muchas veces hay que saber amoldarse y aprovechar las oportunidades. Ya lo decía Bruce Lee: “Be water my friend”.

Vuelvo a tener ante mí una encrucijada de caminos. Cada uno con sus pros y sus contras. Sabiendo que cualquiera de ellos puede cambiar mi vida para siempre. No tengo miedo. Vida sólo hay una y tenemos que ser capaces de sernos fieles a nosotros mismos y luchar por conseguir la felicidad.

Creo que a eso se refería William Wallace cuando escribió “Every man dies. Not every man really lives.”