Skip to content

Commit 763b939

Browse files
committed
Add support for FreeBSD
Port the OpenMP runtime to FreeBSD along with associated build system changes. Also begin to generalize affinity capabilities so they aren't tied explicitly to Windows and Linux. The port builds with stock clang and gmake and has no additional runtime dependencies. All but a handful of the validation suite tests are now passing on FreeBSD 10 x86_64. llvm-svn: 202478
1 parent 6c6af85 commit 763b939

17 files changed

+141
-88
lines changed

openmp/runtime/README.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@ Intel(R) Many Integrated Core Architecture
7878
| icc/icl | gcc | clang |
7979
--------------|---------------|--------------------------|
8080
| Linux* OS | Yes(1,5) | Yes(2,4) | Yes(4,6,7) |
81+
| FreeBSD* | No | No | Yes(4,6,7) |
8182
| OS X* | Yes(1,3,4) | No | Yes(4,6,7) |
8283
| Windows* OS | Yes(1,4) | No | No |
8384
----------------------------------------------------------

openmp/runtime/src/kmp.h

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@
8888
#include "kmp_lock.h"
8989
#include "kmp_i18n.h"
9090

91-
#define KMP_HANDLE_SIGNALS (KMP_OS_LINUX || KMP_OS_WINDOWS || KMP_OS_DARWIN)
91+
#define KMP_HANDLE_SIGNALS (KMP_OS_LINUX || KMP_OS_FREEBSD || KMP_OS_WINDOWS || KMP_OS_DARWIN)
9292

9393
#ifdef KMP_SETVERSION
9494
/* from factory/Include, to get VERSION_STRING embedded for 'what' */
@@ -460,6 +460,15 @@ typedef int PACKED_REDUCTION_METHOD_T;
460460
* Only Linux* OS and Windows* OS support thread affinity.
461461
*/
462462
#if KMP_OS_LINUX || KMP_OS_WINDOWS
463+
# define KMP_AFFINITY_SUPPORTED 1
464+
#elif KMP_OS_DARWIN || KMP_OS_FREEBSD
465+
// affinity not supported
466+
# define KMP_AFFINITY_SUPPORTED 0
467+
#else
468+
# error "Unknown or unsupported OS"
469+
#endif
470+
471+
#if KMP_AFFINITY_SUPPORTED
463472

464473
extern size_t __kmp_affin_mask_size;
465474
# define KMP_AFFINITY_CAPABLE() (__kmp_affin_mask_size > 0)
@@ -719,11 +728,7 @@ extern kmp_affin_mask_t *__kmp_affinity_get_fullMask();
719728
# endif /* KMP_OS_LINUX */
720729
extern char const * __kmp_cpuinfo_file;
721730

722-
#elif KMP_OS_DARWIN
723-
// affinity not supported
724-
#else
725-
#error "Unknown or unsupported OS"
726-
#endif /* KMP_OS_LINUX || KMP_OS_WINDOWS */
731+
#endif /* KMP_AFFINITY_SUPPORTED */
727732

728733
#if OMP_40_ENABLED
729734

@@ -944,10 +949,12 @@ extern unsigned int __kmp_place_core_offset;
944949
#elif KMP_OS_LINUX
945950
# define KMP_INIT_WAIT 1024U /* initial number of spin-tests */
946951
# define KMP_NEXT_WAIT 512U /* susequent number of spin-tests */
947-
#elif KMP_OS_DARWIN
948-
/* TODO: tune for KMP_OS_DARWIN */
952+
#elif KMP_OS_DARWIN || KMP_OS_FREEBSD
953+
/* TODO: tune for OS */
949954
# define KMP_INIT_WAIT 1024U /* initial number of spin-tests */
950955
# define KMP_NEXT_WAIT 512U /* susequent number of spin-tests */
956+
#else
957+
# error "Unknown or unsupported OS"
951958
#endif
952959

