Gå til innhold

Utnytte to kjernar i c++


Anbefalte innlegg

Videoannonse
Annonse

Du bruker OpenMP. Dette er innebygget i alle nyere compilere.

 

Dette gir deg en rekke #pragma preprocessor direktiver, som for eksempel

#pragma omp parallell for

Som gjør at en løkke kjøres over flere kjerner.

 

#pragma omp parallell for
for(int i = 0; i < 2; i++)
{
 DoSomethingAsync();
}

Endret av GeirGrusom
Lenke til kommentar

Takk for svar :new_woot:

Er dette noko eg må laste ned frå verdsveven (internett), eller skal det vere inkludert i dei fleste compilatorane? Kor gode resultat kan eg forvente å få? Blir hastigheten fordobla når eg køyrer alle lykkjer (hvis eg har dual core)?

Lenke til kommentar

Du må skaffe biblioteket. Hvor gode resultater du får er helt avhengig av oppgavens natur og din implementasjon, men forenklet kan den sies å være gitt av Amdalhs lov. I et praktisk ikke-trivielt program vil du nok aldri komme i nærheten av en fordobling.

Endret av jonnor
Lenke til kommentar
  • 4 uker senere...

Du må nok se langt etter en dobling av ytelse. Forbedringspotensialet er helt avhengig av hva som skal parallelliseres. Dersom du kan dele opp oppgavene i helt uavhengige deler, vil du ha størst utbytte. Dersom oppgavene som skal gjøres er lineære, vil du ha lite utbytte.

 

Et eksempel ved bruk av bil er alltid populært. Dersom du skal fylle bensin, er det lite å tjene på å være to stykker. Det er lite dere kan gjøre på samme tid. Men dersom du skal bytte dekk, vil det kunne lønne seg å være to. Da kan de ta hvert sitt hjul samtidig.

 

Så det du må se på er om du kan dele opp oppgavene som skal gjøres.

Lenke til kommentar
Et populært bibliotek for trådprogrammering er vel pthreads. Det er et C-bibliotek, men funker fint med C++ også. Vet ikke hvordan Win32 gjør det med threads, men du har win32-pthreads, så om du lærer pthreads vil koden din være veldig portabel.

 

Pthreads fungerer IKKE fint med C++. Alle C++-funksjoner som skal startes som en tråd må deklareres 'extern "C"' og kan ikke være klassemetoder.

 

Edit: Ser ut som om dette ikke stemmer helt fortsatt, men det er fortsatt ikke rett frem å bruke pthreads med C++. Skal en bruke threads i C++ er Boost::Thread å anbefale (eller vente på C++0x).

Endret av jurg
Lenke til kommentar
Et populært bibliotek for trådprogrammering er vel pthreads. Det er et C-bibliotek, men funker fint med C++ også. Vet ikke hvordan Win32 gjør det med threads, men du har win32-pthreads, så om du lærer pthreads vil koden din være veldig portabel.

 

Pthreads fungerer IKKE fint med C++. Alle C++-funksjoner som skal startes som en tråd må deklareres 'extern "C"' og kan ikke være klassemetoder.

 

Edit: Ser ut som om dette ikke stemmer helt fortsatt, men det er fortsatt ikke rett frem å bruke pthreads med C++. Skal en bruke threads i C++ er Boost::Thread å anbefale (eller vente på C++0x).

 

K, my bad. Har ikke brukt pthreads i C++ enda. :p

Lenke til kommentar
  • 3 uker senere...
  • 1 måned senere...

Mange gode tips her som du bør se nærmere på. Er spørsmålet ditt så snevert som du stiller det eller er du ute etter å lære parallell programmering?

 

Hvorfor stoppe på kjerner? Du kan også se på OpenCL/CUDA for å utnytte alle "kjernene" som du har i grafikkortet ditt.

 

Eller hvorfor ikke lære seg å skrive programmer som kan kjøres på flere maskiner? Da kan det være nyttiog å lære seg litt om MPI.

 

Husk en ting er å skrive parallelle programmer, en annen ting er å debugge dem....

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...