blob: 11b7cb60c2c7a4c0b6b51071d2cf5228b9964942 [file] [log] [blame]
Jim Cownie5e8470a2013-09-27 10:38:44 +00001/*
Jonathan Peytonde4749b2016-12-14 23:01:24 +00002 * kmp_stub.cpp -- 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
Jonathan Peyton067325f2016-05-31 19:01:15 +000044#define kmp_set_disp_num_buffers kmpc_set_disp_num_buffers
Jim Cownie181b4bb2013-12-23 17:28:57 +000045#define kmp_malloc kmpc_malloc
Jonathan Peytonf83ae312016-05-12 22:00:37 +000046#define kmp_aligned_malloc kmpc_aligned_malloc
Jim Cownie181b4bb2013-12-23 17:28:57 +000047#define kmp_calloc kmpc_calloc
48#define kmp_realloc kmpc_realloc
49#define kmp_free kmpc_free
Jim Cownie5e8470a2013-09-27 10:38:44 +000050
51static double frequency = 0.0;
52
53// Helper functions.
54static size_t __kmps_init() {
55 static int initialized = 0;
56 static size_t dummy = 0;
57 if ( ! initialized ) {
58
Jonathan Peytonde4749b2016-12-14 23:01:24 +000059 // TODO: Analyze KMP_VERSION environment variable, print
60 // __kmp_version_copyright and __kmp_version_build_time.
61 // WARNING: Do not use "fprintf( stderr, ... )" because it will cause
62 // unresolved "__iob" symbol (see C70080). We need to extract
63 // __kmp_printf() stuff from kmp_runtime.cpp and use it.
Jim Cownie5e8470a2013-09-27 10:38:44 +000064
Jonathan Peytonde4749b2016-12-14 23:01:24 +000065 // Trick with dummy variable forces linker to keep __kmp_version_copyright
66 // and __kmp_version_build_time strings in executable file (in case of
67 // static linkage). When KMP_VERSION analysis is implemented, dummy
68 // variable should be deleted, function should return void.
Jim Cownie5e8470a2013-09-27 10:38:44 +000069 dummy = __kmp_version_copyright - __kmp_version_build_time;
70
71 #if KMP_OS_WINDOWS
72 LARGE_INTEGER freq;
73 BOOL status = QueryPerformanceFrequency( & freq );
74 if ( status ) {
75 frequency = double( freq.QuadPart );
76 }; // if
77 #endif
78
79 initialized = 1;
80 }; // if
81 return dummy;
82}; // __kmps_init
83
84#define i __kmps_init();
85
86/* set API functions */
87void omp_set_num_threads( omp_int_t num_threads ) { i; }
88void omp_set_dynamic( omp_int_t dynamic ) { i; __kmps_set_dynamic( dynamic ); }
89void omp_set_nested( omp_int_t nested ) { i; __kmps_set_nested( nested ); }
Jim Cownie4cc4bb42014-10-07 16:25:50 +000090void omp_set_max_active_levels( omp_int_t max_active_levels ) { i; }
91void omp_set_schedule( omp_sched_t kind, omp_int_t modifier ) { i; __kmps_set_schedule( (kmp_sched_t)kind, modifier ); }
92int omp_get_ancestor_thread_num( omp_int_t level ) { i; return ( level ) ? ( -1 ) : ( 0 ); }
93int omp_get_team_size( omp_int_t level ) { i; return ( level ) ? ( -1 ) : ( 1 ); }
94int kmpc_set_affinity_mask_proc( int proc, void **mask ) { i; return -1; }
95int kmpc_unset_affinity_mask_proc( int proc, void **mask ) { i; return -1; }
96int kmpc_get_affinity_mask_proc( int proc, void **mask ) { i; return -1; }
Jim Cownie5e8470a2013-09-27 10:38:44 +000097
98/* kmp API functions */
99void kmp_set_stacksize( omp_int_t arg ) { i; __kmps_set_stacksize( arg ); }
100void kmp_set_stacksize_s( size_t arg ) { i; __kmps_set_stacksize( arg ); }
101void kmp_set_blocktime( omp_int_t arg ) { i; __kmps_set_blocktime( arg ); }
102void kmp_set_library( omp_int_t arg ) { i; __kmps_set_library( arg ); }
103void kmp_set_defaults( char const * str ) { i; }
Jonathan Peyton067325f2016-05-31 19:01:15 +0000104void kmp_set_disp_num_buffers( omp_int_t arg ) { i; }
Jim Cownie5e8470a2013-09-27 10:38:44 +0000105
106/* KMP memory management functions. */
107void * kmp_malloc( size_t size ) { i; return malloc( size ); }
Jonathan Peytonf83ae312016-05-12 22:00:37 +0000108void * kmp_aligned_malloc( size_t sz, size_t a ) {
109 i;
110#if KMP_OS_WINDOWS
111 errno = ENOSYS; // not supported
112 return NULL; // no standard aligned allocator on Windows (pre - C11)
113#else
Jonathan Peyton5a276c42016-06-21 15:39:08 +0000114 void *res;
115 int err;
116 if( err = posix_memalign( &res, a, sz ) ) {
117 errno = err; // can be EINVAL or ENOMEM
118 return NULL;
119 }
120 return res;
Jonathan Peytonf83ae312016-05-12 22:00:37 +0000121#endif
122}
Jim Cownie5e8470a2013-09-27 10:38:44 +0000123void * kmp_calloc( size_t nelem, size_t elsize ) { i; return calloc( nelem, elsize ); }
124void * kmp_realloc( void *ptr, size_t size ) { i; return realloc( ptr, size ); }
125void kmp_free( void * ptr ) { i; free( ptr ); }
126
127static int __kmps_blocktime = INT_MAX;
128
129void __kmps_set_blocktime( int arg ) {
130 i;
131 __kmps_blocktime = arg;
132} // __kmps_set_blocktime
133
134int __kmps_get_blocktime( void ) {
135 i;
136 return __kmps_blocktime;
137} // __kmps_get_blocktime
138
139static int __kmps_dynamic = 0;
140
141void __kmps_set_dynamic( int arg ) {
142 i;
143 __kmps_dynamic = arg;
144} // __kmps_set_dynamic
145
146int __kmps_get_dynamic( void ) {
147 i;
148 return __kmps_dynamic;
149} // __kmps_get_dynamic
150
151static int __kmps_library = 1000;
152
153void __kmps_set_library( int arg ) {
154 i;
155 __kmps_library = arg;
156} // __kmps_set_library
157
158int __kmps_get_library( void ) {
159 i;
160 return __kmps_library;
161} // __kmps_get_library
162
163static int __kmps_nested = 0;
164
165void __kmps_set_nested( int arg ) {
166 i;
167 __kmps_nested = arg;
168} // __kmps_set_nested
169
170int __kmps_get_nested( void ) {
171 i;
172 return __kmps_nested;
173} // __kmps_get_nested
174
175static size_t __kmps_stacksize = KMP_DEFAULT_STKSIZE;
176
177void __kmps_set_stacksize( int arg ) {
178 i;
179 __kmps_stacksize = arg;
180} // __kmps_set_stacksize
181
182int __kmps_get_stacksize( void ) {
183 i;
184 return __kmps_stacksize;
185} // __kmps_get_stacksize
186
Jim Cownie5e8470a2013-09-27 10:38:44 +0000187static kmp_sched_t __kmps_sched_kind = kmp_sched_default;
188static int __kmps_sched_modifier = 0;
189
190 void __kmps_set_schedule( kmp_sched_t kind, int modifier ) {
191 i;
192 __kmps_sched_kind = kind;
193 __kmps_sched_modifier = modifier;
194 } // __kmps_set_schedule
195
196 void __kmps_get_schedule( kmp_sched_t *kind, int *modifier ) {
197 i;
198 *kind = __kmps_sched_kind;
199 *modifier = __kmps_sched_modifier;
200 } // __kmps_get_schedule
201
Jim Cownie5e8470a2013-09-27 10:38:44 +0000202#if OMP_40_ENABLED
203
204static kmp_proc_bind_t __kmps_proc_bind = proc_bind_false;
205
206void __kmps_set_proc_bind( kmp_proc_bind_t arg ) {
207 i;
208 __kmps_proc_bind = arg;
209} // __kmps_set_proc_bind
210
211kmp_proc_bind_t __kmps_get_proc_bind( void ) {
212 i;
213 return __kmps_proc_bind;
214} // __kmps_get_proc_bind
215
216#endif /* OMP_40_ENABLED */
217
218double __kmps_get_wtime( void ) {
219 // Elapsed wall clock time (in second) from "sometime in the past".
220 double wtime = 0.0;
221 i;
222 #if KMP_OS_WINDOWS
223 if ( frequency > 0.0 ) {
224 LARGE_INTEGER now;
225 BOOL status = QueryPerformanceCounter( & now );
226 if ( status ) {
227 wtime = double( now.QuadPart ) / frequency;
228 }; // if
229 }; // if
230 #else
Jonathan Peyton1406f012015-05-22 22:35:51 +0000231 // gettimeofday() returns seconds and microseconds since the Epoch.
Jim Cownie5e8470a2013-09-27 10:38:44 +0000232 struct timeval tval;
233 int rc;
234 rc = gettimeofday( & tval, NULL );
235 if ( rc == 0 ) {
236 wtime = (double)( tval.tv_sec ) + 1.0E-06 * (double)( tval.tv_usec );
237 } else {
238 // TODO: Assert or abort here.
239 }; // if
240 #endif
241 return wtime;
242}; // __kmps_get_wtime
243
244double __kmps_get_wtick( void ) {
245 // Number of seconds between successive clock ticks.
246 double wtick = 0.0;
247 i;
248 #if KMP_OS_WINDOWS
249 {
250 DWORD increment;
251 DWORD adjustment;
252 BOOL disabled;
253 BOOL rc;
254 rc = GetSystemTimeAdjustment( & adjustment, & increment, & disabled );
255 if ( rc ) {
256 wtick = 1.0E-07 * (double)( disabled ? increment : adjustment );
257 } else {
258 // TODO: Assert or abort here.
259 wtick = 1.0E-03;
260 }; // if
261 }
262 #else
263 // TODO: gettimeofday() returns in microseconds, but what the precision?
264 wtick = 1.0E-06;
265 #endif
266 return wtick;
267}; // __kmps_get_wtick
268
Jim Cownie5e8470a2013-09-27 10:38:44 +0000269// end of file //
270