953960
#if KMP_ARCH_X86 || KMP_ARCH_X86_64
@@ -2971,7 +2978,7 @@ extern void __kmp_initialize_system_tick( void ); /* Initialize timer tick valu
29712978
extern void __kmp_runtime_initialize( void ); /* machine specific initialization */
29722979
extern void __kmp_runtime_destroy( void );
29732980

2974-
#if KMP_OS_LINUX || KMP_OS_WINDOWS
2981+
#if KMP_AFFINITY_SUPPORTED
29752982
extern char *__kmp_affinity_print_mask(char *buf, int buf_len, kmp_affin_mask_t *mask);
29762983
extern void __kmp_affinity_initialize(void);
29772984
extern void __kmp_affinity_uninitialize(void);
@@ -2989,7 +2996,7 @@ extern int __kmp_aux_unset_affinity_mask_proc(int proc, void **mask);
29892996
extern int __kmp_aux_get_affinity_mask_proc(int proc, void **mask);
29902997
extern void __kmp_balanced_affinity( int tid, int team_size );
29912998

2992-
#endif /* KMP_OS_LINUX || KMP_OS_WINDOWS */
2999+
#endif /* KMP_AFFINITY_SUPPORTED */
29933000

29943001
#if KMP_OS_LINUX && (KMP_ARCH_X86 || KMP_ARCH_X86_64 || KMP_ARCH_ARM)
29953002

openmp/runtime/src/kmp_affinity.cpp

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
#include "kmp_str.h"
2222

2323

24-
#if KMP_OS_WINDOWS || KMP_OS_LINUX
24+
#if KMP_AFFINITY_SUPPORTED
2525

2626
//
2727
// Print the affinity mask to the character array in a pretty format.
@@ -4543,9 +4543,4 @@ void __kmp_balanced_affinity( int tid, int nthreads )
45434543

45444544
# endif /* KMP_MIC */
45454545

4546-
#elif KMP_OS_DARWIN
4547-
// affinity not supported
4548-
#else
4549-
#error "Unknown or unsupported OS"
4550-
#endif // KMP_OS_WINDOWS || KMP_OS_LINUX
4551-
4546+
#endif // KMP_AFFINITY_SUPPORTED

openmp/runtime/src/kmp_environment.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@
6666
#if KMP_OS_UNIX
6767
#include <stdlib.h> // getenv, setenv, unsetenv.
6868
#include <string.h> // strlen, strcpy.
69-
#if KMP_OS_LINUX
69+
#if KMP_OS_LINUX || KMP_OS_FREEBSD
7070
extern char * * environ;
7171
#elif KMP_OS_DARWIN
7272
#include <crt_externs.h>

