forked from OSchip/llvm-project
Fixed OMP doacross implementation on 32-bit platforms.
Differential Revision: https://reviews.llvm.org/D40171 llvm-svn: 318658
This commit is contained in:
parent
1631d6ce13
commit
58acafc424
|
@ -3802,23 +3802,30 @@ void __kmpc_doacross_init(ident_t *loc, int gtid, int num_dims,
|
||||||
__kmp_wait_yield_4((volatile kmp_uint32 *)&sh_buf->doacross_buf_idx, idx,
|
__kmp_wait_yield_4((volatile kmp_uint32 *)&sh_buf->doacross_buf_idx, idx,
|
||||||
__kmp_eq_4, NULL);
|
__kmp_eq_4, NULL);
|
||||||
}
|
}
|
||||||
|
#if KMP_32_BIT_ARCH
|
||||||
// Check if we are the first thread. After the CAS the first thread gets 0,
|
// Check if we are the first thread. After the CAS the first thread gets 0,
|
||||||
// others get 1 if initialization is in progress, allocated pointer otherwise.
|
// others get 1 if initialization is in progress, allocated pointer otherwise.
|
||||||
|
// Treat pointer as volatile integer (value 0 or 1) until memory is allocated.
|
||||||
|
flags = (kmp_uint32 *)KMP_COMPARE_AND_STORE_RET32(
|
||||||
|
(volatile kmp_int32 *)&sh_buf->doacross_flags, NULL, 1);
|
||||||
|
#else
|
||||||
flags = (kmp_uint32 *)KMP_COMPARE_AND_STORE_RET64(
|
flags = (kmp_uint32 *)KMP_COMPARE_AND_STORE_RET64(
|
||||||
(kmp_int64 *)&sh_buf->doacross_flags, NULL, (kmp_int64)1);
|
(volatile kmp_int64 *)&sh_buf->doacross_flags, NULL, 1LL);
|
||||||
|
#endif
|
||||||
if (flags == NULL) {
|
if (flags == NULL) {
|
||||||
// we are the first thread, allocate the array of flags
|
// we are the first thread, allocate the array of flags
|
||||||
kmp_int64 size =
|
size_t size = trace_count / 8 + 8; // in bytes, use single bit per iteration
|
||||||
trace_count / 8 + 8; // in bytes, use single bit per iteration
|
|
||||||
sh_buf->doacross_flags = (kmp_uint32 *)__kmp_thread_calloc(th, size, 1);
|
sh_buf->doacross_flags = (kmp_uint32 *)__kmp_thread_calloc(th, size, 1);
|
||||||
} else if ((kmp_int64)flags == 1) {
|
} else if (flags == (kmp_uint32 *)1) {
|
||||||
|
#if KMP_32_BIT_ARCH
|
||||||
// initialization is still in progress, need to wait
|
// initialization is still in progress, need to wait
|
||||||
while ((volatile kmp_int64)sh_buf->doacross_flags == 1) {
|
while (*(volatile kmp_int32 *)&sh_buf->doacross_flags == 1)
|
||||||
|
#else
|
||||||
|
while (*(volatile kmp_int64 *)&sh_buf->doacross_flags == 1LL)
|
||||||
|
#endif
|
||||||
KMP_YIELD(TRUE);
|
KMP_YIELD(TRUE);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
KMP_DEBUG_ASSERT((kmp_int64)sh_buf->doacross_flags >
|
KMP_DEBUG_ASSERT(sh_buf->doacross_flags > (kmp_uint32 *)1); // check ptr value
|
||||||
1); // check value of pointer
|
|
||||||
pr_buf->th_doacross_flags =
|
pr_buf->th_doacross_flags =
|
||||||
sh_buf->doacross_flags; // save private copy in order to not
|
sh_buf->doacross_flags; // save private copy in order to not
|
||||||
// touch shared buffer on each iteration
|
// touch shared buffer on each iteration
|
||||||
|
|
Loading…
Reference in New Issue