]>
git.ipfire.org Git - thirdparty/gcc.git/blob - libgomp/testsuite/libgomp.c/affinity-1.c
2 Copyright (C) 2013-2021 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 "-Wno-deprecated-declarations" } */
21 /* { dg-additional-options "-DINTERPOSE_GETAFFINITY -DDO_FORK -ldl -Wno-deprecated-declarations" { target *-*-linux* } } */
37 #ifdef HAVE_PTHREAD_AFFINITY_NP
40 #ifdef INTERPOSE_GETAFFINITY
53 struct place places
[8];
55 { "", 1, { { -1, -1 } } },
57 { { 0, 1 }, { 1, 1 }, { 2, 1 }, { 3, 1 },
58 { 4, 1 }, { 5, 1 }, { 6, 1 }, { 7, 1 } } },
59 { "{7,6}:2:-3", 2, { { 6, 2 }, { 3, 2 } } },
60 { "{6,7}:4:-2,!{2,3}", 3, { { 6, 2 }, { 4, 2 }, { 0, 2 } } },
62 { { 1, 1 }, { 2, 1 }, { 3, 1 },
63 { 4, 1 }, { 5, 1 }, { 6, 1 }, { 7, 1 } } },
64 { "{0,1},{3,2,4},{6,5,!6},{6},{7:2:-1,!6}", 5,
65 { { 0, 2 }, { 2, 3 }, { 5, 1 }, { 6, 1 }, { 7, 1 } } }
68 unsigned long contig_cpucount
;
69 unsigned long min_cpusetsize
;
71 #if defined (HAVE_PTHREAD_AFFINITY_NP) && defined (_SC_NPROCESSORS_CONF) \
72 && defined (CPU_ALLOC_SIZE)
74 #if defined (RTLD_NEXT) && defined (INTERPOSE_GETAFFINITY)
75 int (*orig_getaffinity_np
) (pthread_t
, size_t, cpu_set_t
*);
78 pthread_getaffinity_np (pthread_t thread
, size_t cpusetsize
, cpu_set_t
*cpuset
)
82 if (orig_getaffinity_np
== NULL
)
84 orig_getaffinity_np
= (int (*) (pthread_t
, size_t, cpu_set_t
*))
85 dlsym (RTLD_NEXT
, "pthread_getaffinity_np");
86 if (orig_getaffinity_np
== NULL
)
89 ret
= orig_getaffinity_np (thread
, cpusetsize
, cpuset
);
92 if (contig_cpucount
== 0)
95 for (i
= 0; i
< max
; i
++)
96 if (!CPU_ISSET_S (i
, cpusetsize
, cpuset
))
99 min_cpusetsize
= cpusetsize
;
106 print_affinity (struct place p
)
108 static unsigned long size
;
112 size
= min_cpusetsize
;
115 size
= sysconf (_SC_NPROCESSORS_CONF
);
116 size
= CPU_ALLOC_SIZE (size
);
117 if (size
< sizeof (cpu_set_t
))
118 size
= sizeof (cpu_set_t
);
121 cpu_set_t
*cpusetp
= (cpu_set_t
*) __builtin_alloca (size
);
122 if (pthread_getaffinity_np (pthread_self (), size
, cpusetp
) == 0)
124 unsigned long i
, len
, max
= 8 * size
;
125 int notfirst
= 0, unexpected
= 1;
127 printf (" bound to {");
128 for (i
= 0, len
= 0; i
< max
; i
++)
129 if (CPU_ISSET_S (i
, size
, cpusetp
))
138 else if (i
== (unsigned long) p
.start
)
147 if (len
&& len
!= (unsigned long) p
.len
)
150 printf (":%lu", len
);
153 if (len
&& len
!= (unsigned long) p
.len
)
156 printf (":%lu", len
);
158 if (p
.start
!= -1 && unexpected
)
160 printf (", expected {%d", p
.start
);
162 printf (":%d", p
.len
);
163 printf ("} instead");
165 else if (p
.start
!= -1)
166 printf (", verified");
171 print_affinity (struct place p
)
182 char *env_proc_bind
= getenv ("OMP_PROC_BIND");
183 int test_false
= env_proc_bind
&& strcmp (env_proc_bind
, "false") == 0;
184 int test_true
= env_proc_bind
&& strcmp (env_proc_bind
, "true") == 0;
185 int test_spread_master_close
186 = env_proc_bind
&& strcmp (env_proc_bind
, "spread,master,close") == 0;
187 char *env_places
= getenv ("OMP_PLACES");
191 if (env_places
== NULL
&& contig_cpucount
>= 8 && test_false
192 && getenv ("GOMP_AFFINITY") == NULL
)
196 for (j
= 0; j
< 2; j
++)
198 if (setenv ("OMP_PROC_BIND", j
? "spread,master,close" : "true", 1)
201 for (i
= sizeof (places_array
) / sizeof (places_array
[0]) - 1;
204 if (setenv ("OMP_PLACES", places_array
[i
].name
, 1) < 0)
211 execl ("/proc/self/exe", "affinity-1.exe", NULL
);
214 if (waitpid (pid
, &status
, 0) < 0)
216 if (WIFSIGNALED (status
) && WTERMSIG (status
) == SIGABRT
)
218 else if (!WIFEXITED (status
) || WEXITSTATUS (status
) != 0)
230 printf ("OMP_PROC_BIND='%s'", env_proc_bind
);
234 printf ("%sOMP_PLACES='%s'", first
? "" : " ", env_places
);
237 if (env_places
&& contig_cpucount
>= 8
238 && (test_true
|| test_spread_master_close
))
240 for (test_places
= sizeof (places_array
) / sizeof (places_array
[0]) - 1;
241 test_places
; --test_places
)
242 if (strcmp (env_places
, places_array
[test_places
].name
) == 0)
246 #define verify(if_true, if_s_m_c) \
247 if (test_false && omp_get_proc_bind () != omp_proc_bind_false) \
249 if (test_true && omp_get_proc_bind () != if_true) \
251 if (test_spread_master_close && omp_get_proc_bind () != if_s_m_c) \
254 verify (omp_proc_bind_true
, omp_proc_bind_spread
);
256 printf ("Initial thread");
257 print_affinity (places_array
[test_places
].places
[0]);
262 #pragma omp parallel if (0)
264 verify (omp_proc_bind_true
, omp_proc_bind_master
);
265 #pragma omp parallel if (0)
267 verify (omp_proc_bind_true
, omp_proc_bind_close
);
268 #pragma omp parallel if (0)
270 verify (omp_proc_bind_true
, omp_proc_bind_close
);
272 #pragma omp parallel if (0) proc_bind (spread)
274 verify (omp_proc_bind_spread
, omp_proc_bind_spread
);
277 #pragma omp parallel if (0) proc_bind (master)
279 verify (omp_proc_bind_master
, omp_proc_bind_close
);
280 #pragma omp parallel if (0)
282 verify (omp_proc_bind_master
, omp_proc_bind_close
);
284 #pragma omp parallel if (0) proc_bind (spread)
286 verify (omp_proc_bind_spread
, omp_proc_bind_spread
);
292 #pragma omp parallel num_threads (4)
294 verify (omp_proc_bind_true
, omp_proc_bind_master
);
297 struct place p
= places_array
[0].places
[0];
298 int thr
= omp_get_thread_num ();
299 printf ("#1 thread %d", thr
);
300 if (omp_get_num_threads () == 4 && test_spread_master_close
)
301 switch (places_array
[test_places
].count
)
304 /* T = 4, P = 8, each subpartition has 2 places. */
306 /* T = 4, P = 7, each subpartition has 2 places, but
307 last partition, which has just one place. */
308 p
= places_array
[test_places
].places
[2 * thr
];
311 /* T = 4, P = 5, first subpartition has 2 places, the
313 p
= places_array
[test_places
].places
[thr
? 1 + thr
: 0];
316 /* T = 4, P = 3, unit sized subpartitions, first gets
317 thr0 and thr3, second thr1, third thr2. */
318 p
= places_array
[test_places
].places
[thr
== 3 ? 0 : thr
];
321 /* T = 4, P = 2, unit sized subpartitions, each with
323 p
= places_array
[test_places
].places
[thr
/ 2];
330 if (omp_get_thread_num () == 3)
332 /* True/spread, true/master. */
333 #pragma omp parallel num_threads (3)
335 verify (omp_proc_bind_true
, omp_proc_bind_close
);
338 struct place p
= places_array
[0].places
[0];
339 int thr
= omp_get_thread_num ();
340 printf ("#1,#1 thread 3,%d", thr
);
341 if (omp_get_num_threads () == 3 && test_spread_master_close
)
342 /* Outer is spread, inner master, so just bind to the
343 place or the master thread, which is thr 3 above. */
344 switch (places_array
[test_places
].count
)
348 p
= places_array
[test_places
].places
[6];
351 p
= places_array
[test_places
].places
[4];
354 p
= places_array
[test_places
].places
[0];
357 p
= places_array
[test_places
].places
[1];
364 /* True/spread, spread. */
365 #pragma omp parallel num_threads (5) proc_bind (spread)
367 verify (omp_proc_bind_spread
, omp_proc_bind_close
);
370 struct place p
= places_array
[0].places
[0];
371 int thr
= omp_get_thread_num ();
372 printf ("#1,#2 thread 3,%d", thr
);
373 if (omp_get_num_threads () == 5 && test_spread_master_close
)
374 /* Outer is spread, inner spread. */
375 switch (places_array
[test_places
].count
)
378 /* T = 5, P = 2, unit sized subpartitions. */
379 p
= places_array
[test_places
].places
[thr
== 4 ? 6
382 /* The rest are T = 5, P = 1. */
384 p
= places_array
[test_places
].places
[6];
387 p
= places_array
[test_places
].places
[4];
390 p
= places_array
[test_places
].places
[0];
393 p
= places_array
[test_places
].places
[1];
400 if (omp_get_thread_num () == 3)
402 /* True/spread, spread, close. */
403 #pragma omp parallel num_threads (5) proc_bind (close)
405 verify (omp_proc_bind_close
, omp_proc_bind_close
);
408 struct place p
= places_array
[0].places
[0];
409 int thr
= omp_get_thread_num ();
410 printf ("#1,#2,#1 thread 3,3,%d", thr
);
411 if (omp_get_num_threads () == 5 && test_spread_master_close
)
412 /* Outer is spread, inner spread, innermost close. */
413 switch (places_array
[test_places
].count
)
415 /* All are T = 5, P = 1. */
417 p
= places_array
[test_places
].places
[7];
420 p
= places_array
[test_places
].places
[6];
423 p
= places_array
[test_places
].places
[4];
426 p
= places_array
[test_places
].places
[0];
429 p
= places_array
[test_places
].places
[1];
438 /* True/spread, master. */
439 #pragma omp parallel num_threads (4) proc_bind(master)
441 verify (omp_proc_bind_master
, omp_proc_bind_close
);
444 struct place p
= places_array
[0].places
[0];
445 int thr
= omp_get_thread_num ();
446 printf ("#1,#3 thread 3,%d", thr
);
447 if (omp_get_num_threads () == 4 && test_spread_master_close
)
448 /* Outer is spread, inner master, so just bind to the
449 place or the master thread, which is thr 3 above. */
450 switch (places_array
[test_places
].count
)
454 p
= places_array
[test_places
].places
[6];
457 p
= places_array
[test_places
].places
[4];
460 p
= places_array
[test_places
].places
[0];
463 p
= places_array
[test_places
].places
[1];
470 /* True/spread, close. */
471 #pragma omp parallel num_threads (6) proc_bind (close)
473 verify (omp_proc_bind_close
, omp_proc_bind_close
);
476 struct place p
= places_array
[0].places
[0];
477 int thr
= omp_get_thread_num ();
478 printf ("#1,#4 thread 3,%d", thr
);
479 if (omp_get_num_threads () == 6 && test_spread_master_close
)
480 /* Outer is spread, inner close. */
481 switch (places_array
[test_places
].count
)
484 /* T = 6, P = 2, unit sized subpartitions. */
485 p
= places_array
[test_places
].places
[6 + thr
/ 3];
487 /* The rest are T = 6, P = 1. */
489 p
= places_array
[test_places
].places
[6];
492 p
= places_array
[test_places
].places
[4];
495 p
= places_array
[test_places
].places
[0];
498 p
= places_array
[test_places
].places
[1];
509 #pragma omp parallel num_threads (5) proc_bind(spread)
511 verify (omp_proc_bind_spread
, omp_proc_bind_master
);
514 struct place p
= places_array
[0].places
[0];
515 int thr
= omp_get_thread_num ();
516 printf ("#2 thread %d", thr
);
517 if (omp_get_num_threads () == 5
518 && (test_spread_master_close
|| test_true
))
519 switch (places_array
[test_places
].count
)
522 /* T = 5, P = 8, first 3 subpartitions have 2 places, last
524 p
= places_array
[test_places
].places
[thr
< 3 ? 2 * thr
: 3 + thr
];
527 /* T = 5, P = 7, first 2 subpartitions have 2 places, last
529 p
= places_array
[test_places
].places
[thr
< 2 ? 2 * thr
: 2 + thr
];
532 /* T = 5, P = 5, unit sized subpartitions, each one with one
534 p
= places_array
[test_places
].places
[thr
];
537 /* T = 5, P = 3, unit sized subpartitions, first gets
538 thr0 and thr3, second thr1 and thr4, third thr2. */
539 p
= places_array
[test_places
].places
[thr
>= 3 ? thr
- 3 : thr
];
542 /* T = 5, P = 2, unit sized subpartitions, first with
543 thr{0,1,4} and second with thr{2,3}. */
544 p
= places_array
[test_places
].places
[thr
== 4 ? 0 : thr
/ 2];
551 if (omp_get_thread_num () == 3)
554 switch (places_array
[test_places
].count
)
556 case 8: pp
= 6; break;
557 case 7: pp
= 5; break;
558 case 5: pp
= 3; break;
559 case 2: pp
= 1; break;
561 /* Spread, spread/master. */
562 #pragma omp parallel num_threads (3) firstprivate (pp)
564 verify (omp_proc_bind_spread
, omp_proc_bind_close
);
567 struct place p
= places_array
[0].places
[0];
568 int thr
= omp_get_thread_num ();
569 printf ("#2,#1 thread 3,%d", thr
);
570 if (test_spread_master_close
|| test_true
)
571 /* Outer is spread, inner spread resp. master, bit we have
572 just unit sized partitions. */
573 p
= places_array
[test_places
].places
[pp
];
578 /* Spread, spread. */
579 #pragma omp parallel num_threads (5) proc_bind (spread) \
582 verify (omp_proc_bind_spread
, omp_proc_bind_close
);
585 struct place p
= places_array
[0].places
[0];
586 int thr
= omp_get_thread_num ();
587 printf ("#2,#2 thread 3,%d", thr
);
588 if (test_spread_master_close
|| test_true
)
589 /* Outer is spread, inner spread, bit we have
590 just unit sized partitions. */
591 p
= places_array
[test_places
].places
[pp
];
596 /* Spread, master. */
597 #pragma omp parallel num_threads (4) proc_bind(master) \
600 verify (omp_proc_bind_master
, omp_proc_bind_close
);
603 struct place p
= places_array
[0].places
[0];
604 int thr
= omp_get_thread_num ();
605 printf ("#2,#3 thread 3,%d", thr
);
606 if (test_spread_master_close
|| test_true
)
607 /* Outer is spread, inner master, bit we have
608 just unit sized partitions. */
609 p
= places_array
[test_places
].places
[pp
];
615 #pragma omp parallel num_threads (6) proc_bind (close) \
618 verify (omp_proc_bind_close
, omp_proc_bind_close
);
621 struct place p
= places_array
[0].places
[0];
622 int thr
= omp_get_thread_num ();
623 printf ("#2,#4 thread 3,%d", thr
);
624 if (test_spread_master_close
|| test_true
)
625 /* Outer is spread, inner close, bit we have
626 just unit sized partitions. */
627 p
= places_array
[test_places
].places
[pp
];
636 #pragma omp parallel num_threads (3) proc_bind(master)
638 verify (omp_proc_bind_master
, omp_proc_bind_master
);
641 struct place p
= places_array
[0].places
[0];
642 int thr
= omp_get_thread_num ();
643 printf ("#3 thread %d", thr
);
644 if (test_spread_master_close
|| test_true
)
645 p
= places_array
[test_places
].places
[0];
650 if (omp_get_thread_num () == 2)
652 /* Master, master. */
653 #pragma omp parallel num_threads (4)
655 verify (omp_proc_bind_master
, omp_proc_bind_close
);
658 struct place p
= places_array
[0].places
[0];
659 int thr
= omp_get_thread_num ();
660 printf ("#3,#1 thread 2,%d", thr
);
661 if (test_spread_master_close
|| test_true
)
662 /* Outer is master, inner is master. */
663 p
= places_array
[test_places
].places
[0];
668 /* Master, spread. */
669 #pragma omp parallel num_threads (4) proc_bind (spread)
671 verify (omp_proc_bind_spread
, omp_proc_bind_close
);
674 struct place p
= places_array
[0].places
[0];
675 int thr
= omp_get_thread_num ();
676 printf ("#3,#2 thread 2,%d", thr
);
677 if (omp_get_num_threads () == 4
678 && (test_spread_master_close
|| test_true
))
679 /* Outer is master, inner is spread. */
680 switch (places_array
[test_places
].count
)
683 /* T = 4, P = 8, each subpartition has 2 places. */
685 /* T = 4, P = 7, each subpartition has 2 places, but
686 last partition, which has just one place. */
687 p
= places_array
[test_places
].places
[2 * thr
];
690 /* T = 4, P = 5, first subpartition has 2 places, the
692 p
= places_array
[test_places
].places
[thr
? 1 + thr
: 0];
695 /* T = 4, P = 3, unit sized subpartitions, first gets
696 thr0 and thr3, second thr1, third thr2. */
697 p
= places_array
[test_places
].places
[thr
== 3 ? 0 : thr
];
700 /* T = 4, P = 2, unit sized subpartitions, each with
702 p
= places_array
[test_places
].places
[thr
/ 2];
709 if (omp_get_thread_num () == 0)
711 /* Master, spread, close. */
712 #pragma omp parallel num_threads (5) proc_bind (close)
714 verify (omp_proc_bind_close
, omp_proc_bind_close
);
717 struct place p
= places_array
[0].places
[0];
718 int thr
= omp_get_thread_num ();
719 printf ("#3,#2,#1 thread 2,0,%d", thr
);
720 if (omp_get_num_threads () == 5
721 && (test_spread_master_close
|| test_true
))
722 /* Outer is master, inner spread, innermost close. */
723 switch (places_array
[test_places
].count
)
725 /* First 3 are T = 5, P = 2. */
729 p
= places_array
[test_places
].places
[(thr
& 2) / 2];
731 /* All the rest are T = 5, P = 1. */
734 p
= places_array
[test_places
].places
[0];
743 if (omp_get_thread_num () == 3)
745 /* Master, spread, close. */
746 #pragma omp parallel num_threads (5) proc_bind (close)
748 verify (omp_proc_bind_close
, omp_proc_bind_close
);
751 struct place p
= places_array
[0].places
[0];
752 int thr
= omp_get_thread_num ();
753 printf ("#3,#2,#2 thread 2,3,%d", thr
);
754 if (omp_get_num_threads () == 5
755 && (test_spread_master_close
|| test_true
))
756 /* Outer is master, inner spread, innermost close. */
757 switch (places_array
[test_places
].count
)
761 p
= places_array
[test_places
].places
[6
764 /* All the rest are T = 5, P = 1. */
766 p
= places_array
[test_places
].places
[6];
769 p
= places_array
[test_places
].places
[4];
772 p
= places_array
[test_places
].places
[0];
775 p
= places_array
[test_places
].places
[1];
784 /* Master, master. */
785 #pragma omp parallel num_threads (4) proc_bind(master)
787 verify (omp_proc_bind_master
, omp_proc_bind_close
);
790 struct place p
= places_array
[0].places
[0];
791 int thr
= omp_get_thread_num ();
792 printf ("#3,#3 thread 2,%d", thr
);
793 if (test_spread_master_close
|| test_true
)
794 /* Outer is master, inner master. */
795 p
= places_array
[test_places
].places
[0];
801 #pragma omp parallel num_threads (6) proc_bind (close)
803 verify (omp_proc_bind_close
, omp_proc_bind_close
);
806 struct place p
= places_array
[0].places
[0];
807 int thr
= omp_get_thread_num ();
808 printf ("#3,#4 thread 2,%d", thr
);
809 if (omp_get_num_threads () == 6
810 && (test_spread_master_close
|| test_true
))
811 switch (places_array
[test_places
].count
)
817 p
= places_array
[test_places
].places
[thr
];
820 /* T = 6, P = 5. thr{0,5} go into the first place. */
821 p
= places_array
[test_places
].places
[thr
== 5 ? 0 : thr
];
824 /* T = 6, P = 3, two threads into each place. */
825 p
= places_array
[test_places
].places
[thr
/ 2];
828 /* T = 6, P = 2, 3 threads into each place. */
829 p
= places_array
[test_places
].places
[thr
/ 3];
839 #pragma omp parallel num_threads (5) proc_bind(close)
841 verify (omp_proc_bind_close
, omp_proc_bind_master
);
844 struct place p
= places_array
[0].places
[0];
845 int thr
= omp_get_thread_num ();
846 printf ("#4 thread %d", thr
);
847 if (omp_get_num_threads () == 5
848 && (test_spread_master_close
|| test_true
))
849 switch (places_array
[test_places
].count
)
857 p
= places_array
[test_places
].places
[thr
];
860 /* T = 5, P = 3, thr{0,3} in first place, thr{1,4} in second,
862 p
= places_array
[test_places
].places
[thr
>= 3 ? thr
- 3 : thr
];
865 /* T = 5, P = 2, thr{0,1,4} in first place, thr{2,3} in second. */
866 p
= places_array
[test_places
].places
[thr
== 4 ? 0 : thr
/ 2];
873 if (omp_get_thread_num () == 2)
876 switch (places_array
[test_places
].count
)
888 /* Close, close/master. */
889 #pragma omp parallel num_threads (4) firstprivate (pp)
891 verify (omp_proc_bind_close
, omp_proc_bind_close
);
894 struct place p
= places_array
[0].places
[0];
895 int thr
= omp_get_thread_num ();
896 printf ("#4,#1 thread 2,%d", thr
);
897 if (test_spread_master_close
)
898 /* Outer is close, inner is master. */
899 p
= places_array
[test_places
].places
[pp
];
900 else if (omp_get_num_threads () == 4 && test_true
)
901 /* Outer is close, inner is close. */
902 switch (places_array
[test_places
].count
)
908 p
= places_array
[test_places
].places
[2 + thr
];
911 /* T = 4, P = 5. There is wrap-around for thr3. */
912 p
= places_array
[test_places
].places
[thr
== 3 ? 0 : 2 + thr
];
915 /* T = 4, P = 3, thr{0,3} go into p2, thr1 into p0, thr2
917 p
= places_array
[test_places
].places
[(2 + thr
) % 3];
920 /* T = 4, P = 2, 2 threads into each place. */
921 p
= places_array
[test_places
].places
[1 - thr
/ 2];
930 #pragma omp parallel num_threads (4) proc_bind (spread)
932 verify (omp_proc_bind_spread
, omp_proc_bind_close
);
935 struct place p
= places_array
[0].places
[0];
936 int thr
= omp_get_thread_num ();
937 printf ("#4,#2 thread 2,%d", thr
);
938 if (omp_get_num_threads () == 4
939 && (test_spread_master_close
|| test_true
))
940 /* Outer is close, inner is spread. */
941 switch (places_array
[test_places
].count
)
944 /* T = 4, P = 8, each subpartition has 2 places. */
946 /* T = 4, P = 7, each subpartition has 2 places, but
947 last partition, which has just one place. */
948 p
= places_array
[test_places
].places
[thr
== 3 ? 0
952 /* T = 4, P = 5, first subpartition has 2 places, the
954 p
= places_array
[test_places
].places
[thr
== 3 ? 0
958 /* T = 4, P = 3, unit sized subpartitions, third gets
959 thr0 and thr3, first thr1, second thr2. */
960 p
= places_array
[test_places
].places
[thr
== 0 ? 2 : thr
- 1];
963 /* T = 4, P = 2, unit sized subpartitions, each with
965 p
= places_array
[test_places
].places
[1 - thr
/ 2];
972 if (omp_get_thread_num () == 0)
974 /* Close, spread, close. */
975 #pragma omp parallel num_threads (5) proc_bind (close)
977 verify (omp_proc_bind_close
, omp_proc_bind_close
);
980 struct place p
= places_array
[0].places
[0];
981 int thr
= omp_get_thread_num ();
982 printf ("#4,#2,#1 thread 2,0,%d", thr
);
983 if (omp_get_num_threads () == 5
984 && (test_spread_master_close
|| test_true
))
985 /* Outer is close, inner spread, innermost close. */
986 switch (places_array
[test_places
].count
)
991 p
= places_array
[test_places
].places
[2
994 /* All the rest are T = 5, P = 1. */
997 p
= places_array
[test_places
].places
[2];
1000 p
= places_array
[test_places
].places
[1];
1009 if (omp_get_thread_num () == 2)
1011 /* Close, spread, close. */
1012 #pragma omp parallel num_threads (5) proc_bind (close)
1014 verify (omp_proc_bind_close
, omp_proc_bind_close
);
1015 #pragma omp critical
1017 struct place p
= places_array
[0].places
[0];
1018 int thr
= omp_get_thread_num ();
1019 printf ("#4,#2,#2 thread 2,2,%d", thr
);
1020 if (omp_get_num_threads () == 5
1021 && (test_spread_master_close
|| test_true
))
1022 /* Outer is close, inner spread, innermost close. */
1023 switch (places_array
[test_places
].count
)
1027 p
= places_array
[test_places
].places
[6
1030 /* All the rest are T = 5, P = 1. */
1032 p
= places_array
[test_places
].places
[6];
1035 p
= places_array
[test_places
].places
[4];
1038 p
= places_array
[test_places
].places
[1];
1041 p
= places_array
[test_places
].places
[0];
1050 if (omp_get_thread_num () == 3)
1052 /* Close, spread, close. */
1053 #pragma omp parallel num_threads (5) proc_bind (close)
1055 verify (omp_proc_bind_close
, omp_proc_bind_close
);
1056 #pragma omp critical
1058 struct place p
= places_array
[0].places
[0];
1059 int thr
= omp_get_thread_num ();
1060 printf ("#4,#2,#3 thread 2,3,%d", thr
);
1061 if (omp_get_num_threads () == 5
1062 && (test_spread_master_close
|| test_true
))
1063 /* Outer is close, inner spread, innermost close. */
1064 switch (places_array
[test_places
].count
)
1070 p
= places_array
[test_places
].places
[(thr
& 2) / 2];
1072 /* All the rest are T = 5, P = 1. */
1074 p
= places_array
[test_places
].places
[2];
1077 p
= places_array
[test_places
].places
[0];
1086 /* Close, master. */
1087 #pragma omp parallel num_threads (4) proc_bind(master) \
1090 verify (omp_proc_bind_master
, omp_proc_bind_close
);
1091 #pragma omp critical
1093 struct place p
= places_array
[0].places
[0];
1094 int thr
= omp_get_thread_num ();
1095 printf ("#4,#3 thread 2,%d", thr
);
1096 if (test_spread_master_close
|| test_true
)
1097 /* Outer is close, inner master. */
1098 p
= places_array
[test_places
].places
[pp
];
1104 #pragma omp parallel num_threads (6) proc_bind (close)
1106 verify (omp_proc_bind_close
, omp_proc_bind_close
);
1107 #pragma omp critical
1109 struct place p
= places_array
[0].places
[0];
1110 int thr
= omp_get_thread_num ();
1111 printf ("#4,#4 thread 2,%d", thr
);
1112 if (omp_get_num_threads () == 6
1113 && (test_spread_master_close
|| test_true
))
1114 switch (places_array
[test_places
].count
)
1118 p
= places_array
[test_places
].places
[2 + thr
];
1122 p
= places_array
[test_places
].places
[thr
== 5 ? 0 : 2 + thr
];
1125 /* T = 6, P = 5. thr{0,5} go into the third place. */
1126 p
= places_array
[test_places
].places
[thr
>= 3 ? thr
- 3
1130 /* T = 6, P = 3, two threads into each place. */
1131 p
= places_array
[test_places
].places
[thr
< 2 ? 2
1135 /* T = 6, P = 2, 3 threads into each place. */
1136 p
= places_array
[test_places
].places
[1 - thr
/ 3];