19 #ifndef __STARPU_UTIL_H__ 20 #define __STARPU_UTIL_H__ 38 #if defined __GNUC__ && defined __GNUC_MINOR__ 39 # define STARPU_GNUC_PREREQ(maj, min) \ 40 ((__GNUC__ << 16) + __GNUC_MINOR__ >= ((maj) << 16) + (min)) 42 # define STARPU_GNUC_PREREQ(maj, min) 0 46 # define STARPU_UNLIKELY(expr) (__builtin_expect(!!(expr),0)) 47 # define STARPU_LIKELY(expr) (__builtin_expect(!!(expr),1)) 48 # define STARPU_ATTRIBUTE_UNUSED __attribute__((unused)) 49 # define STARPU_ATTRIBUTE_NORETURN __attribute__((noreturn)) 50 # define STARPU_ATTRIBUTE_INTERNAL __attribute__ ((visibility ("internal"))) 51 # define STARPU_ATTRIBUTE_MALLOC __attribute__((malloc)) 52 # define STARPU_ATTRIBUTE_WARN_UNUSED_RESULT __attribute__((warn_unused_result)) 53 # define STARPU_ATTRIBUTE_PURE __attribute__((pure)) 54 # define STARPU_ATTRIBUTE_ALIGNED(size) __attribute__((aligned(size))) 55 # define STARPU_ATTRIBUTE_FORMAT(type, string, first) __attribute__((format(type, string, first))) 57 # define STARPU_UNLIKELY(expr) (expr) 58 # define STARPU_LIKELY(expr) (expr) 59 # define STARPU_ATTRIBUTE_UNUSED 60 # define STARPU_ATTRIBUTE_NORETURN 61 # define STARPU_ATTRIBUTE_INTERNAL 62 # define STARPU_ATTRIBUTE_MALLOC 63 # define STARPU_ATTRIBUTE_WARN_UNUSED_RESULT 64 # define STARPU_ATTRIBUTE_PURE 65 # define STARPU_ATTRIBUTE_ALIGNED(size) 66 # define STARPU_ATTRIBUTE_FORMAT(type, string, first) 71 #if defined(c_plusplus) || defined(__cplusplus) 72 # define STARPU_INLINE inline 73 #elif defined(_MSC_VER) || defined(__HP_cc) 74 # define STARPU_INLINE __inline 76 # define STARPU_INLINE __inline__ 79 #if STARPU_GNUC_PREREQ(4, 3) 80 # define STARPU_ATTRIBUTE_CALLOC_SIZE(num,size) __attribute__((alloc_size(num,size))) 81 # define STARPU_ATTRIBUTE_ALLOC_SIZE(size) __attribute__((alloc_size(size))) 83 # define STARPU_ATTRIBUTE_CALLOC_SIZE(num,size) 84 # define STARPU_ATTRIBUTE_ALLOC_SIZE(size) 87 #if STARPU_GNUC_PREREQ(3, 1) && !defined(BUILDING_STARPU) && !defined(STARPU_USE_DEPRECATED_API) && !defined(STARPU_USE_DEPRECATED_ONE_ZERO_API) 88 #define STARPU_DEPRECATED __attribute__((__deprecated__)) 90 #define STARPU_DEPRECATED 93 #if STARPU_GNUC_PREREQ(3,3) 94 #define STARPU_WARN_UNUSED_RESULT __attribute__((__warn_unused_result__)) 96 #define STARPU_WARN_UNUSED_RESULT 99 #define STARPU_POISON_PTR ((void *)0xdeadbeef) 101 #define STARPU_MIN(a,b) ((a)<(b)?(a):(b)) 102 #define STARPU_MAX(a,b) ((a)<(b)?(b):(a)) 104 #define STARPU_BACKTRACE_LENGTH 32 106 # define STARPU_DUMP_BACKTRACE() do { \ 107 void *__ptrs[STARPU_BACKTRACE_LENGTH]; \ 108 int __n = backtrace(__ptrs, STARPU_BACKTRACE_LENGTH); \ 109 backtrace_symbols_fd(__ptrs, __n, 2); \ 112 # define STARPU_DUMP_BACKTRACE() do { } while (0) 115 #ifdef STARPU_NO_ASSERT 116 #define STARPU_ASSERT(x) do { if (0) { (void) (x); } } while(0) 117 #define STARPU_ASSERT_ACCESSIBLE(x) do { if (0) { (void) (x); } } while(0) 118 #define STARPU_ASSERT_MSG(x, msg, ...) do { if (0) { (void) (x); (void) msg; } } while(0) 120 # if defined(__CUDACC__) && defined(STARPU_HAVE_WINDOWS) 121 # define STARPU_ASSERT(x) do { if (STARPU_UNLIKELY(!(x))) { STARPU_DUMP_BACKTRACE(); *(int*)NULL = 0; } } while(0) 122 # define STARPU_ASSERT_MSG(x, msg, ...) do { if (STARPU_UNLIKELY(!(x))) { STARPU_DUMP_BACKTRACE(); fprintf(stderr, "\n[starpu][%s][assert failure] " msg "\n\n", __starpu_func__, ## __VA_ARGS__); *(int*)NULL = 0; }} while(0) 124 # define STARPU_ASSERT(x) do { if (STARPU_UNLIKELY(!(x))) { STARPU_DUMP_BACKTRACE(); assert(x); } } while (0) 125 # define STARPU_ASSERT_MSG(x, msg, ...) do { if (STARPU_UNLIKELY(!(x))) { STARPU_DUMP_BACKTRACE(); fprintf(stderr, "\n[starpu][%s][assert failure] " msg "\n\n", __starpu_func__, ## __VA_ARGS__); assert(x); } } while(0) 128 # define STARPU_ASSERT_ACCESSIBLE(ptr) do { \ 129 volatile char __c STARPU_ATTRIBUTE_UNUSED = *(char*) (ptr); \ 134 # define _starpu_abort() *(volatile int*)NULL = 0 136 # define _starpu_abort() abort() 139 #define STARPU_ABORT() do { \ 140 STARPU_DUMP_BACKTRACE(); \ 141 fprintf(stderr, "[starpu][abort][%s()@%s:%d]\n", __starpu_func__, __FILE__, __LINE__); \ 145 #define STARPU_ABORT_MSG(msg, ...) do { \ 146 STARPU_DUMP_BACKTRACE(); \ 147 fprintf(stderr, "[starpu][abort][%s()@%s:%d] " msg "\n", __starpu_func__, __FILE__, __LINE__, ## __VA_ARGS__); \ 151 #if defined(STARPU_HAVE_STRERROR_R) 152 #if (! defined(__GLIBC__) || !__GLIBC__) || ((_POSIX_C_SOURCE >= 200112L || _XOPEN_SOURCE >= 600) && (! defined(_GNU_SOURCE))) 154 #define starpu_strerror_r(errnum, buf, buflen) \ 157 int _ret = strerror_r((errnum), (buf), (buflen)); \ 158 STARPU_ASSERT(_ret == 0); \ 163 #define starpu_strerror_r(errnum, buf, buflen) \ 166 char * const _user_buf = (buf); \ 167 const size_t _user_buflen = (buflen); \ 169 STARPU_ASSERT((buf) != NULL); \ 170 char * _tmp_buf = strerror_r((errnum), _user_buf, _user_buflen); \ 171 if (_tmp_buf != _user_buf) \ 173 if (_user_buflen > 0) \ 175 strncpy(_user_buf, _tmp_buf, _user_buflen); \ 176 _user_buf[_user_buflen-1] = '\0'; \ 183 # define STARPU_CHECK_RETURN_VALUE(err, message, ...) {if (STARPU_UNLIKELY(err != 0)) { \ 184 char xmessage[256]; starpu_strerror_r(-err, xmessage, 256); \ 185 fprintf(stderr, "[starpu] Unexpected value: <%d:%s> returned for " message "\n", err, xmessage, ## __VA_ARGS__); \ 187 # define STARPU_CHECK_RETURN_VALUE_IS(err, value, message, ...) {if (STARPU_UNLIKELY(err != value)) { \ 188 char xmessage[256]; starpu_strerror_r(-err, xmessage, 256); \ 189 fprintf(stderr, "[starpu] Unexpected value: <%d!=%d:%s> returned for " message "\n", err, value, xmessage, ## __VA_ARGS__); \ 192 # define STARPU_CHECK_RETURN_VALUE(err, message, ...) {if (STARPU_UNLIKELY(err != 0)) { \ 193 fprintf(stderr, "[starpu] Unexpected value: <%d> returned for " message "\n", err, ## __VA_ARGS__); \ 195 # define STARPU_CHECK_RETURN_VALUE_IS(err, value, message, ...) {if (STARPU_UNLIKELY(err != value)) { \ 196 fprintf(stderr, "[starpu] Unexpected value: <%d != %d> returned for " message "\n", err, value, ## __VA_ARGS__); \ 200 #if defined(__i386__) || defined(__x86_64__) 202 static __starpu_inline
unsigned starpu_cmpxchg(
unsigned *ptr,
unsigned old,
unsigned next)
204 __asm__ __volatile__(
"lock cmpxchgl %2,%1":
"+a" (old),
"+m" (*ptr) :
"q" (next) :
"memory");
207 static __starpu_inline
unsigned starpu_xchg(
unsigned *ptr,
unsigned next)
210 __asm__ __volatile__(
"xchgl %1,%0":
"+m" (*ptr),
"+q" (next) : :
"memory");
213 #define STARPU_HAVE_XCHG 215 #if defined(__i386__) 216 static __starpu_inline
unsigned long starpu_cmpxchgl(
unsigned long *ptr,
unsigned long old,
unsigned long next)
218 __asm__ __volatile__(
"lock cmpxchgl %2,%1":
"+a" (old),
"+m" (*ptr) :
"q" (next) :
"memory");
221 static __starpu_inline
unsigned long starpu_xchgl(
unsigned long *ptr,
unsigned long next)
224 __asm__ __volatile__(
"xchgl %1,%0":
"+m" (*ptr),
"+q" (next) : :
"memory");
227 #define STARPU_HAVE_XCHGL 230 #if defined(__x86_64__) 231 static __starpu_inline
unsigned long starpu_cmpxchgl(
unsigned long *ptr,
unsigned long old,
unsigned long next)
233 __asm__ __volatile__(
"lock cmpxchgq %2,%1":
"+a" (old),
"+m" (*ptr) :
"q" (next) :
"memory");
236 static __starpu_inline
unsigned long starpu_xchgl(
unsigned long *ptr,
unsigned long next)
239 __asm__ __volatile__(
"xchgq %1,%0":
"+m" (*ptr),
"+q" (next) : :
"memory");
242 #define STARPU_HAVE_XCHGL 247 #define STARPU_ATOMIC_SOMETHING(name,expr) \ 248 static __starpu_inline unsigned starpu_atomic_##name(unsigned *ptr, unsigned value) \ 250 unsigned old, next; \ 255 if (starpu_cmpxchg(ptr, old, next) == old) \ 260 #define STARPU_ATOMIC_SOMETHINGL(name,expr) \ 261 static __starpu_inline unsigned long starpu_atomic_##name##l(unsigned long *ptr, unsigned long value) \ 263 unsigned long old, next; \ 268 if (starpu_cmpxchgl(ptr, old, next) == old) \ 274 #ifdef STARPU_HAVE_SYNC_FETCH_AND_ADD 275 #define STARPU_ATOMIC_ADD(ptr, value) (__sync_fetch_and_add ((ptr), (value)) + (value)) 276 #define STARPU_ATOMIC_ADDL(ptr, value) (__sync_fetch_and_add ((ptr), (value)) + (value)) 278 #if defined(STARPU_HAVE_XCHG) 279 STARPU_ATOMIC_SOMETHING(add, old + value)
280 #define STARPU_ATOMIC_ADD(ptr, value) starpu_atomic_add(ptr, value) 282 #if defined(STARPU_HAVE_XCHGL) 283 STARPU_ATOMIC_SOMETHINGL(add, old + value)
284 #define STARPU_ATOMIC_ADDL(ptr, value) starpu_atomic_addl(ptr, value) 288 #ifdef STARPU_HAVE_SYNC_FETCH_AND_OR 289 #define STARPU_ATOMIC_OR(ptr, value) (__sync_fetch_and_or ((ptr), (value))) 290 #define STARPU_ATOMIC_ORL(ptr, value) (__sync_fetch_and_or ((ptr), (value))) 292 #if defined(STARPU_HAVE_XCHG) 293 STARPU_ATOMIC_SOMETHING(or, old | value)
294 #define STARPU_ATOMIC_OR(ptr, value) starpu_atomic_or(ptr, value) 296 #if defined(STARPU_HAVE_XCHGL) 297 STARPU_ATOMIC_SOMETHINGL(or, old | value)
298 #define STARPU_ATOMIC_ORL(ptr, value) starpu_atomic_orl(ptr, value) 302 #ifdef STARPU_HAVE_SYNC_BOOL_COMPARE_AND_SWAP 303 #define STARPU_BOOL_COMPARE_AND_SWAP(ptr, old, value) (__sync_bool_compare_and_swap ((ptr), (old), (value))) 304 #elif defined(STARPU_HAVE_XCHG) 305 #define STARPU_BOOL_COMPARE_AND_SWAP(ptr, old, value) (starpu_cmpxchg((ptr), (old), (value)) == (old)) 308 #ifdef STARPU_HAVE_SYNC_VAL_COMPARE_AND_SWAP 309 #define STARPU_VAL_COMPARE_AND_SWAP(ptr, old, value) (__sync_val_compare_and_swap ((ptr), (old), (value))) 310 #elif defined(STARPU_HAVE_XCHG) 311 #define STARPU_VAL_COMPARE_AND_SWAP(ptr, old, value) (starpu_cmpxchg((ptr), (old), (value))) 314 #ifdef STARPU_HAVE_SYNC_LOCK_TEST_AND_SET 315 #define STARPU_TEST_AND_SET(ptr, value) (__sync_lock_test_and_set ((ptr), (value))) 316 #define STARPU_RELEASE(ptr) (__sync_lock_release ((ptr))) 317 #elif defined(STARPU_HAVE_XCHG) 318 #define STARPU_TEST_AND_SET(ptr, value) (starpu_xchg((ptr), (value))) 319 #define STARPU_RELEASE(ptr) (starpu_xchg((ptr), 0)) 322 #ifdef STARPU_HAVE_SYNC_SYNCHRONIZE 323 #define STARPU_SYNCHRONIZE() __sync_synchronize() 324 #elif defined(__i386__) 325 #define STARPU_SYNCHRONIZE() __asm__ __volatile__("lock; addl $0,0(%%esp)" ::: "memory") 326 #elif defined(__KNC__) || defined(__KNF__) 327 #define STARPU_SYNCHRONIZE() __asm__ __volatile__("lock; addl $0,0(%%rsp)" ::: "memory") 328 #elif defined(__x86_64__) 329 #define STARPU_SYNCHRONIZE() __asm__ __volatile__("mfence" ::: "memory") 330 #elif defined(__ppc__) || defined(__ppc64__) 331 #define STARPU_SYNCHRONIZE() __asm__ __volatile__("sync" ::: "memory") 334 #if defined(__i386__) 335 #define STARPU_RMB() __asm__ __volatile__("lock; addl $0,0(%%esp)" ::: "memory") 336 #define STARPU_WMB() __asm__ __volatile__("lock; addl $0,0(%%esp)" ::: "memory") 337 #elif defined(__KNC__) || defined(__KNF__) 338 #define STARPU_RMB() __asm__ __volatile__("lock; addl $0,0(%%rsp)" ::: "memory") 339 #define STARPU_WMB() __asm__ __volatile__("lock; addl $0,0(%%rsp)" ::: "memory") 340 #elif defined(__x86_64__) 341 #define STARPU_RMB() __asm__ __volatile__("lfence" ::: "memory") 342 #define STARPU_WMB() __asm__ __volatile__("sfence" ::: "memory") 343 #elif defined(__ppc__) || defined(__ppc64__) 344 #define STARPU_RMB() __asm__ __volatile__("sync" ::: "memory") 345 #define STARPU_WMB() __asm__ __volatile__("sync" ::: "memory") 347 #define STARPU_RMB() STARPU_SYNCHRONIZE() 348 #define STARPU_WMB() STARPU_SYNCHRONIZE() 364 extern int _starpu_silent;
366 char *starpu_getenv(
const char *str);
373 strval = starpu_getenv(str);
380 val = strtol(strval, &check, 10);
382 fprintf(stderr,
"The %s environment variable must contain an integer\n", str);
387 STARPU_ASSERT_MSG(val >= 0,
"The value for the environment variable '%s' cannot be negative", str);
398 static __starpu_inline
int starpu_get_env_number_default(
const char *str,
int defval)
406 static __starpu_inline
float starpu_get_env_float_default(
const char *str,
float defval)
410 strval = starpu_getenv(str);
417 val = strtof(strval, &check);
419 fprintf(stderr,
"The %s environment variable must contain a float\n", str);
446 #include <sys/types.h> 447 #include <sys/stat.h> 452 #if !defined(_MSC_VER) || defined(BUILDING_STARPU) 455 #if !defined(STARPU_HAVE_STRUCT_TIMESPEC) || (defined(_MSC_VER) && _MSC_VER < 1900) 457 #ifndef STARPU_TIMESPEC_DEFINED 458 #define STARPU_TIMESPEC_DEFINED 1 467 #if defined(__MINGW32__) || defined(__CYGWIN__) 468 #include <sys/time.h> 471 #include <sys/time.h> double starpu_timing_now(void)
void starpu_execute_on_specific_workers(void(*func)(void *), void *arg, unsigned num_workers, unsigned *workers, const char *name)
int starpu_data_cpy(starpu_data_handle_t dst_handle, starpu_data_handle_t src_handle, int asynchronous, void(*callback_func)(void *), void *callback_arg)
void starpu_execute_on_each_worker_ex(void(*func)(void *), void *arg, uint32_t where, const char *name)
struct _starpu_data_state * starpu_data_handle_t
Definition: starpu_data.h:30
void starpu_execute_on_each_worker(void(*func)(void *), void *arg, uint32_t where)