Mercurial > hg > CbC > CbC_gcc
diff libgomp/ordered.c @ 145:1830386684a0
gcc-9.2.0
author | anatofuz |
---|---|
date | Thu, 13 Feb 2020 11:34:05 +0900 |
parents | 84e7813d76e9 |
children |
line wrap: on
line diff
--- a/libgomp/ordered.c Thu Oct 25 07:37:49 2018 +0900 +++ b/libgomp/ordered.c Thu Feb 13 11:34:05 2020 +0900 @@ -1,4 +1,4 @@ -/* Copyright (C) 2005-2018 Free Software Foundation, Inc. +/* Copyright (C) 2005-2020 Free Software Foundation, Inc. Contributed by Richard Henderson <rth@redhat.com>. This file is part of the GNU Offloading and Multi Processing Library @@ -214,7 +214,7 @@ Either way we get correct results. However, there is an implicit flush on entry to an ordered region, so we do need to have a barrier here. If we were taking a lock - this could be MEMMODEL_RELEASE since the acquire would be coverd + this could be MEMMODEL_RELEASE since the acquire would be covered by the lock. */ __atomic_thread_fence (MEMMODEL_ACQ_REL); @@ -246,7 +246,7 @@ However, the current implementation has a flaw in that it does not allow the next thread into the ORDERED section immediately after the current - thread exits the ORDERED section in its last iteration. The existance + thread exits the ORDERED section in its last iteration. The existence of this function allows the implementation to change. */ void @@ -259,7 +259,8 @@ #define MAX_COLLAPSED_BITS (__SIZEOF_LONG__ * __CHAR_BIT__) void -gomp_doacross_init (unsigned ncounts, long *counts, long chunk_size) +gomp_doacross_init (unsigned ncounts, long *counts, long chunk_size, + size_t extra) { struct gomp_thread *thr = gomp_thread (); struct gomp_team *team = thr->ts.team; @@ -269,13 +270,24 @@ struct gomp_doacross_work_share *doacross; if (team == NULL || team->nthreads == 1) - return; + { + empty: + if (!extra) + ws->doacross = NULL; + else + { + doacross = gomp_malloc_cleared (sizeof (*doacross) + extra); + doacross->extra = (void *) (doacross + 1); + ws->doacross = doacross; + } + return; + } for (i = 0; i < ncounts; i++) { /* If any count is 0, GOMP_doacross_{post,wait} can't be called. */ if (counts[i] == 0) - return; + goto empty; if (num_bits <= MAX_COLLAPSED_BITS) { @@ -314,7 +326,7 @@ elt_sz = (elt_sz + 63) & ~63UL; doacross = gomp_malloc (sizeof (*doacross) + 63 + num_ents * elt_sz - + shift_sz); + + shift_sz + extra); doacross->chunk_size = chunk_size; doacross->elt_sz = elt_sz; doacross->ncounts = ncounts; @@ -322,6 +334,13 @@ doacross->array = (unsigned char *) ((((uintptr_t) (doacross + 1)) + 63 + shift_sz) & ~(uintptr_t) 63); + if (extra) + { + doacross->extra = doacross->array + num_ents * elt_sz; + memset (doacross->extra, '\0', extra); + } + else + doacross->extra = NULL; if (num_bits <= MAX_COLLAPSED_BITS) { unsigned int shift_count = 0; @@ -360,7 +379,8 @@ unsigned long ent; unsigned int i; - if (__builtin_expect (doacross == NULL, 0)) + if (__builtin_expect (doacross == NULL, 0) + || __builtin_expect (doacross->array == NULL, 0)) { __sync_synchronize (); return; @@ -411,7 +431,8 @@ unsigned long ent; unsigned int i; - if (__builtin_expect (doacross == NULL, 0)) + if (__builtin_expect (doacross == NULL, 0) + || __builtin_expect (doacross->array == NULL, 0)) { __sync_synchronize (); return; @@ -488,7 +509,8 @@ typedef unsigned long long gomp_ull; void -gomp_doacross_ull_init (unsigned ncounts, gomp_ull *counts, gomp_ull chunk_size) +gomp_doacross_ull_init (unsigned ncounts, gomp_ull *counts, + gomp_ull chunk_size, size_t extra) { struct gomp_thread *thr = gomp_thread (); struct gomp_team *team = thr->ts.team; @@ -498,13 +520,24 @@ struct gomp_doacross_work_share *doacross; if (team == NULL || team->nthreads == 1) - return; + { + empty: + if (!extra) + ws->doacross = NULL; + else + { + doacross = gomp_malloc_cleared (sizeof (*doacross) + extra); + doacross->extra = (void *) (doacross + 1); + ws->doacross = doacross; + } + return; + } for (i = 0; i < ncounts; i++) { /* If any count is 0, GOMP_doacross_{post,wait} can't be called. */ if (counts[i] == 0) - return; + goto empty; if (num_bits <= MAX_COLLAPSED_BITS) { @@ -557,6 +590,13 @@ doacross->array = (unsigned char *) ((((uintptr_t) (doacross + 1)) + 63 + shift_sz) & ~(uintptr_t) 63); + if (extra) + { + doacross->extra = doacross->array + num_ents * elt_sz; + memset (doacross->extra, '\0', extra); + } + else + doacross->extra = NULL; if (num_bits <= MAX_COLLAPSED_BITS) { unsigned int shift_count = 0; @@ -595,7 +635,8 @@ unsigned long ent; unsigned int i; - if (__builtin_expect (doacross == NULL, 0)) + if (__builtin_expect (doacross == NULL, 0) + || __builtin_expect (doacross->array == NULL, 0)) { __sync_synchronize (); return; @@ -667,7 +708,8 @@ unsigned long ent; unsigned int i; - if (__builtin_expect (doacross == NULL, 0)) + if (__builtin_expect (doacross == NULL, 0) + || __builtin_expect (doacross->array == NULL, 0)) { __sync_synchronize (); return;