blob: 429253d3b1ab1c95aebf9127b42a0de898f91052 [file] [log] [blame]
Jim Cownie5e8470a2013-09-27 10:38:44 +00001/*
2 * kmp_stub.c -- stub versions of user-callable OpenMP RT functions.
Jim Cownie5e8470a2013-09-27 10:38:44 +00003 */
4
5
6//===----------------------------------------------------------------------===//
7//
8// The LLVM Compiler Infrastructure
9//
10// This file is dual licensed under the MIT and the University of Illinois Open
11// Source Licenses. See LICENSE.txt for details.
12//
13//===----------------------------------------------------------------------===//
14
15
Jim Cownie5e8470a2013-09-27 10:38:44 +000016#include <stdlib.h>
17#include <limits.h>
18#include <errno.h>
19
Jim Cownie4cc4bb42014-10-07 16:25:50 +000020#include "omp.h" // Function renamings.
21#include "kmp.h" // KMP_DEFAULT_STKSIZE
22#include "kmp_stub.h"
Jim Cownie5e8470a2013-09-27 10:38:44 +000023
24#if KMP_OS_WINDOWS
25 #include <windows.h>
26#else
27 #include <sys/time.h>
28#endif
29
Jim Cownie181b4bb2013-12-23 17:28:57 +000030// Moved from omp.h
Jim Cownie181b4bb2013-12-23 17:28:57 +000031#define omp_set_max_active_levels ompc_set_max_active_levels
32#define omp_set_schedule ompc_set_schedule
33#define omp_get_ancestor_thread_num ompc_get_ancestor_thread_num
34#define omp_get_team_size ompc_get_team_size
35
Jim Cownie181b4bb2013-12-23 17:28:57 +000036#define omp_set_num_threads ompc_set_num_threads
37#define omp_set_dynamic ompc_set_dynamic
38#define omp_set_nested ompc_set_nested
39#define kmp_set_stacksize kmpc_set_stacksize
40#define kmp_set_stacksize_s kmpc_set_stacksize_s
41#define kmp_set_blocktime kmpc_set_blocktime
42#define kmp_set_library kmpc_set_library
43#define kmp_set_defaults kmpc_set_defaults
44#define kmp_malloc kmpc_malloc
Jonathan Peytonf83ae312016-05-12 22:00:37 +000045#define kmp_aligned_malloc kmpc_aligned_malloc
Jim Cownie181b4bb2013-12-23 17:28:57 +000046#define kmp_calloc kmpc_calloc
47#define kmp_realloc kmpc_realloc
48#define kmp_free kmpc_free
Jim Cownie5e8470a2013-09-27 10:38:44 +000049
50static double frequency = 0.0;
51
52// Helper functions.
53static size_t __kmps_init() {
54 static int initialized = 0;
55 static size_t dummy = 0;
56 if ( ! initialized ) {
57
58 // TODO: Analyze KMP_VERSION environment variable, print __kmp_version_copyright and
59 // __kmp_version_build_time.
60 // WARNING: Do not use "fprintf( stderr, ... )" because it will cause unresolved "__iob"
61 // symbol (see C70080). We need to extract __kmp_printf() stuff from kmp_runtime.c and use
62 // it.
63
64 // Trick with dummy variable forces linker to keep __kmp_version_copyright and
65 // __kmp_version_build_time strings in executable file (in case of static linkage).
66 // When KMP_VERSION analyze is implemented, dummy variable should be deleted, function
67 // should return void.
68 dummy = __kmp_version_copyright - __kmp_version_build_time;
69
70 #if KMP_OS_WINDOWS
71 LARGE_INTEGER freq;
72 BOOL status = QueryPerformanceFrequency( & freq );
73 if ( status ) {
74 frequency = double( freq.QuadPart );
75 }; // if
76 #endif
77
78 initialized = 1;
79 }; // if
80 return dummy;
81}; // __kmps_init
82
83#define i __kmps_init();
84
85/* set API functions */
86void omp_set_num_threads( omp_int_t num_threads ) { i; }
87void omp_set_dynamic( omp_int_t dynamic ) { i; __kmps_set_dynamic( dynamic ); }
88void omp_set_nested( omp_int_t nested ) { i; __kmps_set_nested( nested ); }
Jim Cownie4cc4bb42014-10-07 16:25:50 +000089void omp_set_max_active_levels( omp_int_t max_active_levels ) { i; }
90void omp_set_schedule( omp_sched_t kind, omp_int_t modifier ) { i; __kmps_set_schedule( (kmp_sched_t)kind, modifier ); }
91int omp_get_ancestor_thread_num( omp_int_t level ) { i; return ( level ) ? ( -1 ) : ( 0 ); }
92int omp_get_team_size( omp_int_t level ) { i; return ( level ) ? ( -1 ) : ( 1 ); }
93int kmpc_set_affinity_mask_proc( int proc, void **mask ) { i; return -1; }
94int kmpc_unset_affinity_mask_proc( int proc, void **mask ) { i; return -1; }
95int kmpc_get_affinity_mask_proc( int proc, void **mask ) { i; return -1; }
Jim Cownie5e8470a2013-09-27 10:38:44 +000096
97/* kmp API functions */
98void kmp_set_stacksize( omp_int_t arg ) { i; __kmps_set_stacksize( arg ); }
99void kmp_set_stacksize_s( size_t arg ) { i; __kmps_set_stacksize( arg ); }
100void kmp_set_blocktime( omp_int_t arg ) { i; __kmps_set_blocktime( arg ); }
101void kmp_set_library( omp_int_t arg ) { i; __kmps_set_library( arg ); }
102void kmp_set_defaults( char const * str ) { i; }
103
104/* KMP memory management functions. */
105void * kmp_malloc( size_t size ) { i; return malloc( size ); }
Jonathan Peytonf83ae312016-05-12 22:00:37 +0000106void * kmp_aligned_malloc( size_t sz, size_t a ) {
107 i;
108#if KMP_OS_WINDOWS
109 errno = ENOSYS; // not supported
110 return NULL; // no standard aligned allocator on Windows (pre - C11)
111#else
112 void **res;
113 errno = posix_memalign( res, a, sz );
114 return *res;
115#endif
116}
Jim Cownie5e8470a2013-09-27 10:38:44 +0000117void * kmp_calloc( size_t nelem, size_t elsize ) { i; return calloc( nelem, elsize ); }
118void * kmp_realloc( void *ptr, size_t size ) { i; return realloc( ptr, size ); }
119void kmp_free( void * ptr ) { i; free( ptr ); }
120
121static int __kmps_blocktime = INT_MAX;
122
123void __kmps_set_blocktime( int arg ) {
124 i;
125 __kmps_blocktime = arg;
126} // __kmps_set_blocktime
127
128int __kmps_get_blocktime( void ) {
129 i;
130 return __kmps_blocktime;
131} // __kmps_get_blocktime
132
133static int __kmps_dynamic = 0;
134
135void __kmps_set_dynamic( int arg ) {
136 i;
137 __kmps_dynamic = arg;
138} // __kmps_set_dynamic
139
140int __kmps_get_dynamic( void ) {
141 i;
142 return __kmps_dynamic;
143} // __kmps_get_dynamic
144
145static int __kmps_library = 1000;
146
147void __kmps_set_library( int arg ) {
148 i;
149 __kmps_library = arg;
150} // __kmps_set_library
151
152int __kmps_get_library( void ) {
153 i;
154 return __kmps_library;
155} // __kmps_get_library
156
157static int __kmps_nested = 0;
158
159void __kmps_set_nested( int arg ) {
160 i;
161 __kmps_nested = arg;
162} // __kmps_set_nested
163
164int __kmps_get_nested( void ) {
165 i;
166 return __kmps_nested;
167} // __kmps_get_nested
168
169static size_t __kmps_stacksize = KMP_DEFAULT_STKSIZE;
170
171void __kmps_set_stacksize( int arg ) {
172 i;
173 __kmps_stacksize = arg;
174} // __kmps_set_stacksize
175
176int __kmps_get_stacksize( void ) {
177 i;
178 return __kmps_stacksize;
179} // __kmps_get_stacksize
180
Jim Cownie5e8470a2013-09-27 10:38:44 +0000181static kmp_sched_t __kmps_sched_kind = kmp_sched_default;
182static int __kmps_sched_modifier = 0;
183
184 void __kmps_set_schedule( kmp_sched_t kind, int modifier ) {
185 i;
186 __kmps_sched_kind = kind;
187 __kmps_sched_modifier = modifier;
188 } // __kmps_set_schedule
189
190 void __kmps_get_schedule( kmp_sched_t *kind, int *modifier ) {
191 i;
192 *kind = __kmps_sched_kind;
193 *modifier = __kmps_sched_modifier;
194 } // __kmps_get_schedule
195
Jim Cownie5e8470a2013-09-27 10:38:44 +0000196#if OMP_40_ENABLED
197
198static kmp_proc_bind_t __kmps_proc_bind = proc_bind_false;
199
200void __kmps_set_proc_bind( kmp_proc_bind_t arg ) {
201 i;
202 __kmps_proc_bind = arg;
203} // __kmps_set_proc_bind
204
205kmp_proc_bind_t __kmps_get_proc_bind( void ) {
206 i;
207 return __kmps_proc_bind;
208} // __kmps_get_proc_bind
209
210#endif /* OMP_40_ENABLED */
211
212double __kmps_get_wtime( void ) {
213 // Elapsed wall clock time (in second) from "sometime in the past".
214 double wtime = 0.0;
215 i;
216 #if KMP_OS_WINDOWS
217 if ( frequency > 0.0 ) {
218 LARGE_INTEGER now;
219 BOOL status = QueryPerformanceCounter( & now );
220 if ( status ) {
221 wtime = double( now.QuadPart ) / frequency;
222 }; // if
223 }; // if
224 #else
Jonathan Peyton1406f012015-05-22 22:35:51 +0000225 // gettimeofday() returns seconds and microseconds since the Epoch.
Jim Cownie5e8470a2013-09-27 10:38:44 +0000226 struct timeval tval;
227 int rc;
228 rc = gettimeofday( & tval, NULL );
229 if ( rc == 0 ) {
230 wtime = (double)( tval.tv_sec ) + 1.0E-06 * (double)( tval.tv_usec );
231 } else {
232 // TODO: Assert or abort here.
233 }; // if
234 #endif
235 return wtime;
236}; // __kmps_get_wtime
237
238double __kmps_get_wtick( void ) {
239 // Number of seconds between successive clock ticks.
240 double wtick = 0.0;
241 i;
242 #if KMP_OS_WINDOWS
243 {
244 DWORD increment;
245 DWORD adjustment;
246 BOOL disabled;
247 BOOL rc;
248 rc = GetSystemTimeAdjustment( & adjustment, & increment, & disabled );
249 if ( rc ) {
250 wtick = 1.0E-07 * (double)( disabled ? increment : adjustment );
251 } else {
252 // TODO: Assert or abort here.
253 wtick = 1.0E-03;
254 }; // if
255 }
256 #else
257 // TODO: gettimeofday() returns in microseconds, but what the precision?
258 wtick = 1.0E-06;
259 #endif
260 return wtick;
261}; // __kmps_get_wtick
262
Jim Cownie5e8470a2013-09-27 10:38:44 +0000263// end of file //
264