HTML

flugi szakblogja

Megjegyzések programozásról, jelfeldolgozásról, beszédtechnológiáról

Friss topikok

  • LoverCase: kösz! (2012.03.23. 20:41) rekurzív szálszaporítás gyorsít?
  • tormanator: Mért érték, CPU 200 Mflopp, GPU 11 Gflopp , ez 55x sebesség, de középkategóriánál mért értékek. Az... (2011.09.11. 11:27) OpenCL
  • Tom Benko: @flugi_: Ebből is látszik, hogy a sudo a legveszélyesebb parancs. (2011.03.10. 20:09) Az egyszerűség dícsérete
  • xsasha: Kíváncsi vagyok, mi lesz a véleményed erről a beírásról. :-) Szóval az én elméletem szerint az ag... (2011.02.28. 17:30) Programozás és intuitivitás

OpenMP és MINGW

2008.05.23. 09:09 flugi_

Szép párosnak ígérkezik. Az OpenMP egy párhuzamos programozási eszköz, nagyon finoman oldja meg a platformfüggetlenül párhuzamos vezérlést, egyetlen komoly baja, hogy üzenetalapon hatékony architektúrákon nem az igazi, dehát a mai sokmagos procik nem is ilyenek. A MINGW a GNU ingyenes fordítója Windowsra.

A GCC a 4.2 verzió óta tudja az OpenMP-t. Engem ez meglepett, mert az OpenMP #pragmákkal működik, és az utolsó tapasztalatom szerint a GCC nem szereti a pragmákat. Tényleg fura, hogy valamit teljesen a fordítóra bíznak, ki hogy akarja csinálni, de úgy tűnik az évek alatt hozzászoktak a gondolathoz. Mindenesetre azt mondják, hogy a GCC platformfüggetlenségéhez jól passzol az OpenMP. Ez pedig jogos.

Mármost, mint friss kétmagos processzor tulajdonos, viszketett a markom, hogy csak ki kéne próbálni a párhuzamosságot ezzel a cuccal. Korábban játszottam párhuzamos programozással PVM-ben egyetemi beadandók erejéig, meg SDL féle szálakkal, de az OpenMP eleganciája lenyűgözött, úgyhogy most ezzel kell.

Na most ez nem sétagalopp. A legfrissebb hivatalos MINGW-ben jelenleg a 4.1.2-es GCC van, amiben még nincs OpenMP. Úgyhogy le kellett rántani a alpha tesztes 4.3-asat. A friss hivatalos MINGW-t szépen lemásoltam, és az 4.3-assal amit lehetett, felülírtam.

Jött a parancs, hogy
C:\gcc430a\bin\g++.exe -fopenmp  main.cppDe ez fordítási hibával leállt:
c:/gcc430a/bin/../lib/gcc/mingw32/4.3.0/libgomp.a(parallel.o): (.text+0xe): undefined reference to `_imp__pthread_getspecific'
...
A hiba lényege, hogy nem csatolt kellőképpen libeket egy rosszul beállított .spec miatt.

A hibát okozó file:
lib\gcc\mingw32\4.3.0\libgomp.spec
A tartalma helyesen (érdekes módon egy francia oldalon találtam rá, most már francia mellett magyarul is fent van a neten:D) :
# This spec file is read by gcc when linking.  It is used to specify the
# standard libraries we need in order to link with -fopenmp.
*link_gomp: -lgomp -lpthread

És így már megy is.
Itt egy tesztprogram, hogy meg lehessen nézni, hogy működik-e:

/****************************************************************
* FILE: omp_hello.c
* DESCRIPTION:
*   OpenMP Example - Hello World - C/C++ Version
*   In this simple example, the master thread forks a parallel region.
*   All threads in the team obtain their unique thread number and print it.
*   The master thread only prints the total number of threads.  Two OpenMP
*   library routines are used to obtain the number of threads and each
*   thread's number.
* AUTHOR: Blaise Barney  5/99
* LAST REVISED: 04/06/05
****************************************************************/
#include <omp.h>
#include <stdio.h>
#include <stdlib.h>

#include <cmath>

int main (int argc, char *argv[]) {

int nthreads, tid;

/* Fork a team of threads giving them their own copies of variables */
#pragma omp parallel private(nthreads, tid)
  {

  /* Obtain thread number */
  tid = omp_get_thread_num();
  printf("Hello World from thread = %d\n", tid);

  /* Only master thread does this */
  if (tid == 0)
    {
    nthreads = omp_get_num_threads();
    printf("Number of threads = %d\n", nthreads);
    }
   
  //everybody work for a while 
  double d;
  for (int i=0;i<1000000000;i++) {
    d += sqrt(i);
    if (i%100000000==0) printf("(%d %d) ",i/100000000,tid);
  }

  }  /* All threads join master thread and disband */

}
Magyarázat: A hivatalos példaprogramot kicsit átalakítottam, hogy meg lehessen nézni két dolgot. Az egyik, hogy mindkét procit láthatóan terheli-e (igen), a másik, hogy a párhuzamos blokkokban deklarált változók szál-privátak-e. Az int i a blokkban jól működik, amire bizonyíték, hogy mindkét szál (kétmagoson) mind a 10 alkalommal kiírja az értékét. Ha a két szál ugyanazt a változót használná, ennek a valószínűsége ilyen körülmények között igen alacsony.

Úgy érzem, hamarosan felturbózom a neuronháló tanító programot párhuzamosra! :)

Szólj hozzá!

A bejegyzés trackback címe:

https://flugiszaki.blog.hu/api/trackback/id/tr58483488

Kommentek:

A hozzászólások a vonatkozó jogszabályok  értelmében felhasználói tartalomnak minősülnek, értük a szolgáltatás technikai  üzemeltetője semmilyen felelősséget nem vállal, azokat nem ellenőrzi. Kifogás esetén forduljon a blog szerkesztőjéhez. Részletek a  Felhasználási feltételekben és az adatvédelmi tájékoztatóban.

Nincsenek hozzászólások.
süti beállítások módosítása