Hi! We had committed to gomp-4_0-branch code to handle TO_PSET memory mapping (used with Fortran allocatable arrays). It turns out that is not actually useful; committed to gomp-4_0-branch in r219022: commit b2c3a33803b074052c5178fb1b6cabbd834cfa72 Author: tschwinge Date: Mon Dec 22 17:12:40 2014 +0000 libgomp: Remove the GOMP_MAP_TO_PSET handling code that we once added. libgomp/ * target.c (gomp_map_vars) : Revert earlier changes. With Intel MIC offloading (emulation), this fixes: FAIL: libgomp.fortran/examples-4/e.55.2.f90 -O0 execution test FAIL: libgomp.fortran/examples-4/e.55.2.f90 -O1 execution test FAIL: libgomp.fortran/examples-4/e.55.2.f90 -O2 execution test FAIL: libgomp.fortran/examples-4/e.55.2.f90 -O3 -fomit-frame-pointer execution test FAIL: libgomp.fortran/examples-4/e.55.2.f90 -O3 -fomit-frame-pointer -funroll-loops execution test FAIL: libgomp.fortran/examples-4/e.55.2.f90 -O3 -fomit-frame-pointer -funroll-all-loops -finline-functions execution test FAIL: libgomp.fortran/examples-4/e.55.2.f90 -O3 -g execution test FAIL: libgomp.fortran/examples-4/e.55.2.f90 -Os execution test FAIL: libgomp.fortran/target3.f90 -O0 execution test FAIL: libgomp.fortran/target3.f90 -O1 execution test FAIL: libgomp.fortran/target3.f90 -O2 execution test FAIL: libgomp.fortran/target3.f90 -O3 -fomit-frame-pointer execution test FAIL: libgomp.fortran/target3.f90 -O3 -fomit-frame-pointer -funroll-loops execution test FAIL: libgomp.fortran/target3.f90 -O3 -fomit-frame-pointer -funroll-all-loops -finline-functions execution test FAIL: libgomp.fortran/target3.f90 -O3 -g execution test FAIL: libgomp.fortran/target3.f90 -Os execution test ... for which Valgrind had reported: ==21161== Conditional jump or move depends on uninitialised value(s) ==21161== at 0x547233D: gomp_map_vars (target.c:267) ==21161== by 0x54743C3: GOMP_target_data (target.c:934) ==21161== by 0x400E6F: vec_mult_ (e.55.2.f90:38) ==21161== by 0x4011C9: MAIN__ (e.55.2.f90:55) ==21161== by 0x401200: main (e.55.2.f90:56) *** Error in `/tmp/offload_aCxI50/offload_target_main': corrupted double-linked list: 0x0000000000c8b9e0 *** The OpenACC PSET test cases still work. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gomp-4_0-branch@219022 138bc75d-0d04-0410-961f-82ee72b054a4 --- libgomp/ChangeLog.gomp | 3 + libgomp/target.c | 214 ++++++++++++++++--------------------------------- 2 files changed, 72 insertions(+), 145 deletions(-) diff --git libgomp/ChangeLog.gomp libgomp/ChangeLog.gomp index 898040d..26fdfe6 100644 --- libgomp/ChangeLog.gomp +++ libgomp/ChangeLog.gomp @@ -1,5 +1,8 @@ 2014-12-22 Thomas Schwinge + * target.c (gomp_map_vars) : Revert earlier + changes. + * libgomp.h (TARGET_CAP_SHARED_MEM, TARGET_CAP_NATIVE_EXEC) (TARGET_CAP_OPENMP_400, TARGET_CAP_OPENACC_200): Remove, and instead... diff --git libgomp/target.c libgomp/target.c index dadcc03..423bbee 100644 --- libgomp/target.c +++ libgomp/target.c @@ -154,27 +154,6 @@ gomp_map_vars (struct gomp_device_descr *devicep, size_t mapnum, tgt->device_descr = devicep; tgt->mem_map = mm; - /* From gcc/fortran/trans-types.c */ - struct descriptor_dimension - { - long stride; - long lbound; - long ubound; - }; - - struct gfc_array_descriptor - { - void *data; - long offset; - long dtype; - struct descriptor_dimension dimension[]; - }; - -#define GFC_DTYPE_RANK_MASK 0x07 -#define GFC_DTYPE_TYPE_MASK 0x38 -#define GFC_DTYPE_TYPE_SHIFT 3 -#define GFC_DTYPE_SIZE_SHIFT 6 - if (mapnum == 0) return tgt; @@ -210,45 +189,6 @@ gomp_map_vars (struct gomp_device_descr *devicep, size_t mapnum, { tgt->list[i] = NULL; - if ((kind & typemask) == GOMP_MAP_TO_PSET) - { - struct gfc_array_descriptor *gad; - size_t rank; - int j; - bool alloc_arrays = true; - - for (j = i - 1; j >= 0; j--) - { - if (hostaddrs[j] == *(void**)hostaddrs[i]) - { - alloc_arrays = false; - break; - } - } - - gad = (struct gfc_array_descriptor *) cur_node.host_start; - rank = gad->dtype & GFC_DTYPE_RANK_MASK; - - cur_node.host_start = (uintptr_t)gad->data; - cur_node.host_end = cur_node.host_start + - sizeof (struct gfc_array_descriptor) + - (sizeof (struct descriptor_dimension) * rank); - - if (alloc_arrays) - { - size_t tsize; - - tsize = gad->dtype >> GFC_DTYPE_SIZE_SHIFT; - - for (j = 0; j < rank; j++) - { - cur_node.host_end += tsize * - (gad->dimension[j].ubound - - gad->dimension[j].lbound + 1); - } - } - } - size_t align = (size_t) 1 << (kind >> rshift); not_found_cnt++; if (tgt_align < align) @@ -419,92 +359,81 @@ gomp_map_vars (struct gomp_device_descr *devicep, size_t mapnum, sizeof (void *)); break; case GOMP_MAP_TO_PSET: - { - /* Copy from host to device memory. */ - /* FIXME: see above FIXME comment. */ - devicep->host2dev_func (devicep->target_id, - (void *) (tgt->tgt_start - + k->tgt_offset), - (void *) k->host_start, - (k->host_end - k->host_start)); - devicep->host2dev_func (devicep->target_id, - (void *) (tgt->tgt_start - + k->tgt_offset), - (void *) &tgt->tgt_start, - sizeof (void *)); + /* Copy from host to device memory. */ + /* FIXME: see above FIXME comment. */ + devicep->host2dev_func (devicep->target_id, + (void *) (tgt->tgt_start + + k->tgt_offset), + (void *) k->host_start, + k->host_end - k->host_start); - for (j = i + 1; j < mapnum; j++) - if (!GOMP_MAP_POINTER_P (get_kind (is_openacc, kinds, j) - & typemask)) - break; - else if ((uintptr_t) hostaddrs[j] < k->host_start - || ((uintptr_t) hostaddrs[j] + sizeof (void *) - > k->host_end)) - break; - else - { - tgt->list[j] = k; - k->refcount++; - cur_node.host_start - = (uintptr_t) *(void **) hostaddrs[j]; - if (cur_node.host_start == (uintptr_t) NULL) - { - cur_node.tgt_offset = (uintptr_t) NULL; - /* Copy from host to device memory. */ - /* FIXME: see above FIXME comment. */ - devicep->host2dev_func (devicep->target_id, - (void *) (tgt->tgt_start - + k->tgt_offset - + ((uintptr_t) hostaddrs[j] - - k->host_start)), - (void *) &cur_node.tgt_offset, - sizeof (void *)); - i++; - continue; - } - /* Add bias to the pointer value. */ - cur_node.host_start += sizes[j]; - cur_node.host_end = cur_node.host_start + 1; - n = splay_tree_lookup (&mm->splay_tree, &cur_node); - if (n == NULL) - { - /* Could be possibly zero size array - section. */ - cur_node.host_end--; - n = splay_tree_lookup (&mm->splay_tree, + for (j = i + 1; j < mapnum; j++) + if (!GOMP_MAP_POINTER_P (get_kind (is_openacc, kinds, j) + & typemask)) + break; + else if ((uintptr_t) hostaddrs[j] < k->host_start + || ((uintptr_t) hostaddrs[j] + sizeof (void *) + > k->host_end)) + break; + else + { + tgt->list[j] = k; + k->refcount++; + cur_node.host_start + = (uintptr_t) *(void **) hostaddrs[j]; + if (cur_node.host_start == (uintptr_t) NULL) + { + cur_node.tgt_offset = (uintptr_t) NULL; + /* Copy from host to device memory. */ + /* FIXME: see above FIXME comment. */ + devicep->host2dev_func (devicep->target_id, + (void *) (tgt->tgt_start + k->tgt_offset + + ((uintptr_t) hostaddrs[j] + - k->host_start)), + (void *) &cur_node.tgt_offset, + sizeof (void *)); + i++; + continue; + } + /* Add bias to the pointer value. */ + cur_node.host_start += sizes[j]; + cur_node.host_end = cur_node.host_start + 1; + n = splay_tree_lookup (&mm->splay_tree, &cur_node); + if (n == NULL) + { + /* Could be possibly zero size array section. */ + cur_node.host_end--; + n = splay_tree_lookup (&mm->splay_tree, &cur_node); - if (n == NULL) - { - cur_node.host_start--; - n = splay_tree_lookup (&mm->splay_tree, + if (n == NULL) + { + cur_node.host_start--; + n = splay_tree_lookup (&mm->splay_tree, &cur_node); - cur_node.host_start++; - } - } - if (n == NULL) - gomp_fatal ("Pointer target of array section " + cur_node.host_start++; + } + } + if (n == NULL) + gomp_fatal ("Pointer target of array section " "wasn't mapped"); - cur_node.host_start -= n->host_start; - cur_node.tgt_offset = n->tgt->tgt_start + cur_node.host_start -= n->host_start; + cur_node.tgt_offset = n->tgt->tgt_start + n->tgt_offset + cur_node.host_start; - /* At this point tgt_offset is target address of the - array section. Now subtract bias to get what we - want to initialize the pointer with. */ - cur_node.tgt_offset -= sizes[j]; - /* Copy from host to device memory. */ - /* FIXME: see above FIXME comment. */ - - devicep->host2dev_func (devicep->target_id, - (void *) (tgt->tgt_start - + k->tgt_offset - + ((uintptr_t) hostaddrs[j] - - k->host_start)), - (void *) &cur_node.tgt_offset, - sizeof (void *)); - i++; - } - } + /* At this point tgt_offset is target address of the + array section. Now subtract bias to get what we + want to initialize the pointer with. */ + cur_node.tgt_offset -= sizes[j]; + /* Copy from host to device memory. */ + /* FIXME: see above FIXME comment. */ + devicep->host2dev_func (devicep->target_id, + (void *) (tgt->tgt_start + k->tgt_offset + + ((uintptr_t) hostaddrs[j] + - k->host_start)), + (void *) &cur_node.tgt_offset, + sizeof (void *)); + i++; + } break; case GOMP_MAP_FORCE_PRESENT: { @@ -534,11 +463,6 @@ gomp_map_vars (struct gomp_device_descr *devicep, size_t mapnum, } } -#undef GFC_DTYPE_RANK_MASK -#undef GFC_DTYPE_TYPE_MASK -#undef GFC_DTYPE_TYPE_SHIFT -#undef GFC_DTYPE_SIZE_SHIFT - if (is_target) { for (i = 0; i < mapnum; i++) Grüße, Thomas