openmp/runtime/src/kmp_ftn_entry.h

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -222,7 +222,7 @@ FTN_GET_LIBRARY (void)
222222
int FTN_STDCALL
223223
FTN_SET_AFFINITY( void **mask )
224224
{
225-
#if defined(KMP_STUB) || !(KMP_OS_WINDOWS || KMP_OS_LINUX)
225+
#if defined(KMP_STUB) || !KMP_AFFINITY_SUPPORTED
226226
return -1;
227227
#else
228228
if ( ! TCR_4(__kmp_init_middle) ) {
@@ -235,7 +235,7 @@ FTN_SET_AFFINITY( void **mask )
235235
int FTN_STDCALL
236236
FTN_GET_AFFINITY( void **mask )
237237
{
238-
#if defined(KMP_STUB) || !(KMP_OS_WINDOWS || KMP_OS_LINUX)
238+
#if defined(KMP_STUB) || !KMP_AFFINITY_SUPPORTED
239239
return -1;
240240
#else
241241
if ( ! TCR_4(__kmp_init_middle) ) {
@@ -248,7 +248,7 @@ FTN_GET_AFFINITY( void **mask )
248248
int FTN_STDCALL
249249
FTN_GET_AFFINITY_MAX_PROC( void )
250250
{
251-
#if defined(KMP_STUB) || !(KMP_OS_WINDOWS || KMP_OS_LINUX)
251+
#if defined(KMP_STUB) || !KMP_AFFINITY_SUPPORTED
252252
return 0;
253253
#else
254254
//
@@ -273,7 +273,7 @@ FTN_GET_AFFINITY_MAX_PROC( void )
273273
void FTN_STDCALL
274274
FTN_CREATE_AFFINITY_MASK( void **mask )
275275
{
276-
#if defined(KMP_STUB) || !(KMP_OS_WINDOWS || KMP_OS_LINUX)
276+
#if defined(KMP_STUB) || !KMP_AFFINITY_SUPPORTED
277277
*mask = NULL;
278278
#else
279279
//
@@ -290,7 +290,7 @@ FTN_CREATE_AFFINITY_MASK( void **mask )
290290
void FTN_STDCALL
291291
FTN_DESTROY_AFFINITY_MASK( void **mask )
292292
{
293-
#if defined(KMP_STUB) || !(KMP_OS_WINDOWS || KMP_OS_LINUX)
293+
#if defined(KMP_STUB) || !KMP_AFFINITY_SUPPORTED
294294
// Nothing
295295
#else
296296
//
@@ -312,7 +312,7 @@ FTN_DESTROY_AFFINITY_MASK( void **mask )
312312
int FTN_STDCALL
313313
FTN_SET_AFFINITY_MASK_PROC( int KMP_DEREF proc, void **mask )
314314
{
315-
#if defined(KMP_STUB) || !(KMP_OS_WINDOWS || KMP_OS_LINUX)
315+
#if defined(KMP_STUB) || !KMP_AFFINITY_SUPPORTED
316316
return -1;
317317
#else
318318
if ( ! TCR_4(__kmp_init_middle) ) {
@@ -325,7 +325,7 @@ FTN_SET_AFFINITY_MASK_PROC( int KMP_DEREF proc, void **mask )
325325
int FTN_STDCALL
326326
FTN_UNSET_AFFINITY_MASK_PROC( int KMP_DEREF proc, void **mask )
327327
{
328-
#if defined(KMP_STUB) || !(KMP_OS_WINDOWS || KMP_OS_LINUX)
328+
#if defined(KMP_STUB) || !KMP_AFFINITY_SUPPORTED
329329
return -1;
330330
#else
331331
if ( ! TCR_4(__kmp_init_middle) ) {
@@ -338,7 +338,7 @@ FTN_UNSET_AFFINITY_MASK_PROC( int KMP_DEREF proc, void **mask )
338338
int FTN_STDCALL
339339
FTN_GET_AFFINITY_MASK_PROC( int KMP_DEREF proc, void **mask )
340340
{
341-
#if defined(KMP_STUB) || !(KMP_OS_WINDOWS || KMP_OS_LINUX)
341+
#if defined(KMP_STUB) || !KMP_AFFINITY_SUPPORTED
342342
return -1;
343343
#else
344344
if ( ! TCR_4(__kmp_init_middle) ) {
@@ -408,7 +408,7 @@ xexpand(FTN_GET_THREAD_NUM)( void )
408408
#else
409409
int gtid;
410410

411-
#if KMP_OS_DARWIN
411+
#if KMP_OS_DARWIN || KMP_OS_FREEBSD
412412
gtid = __kmp_entry_gtid();
413413
#elif KMP_OS_WINDOWS
414414
if (!__kmp_init_parallel ||

openmp/runtime/src/kmp_i18n.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -815,7 +815,7 @@ sys_error(
815815
// not issue warning if strerror_r() returns `int' instead of expected `char *'.
816816
message = __kmp_str_format( "%s", err_msg );
817817

818-
#else // OS X*
818+
#else // OS X*, FreeBSD etc.
819819

820820
// XSI version of strerror_r.
821821

openmp/runtime/src/kmp_os.h

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -63,9 +63,10 @@
6363
/* ---------------------- Operating system recognition ------------------- */
6464

6565
#define KMP_OS_LINUX 0
66+
#define KMP_OS_FREEBSD 0
6667
#define KMP_OS_DARWIN 0
6768
#define KMP_OS_WINDOWS 0
68-
#define KMP_OS_UNIX 0 /* disjunction of KMP_OS_LINUX with KMP_OS_DARWIN */
69+
#define KMP_OS_UNIX 0 /* disjunction of KMP_OS_LINUX, KMP_OS_DARWIN etc. */
6970

7071
#define KMP_ARCH_X86 0
7172
#define KMP_ARCH_X86_64 0
@@ -85,11 +86,16 @@
8586
# define KMP_OS_LINUX 1
8687
#endif
8788

88-
#if (1 != KMP_OS_LINUX + KMP_OS_DARWIN + KMP_OS_WINDOWS)
89+
#if ( defined __FreeBSD__ )
90+
# undef KMP_OS_FREEBSD
91+
# define KMP_OS_FREEBSD 1
92+
#endif
93+
94+
#if (1 != KMP_OS_LINUX + KMP_OS_FREEBSD + KMP_OS_DARWIN + KMP_OS_WINDOWS)
8995
# error Unknown OS
9096
#endif
9197

92-
#if KMP_OS_LINUX || KMP_OS_DARWIN
98+
#if KMP_OS_LINUX || KMP_OS_FREEBSD || KMP_OS_DARWIN
9399
# undef KMP_OS_UNIX
94100
# define KMP_OS_UNIX 1
95101
#endif
@@ -498,7 +504,7 @@ extern kmp_real64 __kmp_xchg_real64( volatile kmp_real64 *p, kmp_real64 v );
498504
# define KMP_XCHG_REAL64(p, v) __kmp_xchg_real64( (p), (v) );
499505

500506

501-
#elif (KMP_ASM_INTRINS && (KMP_OS_LINUX || KMP_OS_DARWIN)) || !(KMP_ARCH_X86 || KMP_ARCH_X86_64)
507+
#elif (KMP_ASM_INTRINS && (KMP_OS_LINUX || KMP_OS_FREEBSD || KMP_OS_DARWIN)) || !(KMP_ARCH_X86 || KMP_ARCH_X86_64)
502508

503509
/* cast p to correct type so that proper intrinsic will be used */
504510
# define KMP_TEST_THEN_INC32(p) __sync_fetch_and_add( (kmp_int32 *)(p), 1 )
@@ -780,7 +786,7 @@ typedef void (*microtask_t)( int *gtid, int *npr, ... );
780786
// Warning levels
781787
enum kmp_warnings_level {
782788
kmp_warnings_off = 0, /* No warnings */
783-
kmp_warnings_low, /* Minimal warmings (default) */
789+
kmp_warnings_low, /* Minimal warnings (default) */
784790
kmp_warnings_explicit = 6, /* Explicitly set to ON - more warnings */
785791
kmp_warnings_verbose /* reserved */
786792
};

openmp/runtime/src/kmp_runtime.c

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4558,11 +4558,11 @@ __kmp_register_root( int initial_thread )
45584558
KMP_DEBUG_ASSERT( root->r.r_hot_team->t.t_bar[ bs_forkjoin_barrier ].b_arrived == KMP_INIT_BARRIER_STATE );
45594559

45604560

4561-
#if KMP_OS_WINDOWS || KMP_OS_LINUX
4561+
#if KMP_AFFINITY_SUPPORTED
45624562
if ( TCR_4(__kmp_init_middle) ) {
45634563
__kmp_affinity_set_init_mask( gtid, TRUE );
45644564
}
4565-
#endif /* KMP_OS_WINDOWS || KMP_OS_LINUX */
4565+
#endif /* KMP_AFFINITY_SUPPORTED */
45664566

45674567
__kmp_root_counter ++;
45684568

@@ -8150,9 +8150,9 @@ __kmp_cleanup( void )
81508150
}
81518151

81528152
if (TCR_4(__kmp_init_middle)) {
8153-
#if KMP_OS_WINDOWS || KMP_OS_LINUX
8153+
#if KMP_AFFINITY_SUPPORTED
81548154
__kmp_affinity_uninitialize();
8155-
#endif /* KMP_OS_WINDOWS || KMP_OS_LINUX */
8155+
#endif /* KMP_AFFINITY_SUPPORTED */
81568156
TCW_4(__kmp_init_middle, FALSE);
81578157
}
81588158

@@ -8452,7 +8452,7 @@ __kmp_determine_reduction_method( ident_t *loc, kmp_int32 global_tid,
84528452

84538453
#if KMP_ARCH_X86_64
84548454

8455-
#if KMP_OS_LINUX || KMP_OS_WINDOWS || KMP_OS_DARWIN
8455+
#if KMP_OS_LINUX || KMP_OS_FREEBSD || KMP_OS_WINDOWS || KMP_OS_DARWIN
84568456
#if KMP_MIC
84578457
#define REDUCTION_TEAMSIZE_CUTOFF 8
84588458
#else // KMP_MIC
@@ -8471,7 +8471,7 @@ __kmp_determine_reduction_method( ident_t *loc, kmp_int32 global_tid,
84718471
}
84728472
#else
84738473
#error "Unknown or unsupported OS"
8474-
#endif // KMP_OS_LINUX || KMP_OS_WINDOWS || KMP_OS_DARWIN
8474+
#endif // KMP_OS_LINUX || KMP_OS_FREEBSD || KMP_OS_WINDOWS || KMP_OS_DARWIN
84758475

84768476
#elif KMP_ARCH_X86 || KMP_ARCH_ARM
84778477

openmp/runtime/src/kmp_settings.c

Lines changed: 12 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1579,7 +1579,7 @@ __kmp_stg_parse_cpuinfo_file( char const * name, char const * value, void * data
15791579
#if KMP_OS_LINUX || KMP_OS_WINDOWS
15801580
__kmp_stg_parse_str( name, value, & __kmp_cpuinfo_file );
15811581
K_DIAG( 1, ( "__kmp_cpuinfo_file == %s\n", __kmp_cpuinfo_file ) );
1582-
#elif KMP_OS_DARWIN
1582+
#elif !KMP_AFFINITY_SUPPORTED
15831583
// affinity not supported
15841584
#else
15851585
#error "Unknown or unsupported OS"
@@ -3068,7 +3068,7 @@ __kmp_stg_print_topology_method( kmp_str_buf_t * buffer, char const * name,
30683068
# endif /* KMP_DEBUG */
30693069
} // __kmp_stg_print_topology_method
30703070

3071-
#elif KMP_OS_DARWIN
3071+
#elif !KMP_AFFINITY_SUPPORTED
30723072
// affinity not supported
30733073
#else
30743074
#error "Unknown or unsupported OS"
@@ -4429,7 +4429,7 @@ static kmp_setting_t __kmp_stg_table[] = {
44294429

44304430
{ "KMP_TOPOLOGY_METHOD", __kmp_stg_parse_topology_method, __kmp_stg_print_topology_method, NULL, 0, 0 },
44314431

4432-
#elif KMP_OS_DARWIN
4432+
#elif !KMP_AFFINITY_SUPPORTED
44334433

44344434
//
44354435
// KMP_AFFINITY is not supported on OS X*, nor is OMP_PLACES.
@@ -4686,7 +4686,7 @@ __kmp_stg_init( void
46864686
rivals[ i ++ ] = NULL;
46874687
}
46884688

4689-
#elif KMP_OS_DARWIN
4689+
#elif !KMP_AFFINITY_SUPPORTED
46904690
// KMP_AFFINITY not supported, so OMP_PROC_BIND has no rivals.
46914691
// OMP_PLACES not supported yet.
46924692
#else
@@ -4768,7 +4768,7 @@ __kmp_stg_check_rivals( // 0 -- Ok, 1 -- errors found.
47684768
for ( ; strcmp( rivals[ i ]->name, name ) != 0; i++ ) {
47694769
KMP_DEBUG_ASSERT( rivals[ i ] != NULL );
47704770

4771-
#if KMP_OS_LINUX || KMP_OS_WINDOWS
4771+
#if KMP_AFFINITY_SUPPORTED
47724772
if ( rivals[ i ] == __kmp_affinity_notype ) {
47734773
//
47744774
// If KMP_AFFINITY is specified without a type name,
@@ -4885,7 +4885,7 @@ __kmp_env_initialize( char const * string ) {
48854885
__kmp_stg_parse( name, value );
48864886
}; // if
48874887

4888-
#if KMP_OS_LINUX || KMP_OS_WINDOWS
4888+
#if KMP_AFFINITY_SUPPORTED
48894889
//
48904890
// Special case. KMP_AFFINITY is not a rival to other affinity env vars
48914891
// if no affinity type is specified. We want to allow
@@ -4928,7 +4928,7 @@ __kmp_env_initialize( char const * string ) {
49284928
}
49294929
# undef FIND
49304930
}
4931-
#endif /* KMP_OS_LINUX || KMP_OS_WINDOWS */
4931+
#endif /* KMP_AFFINITY_SUPPORTED */
49324932

49334933
#if OMP_40_ENABLED
49344934
//
@@ -4967,7 +4967,7 @@ __kmp_env_initialize( char const * string ) {
49674967
KMP_DEBUG_ASSERT( __kmp_user_lock_kind != lk_default );
49684968
}
49694969

4970-
#if KMP_OS_LINUX || KMP_OS_WINDOWS
4970+
#if KMP_AFFINITY_SUPPORTED
49714971
if ( ! TCR_4(__kmp_init_middle) ) {
49724972
//
49734973
// Determine if the machine/OS is actually capable of supporting
@@ -4999,10 +4999,10 @@ __kmp_env_initialize( char const * string ) {
49994999
}
50005000
else if ( __kmp_nested_proc_bind.bind_types[0] == proc_bind_default ) {
50015001
//
5002-
// On Windows* OS & Linux* OS, the default is to use the KMP_AFFINITY
5003-
// mechanism. On OS X*, it is none.
5002+
// Where supported the default is to use the KMP_AFFINITY
5003+
// mechanism. On OS X* etc. it is none.
50045004
//
5005-
# if KMP_OS_WINDOWS || KMP_OS_LINUX
5005+
# if KMP_AFFINITY_SUPPORTED
50065006
__kmp_nested_proc_bind.bind_types[0] = proc_bind_intel;
50075007
# else
50085008
__kmp_nested_proc_bind.bind_types[0] = proc_bind_false;
@@ -5136,11 +5136,7 @@ __kmp_env_initialize( char const * string ) {
51365136
# endif
51375137
}
51385138

5139-
#elif KMP_OS_DARWIN
5140-
// affinity not supported
5141-
#else
5142-
#error "Unknown or unsupported OS"
5143-
#endif /* KMP_OS_LINUX || KMP_OS_WINDOWS */
5139+
#endif /* KMP_AFFINITY_SUPPORTED */
51445140

51455141
if ( __kmp_version ) {
51465142
__kmp_print_version_1();

openmp/runtime/src/kmp_version.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -169,7 +169,7 @@ __kmp_print_version_1( void )
169169
& buffer,
170170
"%sthread affinity support: %s\n",
171171
KMP_VERSION_PREF_STR,
172-
#if KMP_OS_WINDOWS || KMP_OS_LINUX
172+
#if KMP_AFFINITY_SUPPORTED
173173
(
174174
KMP_AFFINITY_CAPABLE()
175175
?

0 commit comments

Comments
 (0)