]>
git.ipfire.org Git - thirdparty/gcc.git/blob - libgomp/testsuite/libgomp.c/affinity-1.c
2 Copyright (C) 2013-2016 Free Software Foundation, Inc.
4 GCC is free software; you can redistribute it and/or modify it under
5 the terms of the GNU General Public License as published by the Free
6 Software Foundation; either version 3, or (at your option) any later
9 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
10 WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 You should have received a copy of the GNU General Public License
15 along with GCC; see the file COPYING3. If not see
16 <http://www.gnu.org/licenses/>. */
19 /* { dg-set-target-env-var OMP_PROC_BIND "false" } */
20 /* { dg-additional-options "-DINTERPOSE_GETAFFINITY -DDO_FORK -ldl" { target *-*-linux* } } */
36 #ifdef HAVE_PTHREAD_AFFINITY_NP
39 #ifdef INTERPOSE_GETAFFINITY
52 struct place places
[8];
54 { "", 1, { { -1, -1 } } },
56 { { 0, 1 }, { 1, 1 }, { 2, 1 }, { 3, 1 },
57 { 4, 1 }, { 5, 1 }, { 6, 1 }, { 7, 1 } } },
58 { "{7,6}:2:-3", 2, { { 6, 2 }, { 3, 2 } } },
59 { "{6,7}:4:-2,!{2,3}", 3, { { 6, 2 }, { 4, 2 }, { 0, 2 } } },
61 { { 1, 1 }, { 2, 1 }, { 3, 1 },
62 { 4, 1 }, { 5, 1 }, { 6, 1 }, { 7, 1 } } },
63 { "{0,1},{3,2,4},{6,5,!6},{6},{7:2:-1,!6}", 5,
64 { { 0, 2 }, { 2, 3 }, { 5, 1 }, { 6, 1 }, { 7, 1 } } }
67 unsigned long contig_cpucount
;
68 unsigned long min_cpusetsize
;
70 #if defined (HAVE_PTHREAD_AFFINITY_NP) && defined (_SC_NPROCESSORS_CONF) \
71 && defined (CPU_ALLOC_SIZE)
73 #if defined (RTLD_NEXT) && defined (INTERPOSE_GETAFFINITY)
74 int (*orig_getaffinity_np
) (pthread_t
, size_t, cpu_set_t
*);
77 pthread_getaffinity_np (pthread_t thread
, size_t cpusetsize
, cpu_set_t
*cpuset
)
81 if (orig_getaffinity_np
== NULL
)
83 orig_getaffinity_np
= (int (*) (pthread_t
, size_t, cpu_set_t
*))
84 dlsym (RTLD_NEXT
, "pthread_getaffinity_np");
85 if (orig_getaffinity_np
== NULL
)
88 ret
= orig_getaffinity_np (thread
, cpusetsize
, cpuset
);
91 if (contig_cpucount
== 0)
94 for (i
= 0; i
< max
; i
++)
95 if (!CPU_ISSET_S (i
, cpusetsize
, cpuset
))
98 min_cpusetsize
= cpusetsize
;
105 print_affinity (struct place p
)
107 static unsigned long size
;
111 size
= min_cpusetsize
;
114 size
= sysconf (_SC_NPROCESSORS_CONF
);
115 size
= CPU_ALLOC_SIZE (size
);
116 if (size
< sizeof (cpu_set_t
))
117 size
= sizeof (cpu_set_t
);
120 cpu_set_t
*cpusetp
= (cpu_set_t
*) __builtin_alloca (size
);
121 if (pthread_getaffinity_np (pthread_self (), size
, cpusetp
) == 0)
123 unsigned long i
, len
, max
= 8 * size
;
124 int notfirst
= 0, unexpected
= 1;
126 printf (" bound to {");
127 for (i
= 0, len
= 0; i
< max
; i
++)
128 if (CPU_ISSET_S (i
, size
, cpusetp
))
137 else if (i
== (unsigned long) p
.start
)
146 if (len
&& len
!= (unsigned long) p
.len
)
149 printf (":%lu", len
);
152 if (len
&& len
!= (unsigned long) p
.len
)
155 printf (":%lu", len
);
157 if (p
.start
!= -1 && unexpected
)
159 printf (", expected {%d", p
.start
);
161 printf (":%d", p
.len
);
162 printf ("} instead");
164 else if (p
.start
!= -1)
165 printf (", verified");
170 print_affinity (struct place p
)
181 char *env_proc_bind
= getenv ("OMP_PROC_BIND");
182 int test_false
= env_proc_bind
&& strcmp (env_proc_bind
, "false") == 0;
183 int test_true
= env_proc_bind
&& strcmp (env_proc_bind
, "true") == 0;
184 int test_spread_master_close
185 = env_proc_bind
&& strcmp (env_proc_bind
, "spread,master,close") == 0;
186 char *env_places
= getenv ("OMP_PLACES");
190 if (env_places
== NULL
&& contig_cpucount
>= 8 && test_false
191 && getenv ("GOMP_AFFINITY") == NULL
)
195 for (j
= 0; j
< 2; j
++)
197 if (setenv ("OMP_PROC_BIND", j
? "spread,master,close" : "true", 1)
200 for (i
= sizeof (places_array
) / sizeof (places_array
[0]) - 1;
203 if (setenv ("OMP_PLACES", places_array
[i
].name
, 1) < 0)
210 execl ("/proc/self/exe", "affinity-1.exe", NULL
);
213 if (waitpid (pid
, &status
, 0) < 0)
215 if (WIFSIGNALED (status
) && WTERMSIG (status
) == SIGABRT
)
217 else if (!WIFEXITED (status
) || WEXITSTATUS (status
) != 0)
229 printf ("OMP_PROC_BIND='%s'", env_proc_bind
);
233 printf ("%sOMP_PLACES='%s'", first
? "" : " ", env_places
);
236 if (env_places
&& contig_cpucount
>= 8
237 && (test_true
|| test_spread_master_close
))
239 for (test_places
= sizeof (places_array
) / sizeof (places_array
[0]) - 1;
240 test_places
; --test_places
)
241 if (strcmp (env_places
, places_array
[test_places
].name
) == 0)
245 #define verify(if_true, if_s_m_c) \
246 if (test_false && omp_get_proc_bind () != omp_proc_bind_false) \
248 if (test_true && omp_get_proc_bind () != if_true) \
250 if (test_spread_master_close && omp_get_proc_bind () != if_s_m_c) \
253 verify (omp_proc_bind_true
, omp_proc_bind_spread
);
255 printf ("Initial thread");
256 print_affinity (places_array
[test_places
].places
[0]);
261 #pragma omp parallel if (0)
263 verify (omp_proc_bind_true
, omp_proc_bind_master
);
264 #pragma omp parallel if (0)
266 verify (omp_proc_bind_true
, omp_proc_bind_close
);
267 #pragma omp parallel if (0)
269 verify (omp_proc_bind_true
, omp_proc_bind_close
);
271 #pragma omp parallel if (0) proc_bind (spread)
273 verify (omp_proc_bind_spread
, omp_proc_bind_spread
);
276 #pragma omp parallel if (0) proc_bind (master)
278 verify (omp_proc_bind_master
, omp_proc_bind_close
);
279 #pragma omp parallel if (0)
281 verify (omp_proc_bind_master
, omp_proc_bind_close
);
283 #pragma omp parallel if (0) proc_bind (spread)
285 verify (omp_proc_bind_spread
, omp_proc_bind_spread
);
291 #pragma omp parallel num_threads (4)
293 verify (omp_proc_bind_true
, omp_proc_bind_master
);
296 struct place p
= places_array
[0].places
[0];
297 int thr
= omp_get_thread_num ();
298 printf ("#1 thread %d", thr
);
299 if (omp_get_num_threads () == 4 && test_spread_master_close
)
300 switch (places_array
[test_places
].count
)
303 /* T = 4, P = 8, each subpartition has 2 places. */
305 /* T = 4, P = 7, each subpartition has 2 places, but
306 last partition, which has just one place. */
307 p
= places_array
[test_places
].places
[2 * thr
];
310 /* T = 4, P = 5, first subpartition has 2 places, the
312 p
= places_array
[test_places
].places
[thr
? 1 + thr
: 0];
315 /* T = 4, P = 3, unit sized subpartitions, first gets
316 thr0 and thr3, second thr1, third thr2. */
317 p
= places_array
[test_places
].places
[thr
== 3 ? 0 : thr
];
320 /* T = 4, P = 2, unit sized subpartitions, each with
322 p
= places_array
[test_places
].places
[thr
/ 2];
329 if (omp_get_thread_num () == 3)
331 /* True/spread, true/master. */
332 #pragma omp parallel num_threads (3)
334 verify (omp_proc_bind_true
, omp_proc_bind_close
);
337 struct place p
= places_array
[0].places
[0];
338 int thr
= omp_get_thread_num ();
339 printf ("#1,#1 thread 3,%d", thr
);
340 if (omp_get_num_threads () == 3 && test_spread_master_close
)
341 /* Outer is spread, inner master, so just bind to the
342 place or the master thread, which is thr 3 above. */
343 switch (places_array
[test_places
].count
)
347 p
= places_array
[test_places
].places
[6];
350 p
= places_array
[test_places
].places
[4];
353 p
= places_array
[test_places
].places
[0];
356 p
= places_array
[test_places
].places
[1];
363 /* True/spread, spread. */
364 #pragma omp parallel num_threads (5) proc_bind (spread)
366 verify (omp_proc_bind_spread
, omp_proc_bind_close
);
369 struct place p
= places_array
[0].places
[0];
370 int thr
= omp_get_thread_num ();
371 printf ("#1,#2 thread 3,%d", thr
);
372 if (omp_get_num_threads () == 5 && test_spread_master_close
)
373 /* Outer is spread, inner spread. */
374 switch (places_array
[test_places
].count
)
377 /* T = 5, P = 2, unit sized subpartitions. */
378 p
= places_array
[test_places
].places
[thr
== 4 ? 6
381 /* The rest are T = 5, P = 1. */
383 p
= places_array
[test_places
].places
[6];
386 p
= places_array
[test_places
].places
[4];
389 p
= places_array
[test_places
].places
[0];
392 p
= places_array
[test_places
].places
[1];
399 if (omp_get_thread_num () == 3)
401 /* True/spread, spread, close. */
402 #pragma omp parallel num_threads (5) proc_bind (close)
404 verify (omp_proc_bind_close
, omp_proc_bind_close
);
407 struct place p
= places_array
[0].places
[0];
408 int thr
= omp_get_thread_num ();
409 printf ("#1,#2,#1 thread 3,3,%d", thr
);
410 if (omp_get_num_threads () == 5 && test_spread_master_close
)
411 /* Outer is spread, inner spread, innermost close. */
412 switch (places_array
[test_places
].count
)
414 /* All are T = 5, P = 1. */
416 p
= places_array
[test_places
].places
[7];
419 p
= places_array
[test_places
].places
[6];
422 p
= places_array
[test_places
].places
[4];
425 p
= places_array
[test_places
].places
[0];
428 p
= places_array
[test_places
].places
[1];
437 /* True/spread, master. */
438 #pragma omp parallel num_threads (4) proc_bind(master)
440 verify (omp_proc_bind_master
, omp_proc_bind_close
);
443 struct place p
= places_array
[0].places
[0];
444 int thr
= omp_get_thread_num ();
445 printf ("#1,#3 thread 3,%d", thr
);
446 if (omp_get_num_threads () == 4 && test_spread_master_close
)
447 /* Outer is spread, inner master, so just bind to the
448 place or the master thread, which is thr 3 above. */
449 switch (places_array
[test_places
].count
)
453 p
= places_array
[test_places
].places
[6];
456 p
= places_array
[test_places
].places
[4];
459 p
= places_array
[test_places
].places
[0];
462 p
= places_array
[test_places
].places
[1];
469 /* True/spread, close. */
470 #pragma omp parallel num_threads (6) proc_bind (close)
472 verify (omp_proc_bind_close
, omp_proc_bind_close
);
475 struct place p
= places_array
[0].places
[0];
476 int thr
= omp_get_thread_num ();
477 printf ("#1,#4 thread 3,%d", thr
);
478 if (omp_get_num_threads () == 6 && test_spread_master_close
)
479 /* Outer is spread, inner close. */
480 switch (places_array
[test_places
].count
)
483 /* T = 6, P = 2, unit sized subpartitions. */
484 p
= places_array
[test_places
].places
[6 + thr
/ 3];
486 /* The rest are T = 6, P = 1. */
488 p
= places_array
[test_places
].places
[6];
491 p
= places_array
[test_places
].places
[4];
494 p
= places_array
[test_places
].places
[0];
497 p
= places_array
[test_places
].places
[1];
508 #pragma omp parallel num_threads (5) proc_bind(spread)
510 verify (omp_proc_bind_spread
, omp_proc_bind_master
);
513 struct place p
= places_array
[0].places
[0];
514 int thr
= omp_get_thread_num ();
515 printf ("#2 thread %d", thr
);
516 if (omp_get_num_threads () == 5
517 && (test_spread_master_close
|| test_true
))
518 switch (places_array
[test_places
].count
)
521 /* T = 5, P = 8, first 3 subpartitions have 2 places, last
523 p
= places_array
[test_places
].places
[thr
< 3 ? 2 * thr
: 3 + thr
];
526 /* T = 5, P = 7, first 2 subpartitions have 2 places, last
528 p
= places_array
[test_places
].places
[thr
< 2 ? 2 * thr
: 2 + thr
];
531 /* T = 5, P = 5, unit sized subpartitions, each one with one
533 p
= places_array
[test_places
].places
[thr
];
536 /* T = 5, P = 3, unit sized subpartitions, first gets
537 thr0 and thr3, second thr1 and thr4, third thr2. */
538 p
= places_array
[test_places
].places
[thr
>= 3 ? thr
- 3 : thr
];
541 /* T = 5, P = 2, unit sized subpartitions, first with
542 thr{0,1,4} and second with thr{2,3}. */
543 p
= places_array
[test_places
].places
[thr
== 4 ? 0 : thr
/ 2];
550 if (omp_get_thread_num () == 3)
553 switch (places_array
[test_places
].count
)
555 case 8: pp
= 6; break;
556 case 7: pp
= 5; break;
557 case 5: pp
= 3; break;
558 case 2: pp
= 1; break;
560 /* Spread, spread/master. */
561 #pragma omp parallel num_threads (3) firstprivate (pp)
563 verify (omp_proc_bind_spread
, omp_proc_bind_close
);
566 struct place p
= places_array
[0].places
[0];
567 int thr
= omp_get_thread_num ();
568 printf ("#2,#1 thread 3,%d", thr
);
569 if (test_spread_master_close
|| test_true
)
570 /* Outer is spread, inner spread resp. master, bit we have
571 just unit sized partitions. */
572 p
= places_array
[test_places
].places
[pp
];
577 /* Spread, spread. */
578 #pragma omp parallel num_threads (5) proc_bind (spread) \
581 verify (omp_proc_bind_spread
, omp_proc_bind_close
);
584 struct place p
= places_array
[0].places
[0];
585 int thr
= omp_get_thread_num ();
586 printf ("#2,#2 thread 3,%d", thr
);
587 if (test_spread_master_close
|| test_true
)
588 /* Outer is spread, inner spread, bit we have
589 just unit sized partitions. */
590 p
= places_array
[test_places
].places
[pp
];
595 /* Spread, master. */
596 #pragma omp parallel num_threads (4) proc_bind(master) \
599 verify (omp_proc_bind_master
, omp_proc_bind_close
);
602 struct place p
= places_array
[0].places
[0];
603 int thr
= omp_get_thread_num ();
604 printf ("#2,#3 thread 3,%d", thr
);
605 if (test_spread_master_close
|| test_true
)
606 /* Outer is spread, inner master, bit we have
607 just unit sized partitions. */
608 p
= places_array
[test_places
].places
[pp
];
614 #pragma omp parallel num_threads (6) proc_bind (close) \
617 verify (omp_proc_bind_close
, omp_proc_bind_close
);
620 struct place p
= places_array
[0].places
[0];
621 int thr
= omp_get_thread_num ();
622 printf ("#2,#4 thread 3,%d", thr
);
623 if (test_spread_master_close
|| test_true
)
624 /* Outer is spread, inner close, bit we have
625 just unit sized partitions. */
626 p
= places_array
[test_places
].places
[pp
];
635 #pragma omp parallel num_threads (3) proc_bind(master)
637 verify (omp_proc_bind_master
, omp_proc_bind_master
);
640 struct place p
= places_array
[0].places
[0];
641 int thr
= omp_get_thread_num ();
642 printf ("#3 thread %d", thr
);
643 if (test_spread_master_close
|| test_true
)
644 p
= places_array
[test_places
].places
[0];
649 if (omp_get_thread_num () == 2)
651 /* Master, master. */
652 #pragma omp parallel num_threads (4)
654 verify (omp_proc_bind_master
, omp_proc_bind_close
);
657 struct place p
= places_array
[0].places
[0];
658 int thr
= omp_get_thread_num ();
659 printf ("#3,#1 thread 2,%d", thr
);
660 if (test_spread_master_close
|| test_true
)
661 /* Outer is master, inner is master. */
662 p
= places_array
[test_places
].places
[0];
667 /* Master, spread. */
668 #pragma omp parallel num_threads (4) proc_bind (spread)
670 verify (omp_proc_bind_spread
, omp_proc_bind_close
);
673 struct place p
= places_array
[0].places
[0];
674 int thr
= omp_get_thread_num ();
675 printf ("#3,#2 thread 2,%d", thr
);
676 if (omp_get_num_threads () == 4
677 && (test_spread_master_close
|| test_true
))
678 /* Outer is master, inner is spread. */
679 switch (places_array
[test_places
].count
)
682 /* T = 4, P = 8, each subpartition has 2 places. */
684 /* T = 4, P = 7, each subpartition has 2 places, but
685 last partition, which has just one place. */
686 p
= places_array
[test_places
].places
[2 * thr
];
689 /* T = 4, P = 5, first subpartition has 2 places, the
691 p
= places_array
[test_places
].places
[thr
? 1 + thr
: 0];
694 /* T = 4, P = 3, unit sized subpartitions, first gets
695 thr0 and thr3, second thr1, third thr2. */
696 p
= places_array
[test_places
].places
[thr
== 3 ? 0 : thr
];
699 /* T = 4, P = 2, unit sized subpartitions, each with
701 p
= places_array
[test_places
].places
[thr
/ 2];
708 if (omp_get_thread_num () == 0)
710 /* Master, spread, close. */
711 #pragma omp parallel num_threads (5) proc_bind (close)
713 verify (omp_proc_bind_close
, omp_proc_bind_close
);
716 struct place p
= places_array
[0].places
[0];
717 int thr
= omp_get_thread_num ();
718 printf ("#3,#2,#1 thread 2,0,%d", thr
);
719 if (omp_get_num_threads () == 5
720 && (test_spread_master_close
|| test_true
))
721 /* Outer is master, inner spread, innermost close. */
722 switch (places_array
[test_places
].count
)
724 /* First 3 are T = 5, P = 2. */
728 p
= places_array
[test_places
].places
[(thr
& 2) / 2];
730 /* All the rest are T = 5, P = 1. */
733 p
= places_array
[test_places
].places
[0];
742 if (omp_get_thread_num () == 3)
744 /* Master, spread, close. */
745 #pragma omp parallel num_threads (5) proc_bind (close)
747 verify (omp_proc_bind_close
, omp_proc_bind_close
);
750 struct place p
= places_array
[0].places
[0];
751 int thr
= omp_get_thread_num ();
752 printf ("#3,#2,#2 thread 2,3,%d", thr
);
753 if (omp_get_num_threads () == 5
754 && (test_spread_master_close
|| test_true
))
755 /* Outer is master, inner spread, innermost close. */
756 switch (places_array
[test_places
].count
)
760 p
= places_array
[test_places
].places
[6
763 /* All the rest are T = 5, P = 1. */
765 p
= places_array
[test_places
].places
[6];
768 p
= places_array
[test_places
].places
[4];
771 p
= places_array
[test_places
].places
[0];
774 p
= places_array
[test_places
].places
[1];
783 /* Master, master. */
784 #pragma omp parallel num_threads (4) proc_bind(master)
786 verify (omp_proc_bind_master
, omp_proc_bind_close
);
789 struct place p
= places_array
[0].places
[0];
790 int thr
= omp_get_thread_num ();
791 printf ("#3,#3 thread 2,%d", thr
);
792 if (test_spread_master_close
|| test_true
)
793 /* Outer is master, inner master. */
794 p
= places_array
[test_places
].places
[0];
800 #pragma omp parallel num_threads (6) proc_bind (close)
802 verify (omp_proc_bind_close
, omp_proc_bind_close
);
805 struct place p
= places_array
[0].places
[0];
806 int thr
= omp_get_thread_num ();
807 printf ("#3,#4 thread 2,%d", thr
);
808 if (omp_get_num_threads () == 6
809 && (test_spread_master_close
|| test_true
))
810 switch (places_array
[test_places
].count
)
816 p
= places_array
[test_places
].places
[thr
];
819 /* T = 6, P = 5. thr{0,5} go into the first place. */
820 p
= places_array
[test_places
].places
[thr
== 5 ? 0 : thr
];
823 /* T = 6, P = 3, two threads into each place. */
824 p
= places_array
[test_places
].places
[thr
/ 2];
827 /* T = 6, P = 2, 3 threads into each place. */
828 p
= places_array
[test_places
].places
[thr
/ 3];
838 #pragma omp parallel num_threads (5) proc_bind(close)
840 verify (omp_proc_bind_close
, omp_proc_bind_master
);
843 struct place p
= places_array
[0].places
[0];
844 int thr
= omp_get_thread_num ();
845 printf ("#4 thread %d", thr
);
846 if (omp_get_num_threads () == 5
847 && (test_spread_master_close
|| test_true
))
848 switch (places_array
[test_places
].count
)
856 p
= places_array
[test_places
].places
[thr
];
859 /* T = 5, P = 3, thr{0,3} in first place, thr{1,4} in second,
861 p
= places_array
[test_places
].places
[thr
>= 3 ? thr
- 3 : thr
];
864 /* T = 5, P = 2, thr{0,1,4} in first place, thr{2,3} in second. */
865 p
= places_array
[test_places
].places
[thr
== 4 ? 0 : thr
/ 2];
872 if (omp_get_thread_num () == 2)
875 switch (places_array
[test_places
].count
)
887 /* Close, close/master. */
888 #pragma omp parallel num_threads (4) firstprivate (pp)
890 verify (omp_proc_bind_close
, omp_proc_bind_close
);
893 struct place p
= places_array
[0].places
[0];
894 int thr
= omp_get_thread_num ();
895 printf ("#4,#1 thread 2,%d", thr
);
896 if (test_spread_master_close
)
897 /* Outer is close, inner is master. */
898 p
= places_array
[test_places
].places
[pp
];
899 else if (omp_get_num_threads () == 4 && test_true
)
900 /* Outer is close, inner is close. */
901 switch (places_array
[test_places
].count
)
907 p
= places_array
[test_places
].places
[2 + thr
];
910 /* T = 4, P = 5. There is wrap-around for thr3. */
911 p
= places_array
[test_places
].places
[thr
== 3 ? 0 : 2 + thr
];
914 /* T = 4, P = 3, thr{0,3} go into p2, thr1 into p0, thr2
916 p
= places_array
[test_places
].places
[(2 + thr
) % 3];
919 /* T = 4, P = 2, 2 threads into each place. */
920 p
= places_array
[test_places
].places
[1 - thr
/ 2];
929 #pragma omp parallel num_threads (4) proc_bind (spread)
931 verify (omp_proc_bind_spread
, omp_proc_bind_close
);
934 struct place p
= places_array
[0].places
[0];
935 int thr
= omp_get_thread_num ();
936 printf ("#4,#2 thread 2,%d", thr
);
937 if (omp_get_num_threads () == 4
938 && (test_spread_master_close
|| test_true
))
939 /* Outer is close, inner is spread. */
940 switch (places_array
[test_places
].count
)
943 /* T = 4, P = 8, each subpartition has 2 places. */
945 /* T = 4, P = 7, each subpartition has 2 places, but
946 last partition, which has just one place. */
947 p
= places_array
[test_places
].places
[thr
== 3 ? 0
951 /* T = 4, P = 5, first subpartition has 2 places, the
953 p
= places_array
[test_places
].places
[thr
== 3 ? 0
957 /* T = 4, P = 3, unit sized subpartitions, third gets
958 thr0 and thr3, first thr1, second thr2. */
959 p
= places_array
[test_places
].places
[thr
== 0 ? 2 : thr
- 1];
962 /* T = 4, P = 2, unit sized subpartitions, each with
964 p
= places_array
[test_places
].places
[1 - thr
/ 2];
971 if (omp_get_thread_num () == 0)
973 /* Close, spread, close. */
974 #pragma omp parallel num_threads (5) proc_bind (close)
976 verify (omp_proc_bind_close
, omp_proc_bind_close
);
979 struct place p
= places_array
[0].places
[0];
980 int thr
= omp_get_thread_num ();
981 printf ("#4,#2,#1 thread 2,0,%d", thr
);
982 if (omp_get_num_threads () == 5
983 && (test_spread_master_close
|| test_true
))
984 /* Outer is close, inner spread, innermost close. */
985 switch (places_array
[test_places
].count
)
990 p
= places_array
[test_places
].places
[2
993 /* All the rest are T = 5, P = 1. */
996 p
= places_array
[test_places
].places
[2];
999 p
= places_array
[test_places
].places
[1];
1008 if (omp_get_thread_num () == 2)
1010 /* Close, spread, close. */
1011 #pragma omp parallel num_threads (5) proc_bind (close)
1013 verify (omp_proc_bind_close
, omp_proc_bind_close
);
1014 #pragma omp critical
1016 struct place p
= places_array
[0].places
[0];
1017 int thr
= omp_get_thread_num ();
1018 printf ("#4,#2,#2 thread 2,2,%d", thr
);
1019 if (omp_get_num_threads () == 5
1020 && (test_spread_master_close
|| test_true
))
1021 /* Outer is close, inner spread, innermost close. */
1022 switch (places_array
[test_places
].count
)
1026 p
= places_array
[test_places
].places
[6
1029 /* All the rest are T = 5, P = 1. */
1031 p
= places_array
[test_places
].places
[6];
1034 p
= places_array
[test_places
].places
[4];
1037 p
= places_array
[test_places
].places
[1];
1040 p
= places_array
[test_places
].places
[0];
1049 if (omp_get_thread_num () == 3)
1051 /* Close, spread, close. */
1052 #pragma omp parallel num_threads (5) proc_bind (close)
1054 verify (omp_proc_bind_close
, omp_proc_bind_close
);
1055 #pragma omp critical
1057 struct place p
= places_array
[0].places
[0];
1058 int thr
= omp_get_thread_num ();
1059 printf ("#4,#2,#3 thread 2,3,%d", thr
);
1060 if (omp_get_num_threads () == 5
1061 && (test_spread_master_close
|| test_true
))
1062 /* Outer is close, inner spread, innermost close. */
1063 switch (places_array
[test_places
].count
)
1069 p
= places_array
[test_places
].places
[(thr
& 2) / 2];
1071 /* All the rest are T = 5, P = 1. */
1073 p
= places_array
[test_places
].places
[2];
1076 p
= places_array
[test_places
].places
[0];
1085 /* Close, master. */
1086 #pragma omp parallel num_threads (4) proc_bind(master) \
1089 verify (omp_proc_bind_master
, omp_proc_bind_close
);
1090 #pragma omp critical
1092 struct place p
= places_array
[0].places
[0];
1093 int thr
= omp_get_thread_num ();
1094 printf ("#4,#3 thread 2,%d", thr
);
1095 if (test_spread_master_close
|| test_true
)
1096 /* Outer is close, inner master. */
1097 p
= places_array
[test_places
].places
[pp
];
1103 #pragma omp parallel num_threads (6) proc_bind (close)
1105 verify (omp_proc_bind_close
, omp_proc_bind_close
);
1106 #pragma omp critical
1108 struct place p
= places_array
[0].places
[0];
1109 int thr
= omp_get_thread_num ();
1110 printf ("#4,#4 thread 2,%d", thr
);
1111 if (omp_get_num_threads () == 6
1112 && (test_spread_master_close
|| test_true
))
1113 switch (places_array
[test_places
].count
)
1117 p
= places_array
[test_places
].places
[2 + thr
];
1121 p
= places_array
[test_places
].places
[thr
== 5 ? 0 : 2 + thr
];
1124 /* T = 6, P = 5. thr{0,5} go into the third place. */
1125 p
= places_array
[test_places
].places
[thr
>= 3 ? thr
- 3
1129 /* T = 6, P = 3, two threads into each place. */
1130 p
= places_array
[test_places
].places
[thr
< 2 ? 2
1134 /* T = 6, P = 2, 3 threads into each place. */
1135 p
= places_array
[test_places
].places
[1 - thr
/ 3];