00001 /* 00002 00003 OpenMP runtime library to be used in conjunction with Open64 Compiler Suites. 00004 00005 Copyright (C) 2003 - 2009 Tsinghua University. 00006 00007 This library is free software; you can redistribute it and/or 00008 modify it under the terms of the GNU Lesser General Public 00009 License as published by the Free Software Foundation; either 00010 version 2.1 of the License, or (at your option) any later version. 00011 00012 This library is distributed in the hope that it will be useful, 00013 but WITHOUT ANY WARRANTY; without even the implied warranty of 00014 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00015 Lesser General Public License for more details. 00016 00017 You should have received a copy of the GNU Lesser General Public 00018 License along with this library; if not, write to the Free Software 00019 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 00020 00021 Contact information: HPC Institute, Department of Computer Science and Technology, 00022 Tsinghua University, Beijing 100084, CHINA, or: 00023 00024 http://hpc.cs.tsinghua.edu.cn 00025 00026 */ 00027 00028 /* 00029 * File: omp_lib.c 00030 * Abstract: implementation of OpenMP run-time library subroutines 00031 * for OpenMP programmer 00032 * History: 04/23/2003, built by Jiang Hongshan, Tsinghua Univ. 00033 * 00034 */ 00035 00036 #include <stdlib.h> 00037 00038 #include "omp_rtl.h" 00039 #include "omp_lock.h" 00040 00041 #include <sys/time.h> 00042 00043 void 00044 __omp_fatal(char *msg) 00045 { 00046 fprintf(stderr, "OpenMP Run-time Library FATAL error:\n %s\n", msg); 00047 exit(-1); 00048 } 00049 00050 00051 /* 00052 * OpenMP standard library function 00053 */ 00054 00055 inline void 00056 omp_set_num_threads(omp_int_t num) 00057 { 00058 __ompc_set_num_threads(num); 00059 } 00060 00061 00062 void omp_set_num_threads_(omp_int_t); 00063 00064 #pragma weak omp_set_num_threads_ = omp_set_num_threads 00065 00066 inline omp_int_t 00067 omp_get_num_threads(void) 00068 { 00069 return (omp_int_t)__ompc_get_num_threads(); 00070 } 00071 00072 00073 omp_int_t omp_get_num_threads_(void); 00074 #pragma weak omp_get_num_threads_ = omp_get_num_threads 00075 00076 inline omp_int_t 00077 omp_get_max_threads(void) 00078 { 00079 return (omp_int_t)__ompc_get_max_threads(); 00080 } 00081 00082 00083 omp_int_t omp_get_max_threads_(void); 00084 #pragma weak omp_get_max_threads_ = omp_get_max_threads 00085 00086 inline omp_int_t 00087 omp_get_thread_num(void) 00088 { 00089 return (omp_int_t)__ompc_get_local_thread_num(); 00090 } 00091 00092 00093 omp_int_t omp_get_thread_num_(void); 00094 #pragma weak omp_get_thread_num_ = omp_get_thread_num 00095 00096 inline omp_int_t 00097 omp_get_num_procs(void) 00098 { 00099 return (omp_int_t)__ompc_get_num_procs(); 00100 } 00101 00102 00103 omp_int_t omp_get_num_procs_(void); 00104 #pragma weak omp_get_num_procs_ = omp_get_num_procs 00105 inline omp_int_t 00106 omp_in_parallel(void) 00107 { 00108 return (omp_int_t)__ompc_in_parallel(); 00109 } 00110 00111 00112 omp_int_t omp_in_parallel_(void); 00113 #pragma weak omp_in_parallel_ = omp_in_parallel 00114 00115 inline void 00116 omp_set_dynamic(omp_int_t dynamic) 00117 { 00118 __ompc_set_dynamic(dynamic); 00119 } 00120 00121 00122 void omp_set_dynamic_(omp_int_t); 00123 #pragma weak omp_set_dynamic_ = omp_set_dynamic 00124 00125 inline omp_int_t 00126 omp_get_dynamic(void) 00127 { 00128 return (omp_int_t)__ompc_get_dynamic(); 00129 } 00130 00131 00132 omp_int_t omp_get_dynamic_(void); 00133 #pragma weak omp_get_dynamic_ = omp_get_dynamic 00134 00135 inline void 00136 omp_set_nested(omp_int_t nested) 00137 { 00138 __ompc_set_nested(nested); 00139 } 00140 00141 00142 void omp_set_nested_(omp_int_t); 00143 #pragma weak omp_set_nested_ = omp_set_nested 00144 00145 00146 inline omp_int_t 00147 omp_get_nested(void) 00148 { 00149 return (omp_int_t)__ompc_get_nested(); 00150 } 00151 00152 omp_int_t omp_get_nested_(void); 00153 #pragma weak omp_get_nested_ = omp_get_nested 00154 /* 00155 * Lock Functions 00156 */ 00157 inline void 00158 omp_init_lock(volatile omp_lock_t *lock) 00159 { 00160 ompc_lock_t *tmp_lp = malloc(sizeof(ompc_lock_t)); 00161 __ompc_init_lock(tmp_lp); 00162 (*lock) = (omp_lock_t*)tmp_lp; 00163 } 00164 00165 00166 void omp_init_lock_(volatile omp_lock_t *); 00167 #pragma weak omp_init_lock_ = omp_init_lock 00168 00169 inline void 00170 omp_init_nest_lock(volatile omp_nest_lock_t *lock) 00171 { 00172 ompc_nest_lock_t *tmp_lp = malloc(sizeof(ompc_nest_lock_t)); 00173 __ompc_init_nest_lock(tmp_lp); 00174 (*lock) = (omp_lock_t*)tmp_lp; 00175 } 00176 00177 00178 void omp_init_nest_lock_(volatile omp_nest_lock_t *); 00179 #pragma weak omp_init_nest_lock_ = omp_init_nest_lock 00180 00181 inline void 00182 omp_destroy_lock(volatile omp_lock_t *lock) 00183 { 00184 __ompc_destroy_lock((ompc_lock_t*)(*lock)); 00185 free((ompc_lock_t*)(*lock)); 00186 } 00187 00188 00189 void omp_destroy_lock_(volatile omp_lock_t *); 00190 #pragma weak omp_destroy_lock_ = omp_destroy_lock 00191 inline void 00192 omp_destroy_nest_lock(volatile omp_nest_lock_t *lock) 00193 { 00194 __ompc_destroy_nest_lock((ompc_nest_lock_t*)(*lock)); 00195 free((ompc_nest_lock_t*)(*lock)); 00196 } 00197 00198 00199 void omp_destroy_nest_lock_(volatile omp_nest_lock_t *); 00200 #pragma weak omp_destroy_nest_lock_ = omp_destroy_nest_lock 00201 inline void 00202 omp_set_lock(volatile omp_lock_t *lock) 00203 { 00204 __ompc_lock((ompc_lock_t*)(*lock)); 00205 } 00206 00207 00208 void omp_set_lock_(volatile omp_lock_t *); 00209 #pragma weak omp_set_lock_ = omp_set_lock 00210 inline void 00211 omp_set_nest_lock(volatile omp_nest_lock_t *lock) 00212 { 00213 __ompc_nest_lock((ompc_nest_lock_t*)(*lock)); 00214 } 00215 00216 00217 void omp_set_nest_lock_(volatile omp_nest_lock_t *); 00218 #pragma weak omp_set_nest_lock_ = omp_set_nest_lock 00219 inline void 00220 omp_unset_lock(volatile omp_lock_t *lock) 00221 { 00222 __ompc_unlock((ompc_lock_t*)(*lock)); 00223 } 00224 00225 00226 void omp_unset_lock_(volatile omp_lock_t *); 00227 #pragma weak omp_unset_lock_ = omp_unset_lock 00228 inline void 00229 omp_unset_nest_lock(volatile omp_nest_lock_t *lock) 00230 { 00231 __ompc_nest_unlock((ompc_nest_lock_t*)(*lock)); 00232 } 00233 00234 00235 void omp_unset_nest_lock_(volatile omp_nest_lock_t *); 00236 #pragma weak omp_unset_nest_lock_ = omp_unset_nest_lock 00237 inline int 00238 omp_test_lock(volatile omp_lock_t *lock) 00239 { 00240 return __ompc_test_lock((ompc_lock_t*)(*lock)); 00241 } 00242 00243 00244 int omp_test_lock_(volatile omp_lock_t *); 00245 #pragma weak omp_test_lock_ = omp_test_lock 00246 inline int 00247 omp_test_nest_lock(volatile omp_nest_lock_t *lock){ 00248 return __ompc_test_nest_lock((ompc_nest_lock_t*)(*lock)); 00249 } 00250 00251 00252 int omp_test_nest_lock_(volatile omp_nest_lock_t *); 00253 #pragma weak omp_test_nest_lock_ = omp_test_nest_lock 00254 /* 00255 * Timer function 00256 */ 00257 omp_wtime_t 00258 omp_get_wtime(void) 00259 { 00260 struct timeval tval; 00261 00262 gettimeofday(&tval, NULL); 00263 return (omp_wtime_t)( (double)tval.tv_sec + 1.0e-6 * (double)tval.tv_usec ); 00264 } 00265 00266 omp_wtime_t omp_get_wtime_(void); 00267 #pragma weak omp_get_wtime_ = omp_get_wtime 00268 00269 00270 omp_wtime_t omp_get_wtime__(void); 00271 #pragma weak omp_get_wtime__ = omp_get_wtime 00272 00273 omp_wtime_t 00274 omp_get_wtick(void) 00275 { 00276 double t1, t2; 00277 00278 t1 = omp_get_wtime(); 00279 do { 00280 t2 = omp_get_wtime(); 00281 } while(t1 == t2); 00282 00283 return (omp_wtime_t)(t2 - t1); 00284 } 00285 00286 00287 omp_wtime_t omp_get_wtick_(void); 00288 #pragma weak omp_get_wtick_ = omp_get_wtick 00289 00290 00291 omp_wtime_t omp_get_wtick__(void); 00292 #pragma weak omp_get_wtick__ = omp_get_wtick
1.5.6