Cum se convertesc secțiunile OpenMP la furcă ()

Sunt nou la forumuri și aș dori să întreb cum să se exprime ceva de genul:

while(imhappy())
{
 #pragma omp sections
 {
  #pragma omp section
  {
   dothis();
  }
  #pragma omp section
  {
   dothat();
  }
 }
}

într-o construcție echivalentă folosind furca() sau vfork ()? Multumesc anticipat!

PS: Am inclus în timp ce în jurul secțiunilor în cazul în care este ceva mai inteligent pentru a fork înainte de a intra în buclă din cauza unei clonări a resurselor.

0

2 răspunsuri

OpenMP face o mulțime de alte lucruri în spatele scenei decât simpla pornire a firelor. Distribuie, de asemenea, segmente de cod și sincronizează diferitele fire. Ați etichetat întrebarea dvs. ca pthreads , deși vi se solicită implementarea cu fork() care este confuză. În Linux fork() este foarte greu, deoarece creează noi procese și mai degrabă clone() este folosit pentru a crea fire.

Cu toate acestea, echivalentul dur al unei construcții de secțiuni OpenMP cu două fire ar fi la furculiță, după care trebuie să urmeze o construcție if și procesul principal va executa calea dothis() în timp ce copilul va executa calea dothat() . Valoarea returnată de la fork() este diferită în procesele părinte și în copil și poate fi utilizată pentru a lua decizia pentru sucursală. Procesul părinte va aștepta apoi ca copilul să termine cu waitpid() care va fi analog cu sincronizarea implicită a barierei la sfârșitul regiunii sections omp .

Cu toate acestea, o singură atenție - fork() este implementată utilizând pagini COW (copy-on-write). Ceea ce înseamnă că, deși la început conținutul de memorie al copilului este egal cu conținutul memoriei părintelui, orice schimbare făcută este privată - copilul nu va vedea ce modifică părintele în propria memorie și invers. Memoria trebuie să fie partajată în mod explicit între cele două utilizând primitivi de memorie partajată SysV sau mapări de fișiere partajate.

S-ar putea să doriți cu adevărat să utilizați API-urile cu fire POSIX în schimb.

vfork() is a syscall designed for completely different purpose and is not suitable for process cloning at all.

0
adăugat
Deci, ținând seama de temeiuri, ar deveni jist: pthread_create (& tid1,0, dothis, 0); pthread_create (& tid2,0, dothat, 0); pthread_join (tid1,0); pthread_join (tid2,0); ? acest lucru ar fi vrut să fie mult mai ușor, și dacă văd acest lucru corect am memorie partajată în mod implicit? Mulțumesc că ar putea fi mai ușor de furculiță!
adăugat autor litro, sursa
Nu trebuie să sunați de două ori pe pthread_create - aveți deja celălalt fir :)
adăugat autor Hristo Iliev, sursa

Nu cred că există o simulare simplă a secțiunilor care utilizează furculița. Cu toate acestea, puteți să o simulați teoretic utilizând un mecanism de trecere a mesajelor în care variabilele partajate sunt păstrate cu o mașină rădăcină. Toate flush-urile openMP se vor întâmpla folosind root-ul. (Rețineți că openMP folosește un model de consistență mai slab decât slab).

0
adăugat