Comment detail

ワーカスレッドを安全に終了させるまで待機 (Nested Flatten)
C / OpenMP で。
Fortran 版とほぼ同じ。
19行でスレッド8本を生成、
23行で空きスレッドに仕事を割り当て、
28行でスレッド終了待ち

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <omp.h>

void random_wait(int i) {
  int w;
  w=rand() % 10;
  fprintf(stderr,"begin %d - %d sec, thread %d/%d\n",i,w,
      omp_get_thread_num(), omp_get_num_threads());
  sleep(w);
  fprintf(stderr,"end   %d - %d sec, thread %d/%d\n",i,w,
      omp_get_thread_num(), omp_get_num_threads());
}

int main(int argc, char **argv) {
  fprintf(stderr,"Single Thread\n");
  sleep(4);
#pragma omp parallel num_threads(8)
  {
    int i;
    fprintf(stderr,"Multi Thread %d\n",omp_get_thread_num());
#pragma omp for schedule(dynamic) nowait
    for(i=0;i<20;i++) {
      random_wait(i);
    }
    fprintf(stderr,"finish %d\n",omp_get_thread_num());
#pragma omp barrier
#pragma omp master
    {
      fprintf(stderr,"Finish\n");
    }
  }
}
しまった、8行目の前に rand 関数再入防止の
#pragma omp critical
が要りますね...
rand_r() を使う手もありますが。
# そもそも rand を使うなという話もある。

Index

Feed

Other

Link

Pathtraq

loading...