O 13 de maio publicouse GCC 4.2, a nova rama estable da colección de compiladores de GNU. A novidade máis destacada desta nova versión é a inclusión de GOMP, unha implementación de OpenMP desenvolvida polo proxecto GNU.

OpenMP é unha interface de programación de aplicación, para as linguaxes de programación C, C++ e Fortram, que permite que código que se executa linealmente se poida executar en paralelo. Dito de outra forma, facilita o código se execute por distintas liñas de execución cun esforzo mínimo. Para conseguir isto, só se requiren pequenos cambios ó código orixintal. As características máis destacadas de OpenMP son:

  1. Pódese usar OpenMP con moitos compiladores e en varias plataformas distintas.
  2. O compilador encárgase da xestión das liñas de execución de forma transparente.
  3. O código inicial só precisa dunhas pequenas modificacións.
  4. Pódese elexir entre executar o código final linealmente ou en paralelo.

OpenMP parece a panacea para o programador. Pero, desconfiado e curioso como son o primeiro que me plantexei foi proba-la auténtica facilidade da API de OpenMP e a súa eficenza comparada coa programación a man de liñas de execución mediante o uso de POSIX threads (pthreads).

Definición das probas

OpenMP permite paralelizar código de dúas formas:

  1. Executar fragmentos de código por distintas liñas de execución.
  2. Executar unha iteración dun for por distintas liñas de execución.

Para face-la proba obtei pola segunda posibilidade porque me permitía un código máis compacto. Deseñei dous programas de proba. Cada programa consiste na execución dun número determinado de iteracións sobre un for interior que se executa un número de veces suficiente como para poder medir o tempo de execución. Estes programas de proba son:

  1. work que executaría un for no que só se modifica unha sección de memoria compartida unha vez por cada iteración.
  2. memory que executaría un for no que se modifica unha sección de memoria moitas veces por cada iteración.

O código fonte das probas pódese atopar no meu ftp.

Facilidade de uso

A primeira parte da proba consistía en comprobar a facilidade de uso de OpenMP usando gcc-4.2.

Partindo da versión lineal dos programas, só fixeron falla engadir dúas liñas (que podían ser só unha) de código extra para que o código estivese preparado para ser compilado usando OpenMP.

Para compilar o código (work.c e memory.c) usando OpenMP só hai que pasarlle o parámetro -fopenmp a gcc:

gcc-4.2 -Wall -fopenmp -o work_thread work.c
gcc-4.2 -Wall -fopenmp -o memory_thread memory.c

Se compilamos o código sen o parámetro -fopenmp, obtemos un executable idéntico ó obtido polo código sen engadir as liñas precisas para usar OpenMP.

Por tanto, a facilidade de uso quedeu plenamente demostrada.

Rendemento

A segunda parte da proba, e a máis interesante, consistía en comparar o rendemento do código xenerado ó usar OpenMP cunha versión modificada dos programas usando pthreads.

Para iguala-lo funcionamento da versión que usa OpenMP e a que usa pthreads, estableceuse o mesmo número de liñas de execución nas dúas versións: unha liña de execución por iteración do bucle. OpenMP permite o lanzamento das liñas de execución que especifiquemos ou un número por defecto que é dependente da implementación (gcc-4.2 parece que lanza 1 liña de execución por CPU, co que o rendemente é óptimo).

Para medi-lo rendimento comprobouse o tempo que tardou en se executar cada un dos programas usando time (1). Nas gráficas vense dous dos valores que devolve time:

  1. real é o tempo que tarda o programa en se executar.
  2. user é o tempo que estivo usando a CPU o programa.

Os datos nas gráficas son relativos ó tempo que precisou o código lineal.

En sistemas cunha única CPU, user é menor ou igual que real, pero en sistemas con máis dunha CPU, se o programa emprega varias liñas de execución, user pode ser maior que real. Por tanto, un valor de user maior que real confirma a execución de varias liñas de execución por parte de OpenMP.

Gráfica work

Nesta gráfica pódese ver que o rendimento de OpenMP en work é moi similar ó rendimento de pthreads, aínda que empregando máis CPU.

Gráfica memory

Nesta gráfica pódese ver que o rendimento de OpenMP en memory é preocupante. OpenMP, a pesares de usar moita CPU, consegue un tempo moi semellante á execución lineal. É dicir, non hai gañancia ó usar OpenMP. pthreads pola contra mantén o mesmo factor de melloría que en work.

Por tanto, o rendemento comparado coa execución lineal queda demostrada aínda que é inferior ó uso de pthreads.

Conclusións

OpenMP sae moi ben parado se comparamos o esforzo que require o seu emprego con respeto ó beneficio que se obtén do seu uso. Por exemplo, o uso de pthreads require do rediseño de case que todo o código.

O lado negativo é que ten problemas coa xestión de memoria compartida.

En definitiva, é moi interesante poder usar OpenMP, pero máis interesante aínda é saber cando o poder usar. É moi recomendable saber como funcionan as liñas de execución ó empregar OpenMP, porque se sabemos como se traballa a baixo nivel, sabemos cando o código permite o uso de fíos tal e como está ou como o modificar para que permita o seu uso.

Queda pendente a realización dun pequeno titorial sobre como usar OpenMP nunha futura anotación.


Grazas a Néstor García Freire por me deixar face-las probas no seu ordenador 🙂


5 Responses to “Primeira ollada a OpenMP”

  1. 1 Ramom

    Pois qué coincidencia, aínda estiven probando eu o outro día isto do openMP. Quedoume boa impresión del, tereino que probar máis a fondo para ver as cousas serias, víñame ben ese futuro titorial sobre o seu uso 🙂

    Saúdos

  2. 2 Xosé Otero

    Espero atopar un dentro dun par de semanas para face-lo titorial.

  3. 3 Felipe Albrecht

    Olá!

    Eu uso o MPI, e tem algumas coisas nele que deixam a desejar…
    Hoje estava vendo o OpenMP, ele trabalha como abstração de memória compartilhada?
    Creio que isto que causa um aumento de overhead.

    Outra questão, qual é a sua língua? Lembra muito o português que eu escrevo aqui com casteliano. Desculpe me pela pergunta, mas estou curioso!

    []’s

  4. 4 Felipe Albrecht

    Opa, eu de novo.

    Agora que vi sobre o “pontogal.org”, então é o galego da catalunha?
    Muito legal conhecer isto.
    Abraço!

  5. 5 Xosé Otero

    Ola Felipe.

    Efectifamente, OpenMP usa memoria compartida (cona! unha diferenza entre o galego e o portugués! :D). Non teño coñecementos sobre OpenMP dabondos para falar con autoridade, só me podo basar nos datos obtidos nos dous exemplos que fixen.

    Se miras a gráfica de “memory” verás que a diferenza de uso de CPU entre OpenMP e pthreads dispárase (60%). A diferenza entre “memory” e “work”, onde o resultado é máis prometedor, é que en “memory” cada fío está modificando unha rexión memoria continuamente (rexión de memoria que non usa ningún outro fío).

    Este incremento non sei se se debe a problemas coa caché ou a algún tipo de lock entre fíos cada vez que se modifica a memoria. Sinto non ser de máis axuda.


Categories

Calendario

Maio 2007
M T W T F S S
« Abr   Xuñ »
 123456
78910111213
14151617181920
21222324252627
28293031  
3K2 theme by Hakan Aydin