32
32
#include <sys/resource.h>
33
33
#include <sys/syscall.h>
34
34
35
- #if KMP_OS_LINUX
35
+ #if KMP_OS_LINUX && ! KMP_OS_CNK
36
36
# include <sys/sysinfo.h>
37
37
# if KMP_OS_LINUX && (KMP_ARCH_X86 || KMP_ARCH_X86_64 || KMP_ARCH_ARM )
38
38
// We should really include <futex.h>, but that causes compatibility problems on different
61
61
#include <fcntl.h>
62
62
63
63
// For non-x86 architecture
64
- #if KMP_COMPILER_GCC && !(KMP_ARCH_X86 || KMP_ARCH_X86_64 )
64
+ #if KMP_COMPILER_GCC && !(KMP_ARCH_X86 || KMP_ARCH_X86_64 || KMP_ARCH_PPC64 )
65
65
# include <stdbool.h>
66
66
# include <ffi.h>
67
67
#endif
@@ -110,7 +110,7 @@ __kmp_print_cond( char *buffer, kmp_cond_align_t *cond )
110
110
/* ------------------------------------------------------------------------ */
111
111
/* ------------------------------------------------------------------------ */
112
112
113
- #if KMP_OS_LINUX && KMP_AFFINITY_SUPPORTED
113
+ #if ( KMP_OS_LINUX && KMP_AFFINITY_SUPPORTED )
114
114
115
115
/*
116
116
* Affinity support
@@ -147,6 +147,19 @@ __kmp_print_cond( char *buffer, kmp_cond_align_t *cond )
147
147
# error Wrong code for getaffinity system call.
148
148
# endif /* __NR_sched_getaffinity */
149
149
150
+ # elif KMP_ARCH_PPC64
151
+ # ifndef __NR_sched_setaffinity
152
+ # define __NR_sched_setaffinity 222
153
+ # elif __NR_sched_setaffinity != 222
154
+ # error Wrong code for setaffinity system call.
155
+ # endif /* __NR_sched_setaffinity */
156
+ # ifndef __NR_sched_getaffinity
157
+ # define __NR_sched_getaffinity 223
158
+ # elif __NR_sched_getaffinity != 223
159
+ # error Wrong code for getaffinity system call.
160
+ # endif /* __NR_sched_getaffinity */
161
+
162
+
150
163
# else
151
164
# error Unknown or unsupported architecture
152
165
@@ -445,7 +458,7 @@ __kmp_change_thread_affinity_mask( int gtid, kmp_affin_mask_t *new_mask,
445
458
/* ------------------------------------------------------------------------ */
446
459
/* ------------------------------------------------------------------------ */
447
460
448
- #if KMP_OS_LINUX && (KMP_ARCH_X86 || KMP_ARCH_X86_64 || KMP_ARCH_ARM )
461
+ #if KMP_OS_LINUX && (KMP_ARCH_X86 || KMP_ARCH_X86_64 || KMP_ARCH_ARM ) && ! KMP_OS_CNK
449
462
450
463
int
451
464
__kmp_futex_determine_capable ()
@@ -462,7 +475,7 @@ __kmp_futex_determine_capable()
462
475
return retval ;
463
476
}
464
477
465
- #endif // KMP_OS_LINUX && (KMP_ARCH_X86 || KMP_ARCH_X86_64 || KMP_ARCH_ARM)
478
+ #endif // KMP_OS_LINUX && (KMP_ARCH_X86 || KMP_ARCH_X86_64 || KMP_ARCH_ARM) && !KMP_OS_CNK
466
479
467
480
/* ------------------------------------------------------------------------ */
468
481
/* ------------------------------------------------------------------------ */
@@ -481,7 +494,7 @@ __kmp_test_then_or32( volatile kmp_int32 *p, kmp_int32 d )
481
494
old_value = TCR_4 ( * p );
482
495
new_value = old_value | d ;
483
496
484
- while ( ! __kmp_compare_and_store32 ( p , old_value , new_value ) )
497
+ while ( ! KMP_COMPARE_AND_STORE_REL32 ( p , old_value , new_value ) )
485
498
{
486
499
KMP_CPU_PAUSE ();
487
500
old_value = TCR_4 ( * p );
@@ -498,7 +511,7 @@ __kmp_test_then_and32( volatile kmp_int32 *p, kmp_int32 d )
498
511
old_value = TCR_4 ( * p );
499
512
new_value = old_value & d ;
500
513
501
- while ( ! __kmp_compare_and_store32 ( p , old_value , new_value ) )
514
+ while ( ! KMP_COMPARE_AND_STORE_REL32 ( p , old_value , new_value ) )
502
515
{
503
516
KMP_CPU_PAUSE ();
504
517
old_value = TCR_4 ( * p );
@@ -507,7 +520,7 @@ __kmp_test_then_and32( volatile kmp_int32 *p, kmp_int32 d )
507
520
return old_value ;
508
521
}
509
522
510
- # if KMP_ARCH_X86
523
+ # if KMP_ARCH_X86 || KMP_ARCH_PPC64
511
524
kmp_int64
512
525
__kmp_test_then_add64 ( volatile kmp_int64 * p , kmp_int64 d )
513
526
{
@@ -516,7 +529,7 @@ __kmp_test_then_add64( volatile kmp_int64 *p, kmp_int64 d )
516
529
old_value = TCR_8 ( * p );
517
530
new_value = old_value + d ;
518
531
519
- while ( ! __kmp_compare_and_store64 ( p , old_value , new_value ) )
532
+ while ( ! KMP_COMPARE_AND_STORE_REL64 ( p , old_value , new_value ) )
520
533
{
521
534
KMP_CPU_PAUSE ();
522
535
old_value = TCR_8 ( * p );
@@ -533,7 +546,7 @@ __kmp_test_then_or64( volatile kmp_int64 *p, kmp_int64 d )
533
546
534
547
old_value = TCR_8 ( * p );
535
548
new_value = old_value | d ;
536
- while ( ! __kmp_compare_and_store64 ( p , old_value , new_value ) )
549
+ while ( ! KMP_COMPARE_AND_STORE_REL64 ( p , old_value , new_value ) )
537
550
{
538
551
KMP_CPU_PAUSE ();
539
552
old_value = TCR_8 ( * p );
@@ -549,7 +562,7 @@ __kmp_test_then_and64( volatile kmp_int64 *p, kmp_int64 d )
549
562
550
563
old_value = TCR_8 ( * p );
551
564
new_value = old_value & d ;
552
- while ( ! __kmp_compare_and_store64 ( p , old_value , new_value ) )
565
+ while ( ! KMP_COMPARE_AND_STORE_REL64 ( p , old_value , new_value ) )
553
566
{
554
567
KMP_CPU_PAUSE ();
555
568
old_value = TCR_8 ( * p );
@@ -2527,7 +2540,7 @@ __kmp_get_load_balance( int max )
2527
2540
#endif // USE_LOAD_BALANCE
2528
2541
2529
2542
2530
- #if KMP_COMPILER_GCC && !(KMP_ARCH_X86 || KMP_ARCH_X86_64 )
2543
+ #if KMP_COMPILER_GCC && !(KMP_ARCH_X86 || KMP_ARCH_X86_64 || KMP_ARCH_PPC64 )
2531
2544
2532
2545
int __kmp_invoke_microtask ( microtask_t pkfn , int gtid , int tid , int argc ,
2533
2546
void * p_argv [] )
@@ -2561,7 +2574,89 @@ int __kmp_invoke_microtask( microtask_t pkfn, int gtid, int tid, int argc,
2561
2574
return 1 ;
2562
2575
}
2563
2576
2564
- #endif // KMP_COMPILER_GCC && !(KMP_ARCH_X86 || KMP_ARCH_X86_64)
2577
+ #endif // KMP_COMPILER_GCC && !(KMP_ARCH_X86 || KMP_ARCH_X86_64 || KMP_ARCH_PPC64)
2578
+
2579
+ #if KMP_ARCH_PPC64
2580
+
2581
+ // we really only need the case with 1 argument, because CLANG always build
2582
+ // a struct of pointers to shared variables referenced in the outlined function
2583
+ int
2584
+ __kmp_invoke_microtask ( microtask_t pkfn ,
2585
+ int gtid , int tid ,
2586
+ int argc , void * p_argv [] ) {
2587
+ switch (argc ) {
2588
+ default :
2589
+ fprintf (stderr , "Too many args to microtask: %d!\n" , argc );
2590
+ fflush (stderr );
2591
+ exit (-1 );
2592
+ case 0 :
2593
+ (* pkfn )(& gtid , & tid );
2594
+ break ;
2595
+ case 1 :
2596
+ (* pkfn )(& gtid , & tid , p_argv [0 ]);
2597
+ break ;
2598
+ case 2 :
2599
+ (* pkfn )(& gtid , & tid , p_argv [0 ], p_argv [1 ]);
2600
+ break ;
2601
+ case 3 :
2602
+ (* pkfn )(& gtid , & tid , p_argv [0 ], p_argv [1 ], p_argv [2 ]);
2603
+ break ;
2604
+ case 4 :
2605
+ (* pkfn )(& gtid , & tid , p_argv [0 ], p_argv [1 ], p_argv [2 ], p_argv [3 ]);
2606
+ break ;
2607
+ case 5 :
2608
+ (* pkfn )(& gtid , & tid , p_argv [0 ], p_argv [1 ], p_argv [2 ], p_argv [3 ], p_argv [4 ]);
2609
+ break ;
2610
+ case 6 :
2611
+ (* pkfn )(& gtid , & tid , p_argv [0 ], p_argv [1 ], p_argv [2 ], p_argv [3 ], p_argv [4 ],
2612
+ p_argv [5 ]);
2613
+ break ;
2614
+ case 7 :
2615
+ (* pkfn )(& gtid , & tid , p_argv [0 ], p_argv [1 ], p_argv [2 ], p_argv [3 ], p_argv [4 ],
2616
+ p_argv [5 ], p_argv [6 ]);
2617
+ break ;
2618
+ case 8 :
2619
+ (* pkfn )(& gtid , & tid , p_argv [0 ], p_argv [1 ], p_argv [2 ], p_argv [3 ], p_argv [4 ],
2620
+ p_argv [5 ], p_argv [6 ], p_argv [7 ]);
2621
+ break ;
2622
+ case 9 :
2623
+ (* pkfn )(& gtid , & tid , p_argv [0 ], p_argv [1 ], p_argv [2 ], p_argv [3 ], p_argv [4 ],
2624
+ p_argv [5 ], p_argv [6 ], p_argv [7 ], p_argv [8 ]);
2625
+ break ;
2626
+ case 10 :
2627
+ (* pkfn )(& gtid , & tid , p_argv [0 ], p_argv [1 ], p_argv [2 ], p_argv [3 ], p_argv [4 ],
2628
+ p_argv [5 ], p_argv [6 ], p_argv [7 ], p_argv [8 ], p_argv [9 ]);
2629
+ break ;
2630
+ case 11 :
2631
+ (* pkfn )(& gtid , & tid , p_argv [0 ], p_argv [1 ], p_argv [2 ], p_argv [3 ], p_argv [4 ],
2632
+ p_argv [5 ], p_argv [6 ], p_argv [7 ], p_argv [8 ], p_argv [9 ], p_argv [10 ]);
2633
+ break ;
2634
+ case 12 :
2635
+ (* pkfn )(& gtid , & tid , p_argv [0 ], p_argv [1 ], p_argv [2 ], p_argv [3 ], p_argv [4 ],
2636
+ p_argv [5 ], p_argv [6 ], p_argv [7 ], p_argv [8 ], p_argv [9 ], p_argv [10 ],
2637
+ p_argv [11 ]);
2638
+ break ;
2639
+ case 13 :
2640
+ (* pkfn )(& gtid , & tid , p_argv [0 ], p_argv [1 ], p_argv [2 ], p_argv [3 ], p_argv [4 ],
2641
+ p_argv [5 ], p_argv [6 ], p_argv [7 ], p_argv [8 ], p_argv [9 ], p_argv [10 ],
2642
+ p_argv [11 ], p_argv [12 ]);
2643
+ break ;
2644
+ case 14 :
2645
+ (* pkfn )(& gtid , & tid , p_argv [0 ], p_argv [1 ], p_argv [2 ], p_argv [3 ], p_argv [4 ],
2646
+ p_argv [5 ], p_argv [6 ], p_argv [7 ], p_argv [8 ], p_argv [9 ], p_argv [10 ],
2647
+ p_argv [11 ], p_argv [12 ], p_argv [13 ]);
2648
+ break ;
2649
+ case 15 :
2650
+ (* pkfn )(& gtid , & tid , p_argv [0 ], p_argv [1 ], p_argv [2 ], p_argv [3 ], p_argv [4 ],
2651
+ p_argv [5 ], p_argv [6 ], p_argv [7 ], p_argv [8 ], p_argv [9 ], p_argv [10 ],
2652
+ p_argv [11 ], p_argv [12 ], p_argv [13 ], p_argv [14 ]);
2653
+ break ;
2654
+ }
2655
+
2656
+ return 1 ;
2657
+ }
2658
+
2659
+ #endif
2565
2660
2566
2661
// end of file //
2567
2662
0 commit comments