On Tue, 24 Oct 2017, Jakub Jelinek wrote:
> loop transfering the addresses or firstprivate_int values to the device
> - where we issued mapnum host2dev transfers each just pointer-sized
> when we could have just prepared all the pointers in an array and host2dev
> copy them all together.
Can you please give an example OpenMP code? I thought such variables are
just fields of one omp_data_? struct that is copied all at once, but I guess
I'm misunderstanding.
> Thoughts on this?
I need some time to understand the patch well, at the moment I have just
a couple superficial comments, below.
> --- libgomp/target.c.jj 2017-04-20 14:59:08.296263304 +0200
> +++ libgomp/target.c 2017-10-23 19:08:14.348336118 +0200
> @@ -177,10 +177,77 @@ gomp_device_copy (struct gomp_device_des
> }
> }
>
> +struct gomp_map_cache
> +{
> + void *buf;
> + struct target_mem_desc *tgt;
> + size_t *chunks;
> + long chunk_cnt;
> + long use_cnt;
> +};
Would really appreciate comments for meaning of fields here. Also, is the
struct properly named? From the patch description I understood it to be a
copy coalescing buffer, not a cache.
> @@ -449,19 +531,34 @@ gomp_map_vars (struct gomp_device_descr
> size_t align = (size_t) 1 << (kind >> rshift);
> if (tgt_align < align)
> tgt_align = align;
> - tgt_size -= (uintptr_t) hostaddrs[first]
> - - (uintptr_t) hostaddrs[i];
> + tgt_size -= (uintptr_t) hostaddrs[first] - cur_node.host_start;
> tgt_size = (tgt_size + align - 1) & ~(align - 1);
> - tgt_size += cur_node.host_end - (uintptr_t) hostaddrs[i];
> + tgt_size += cur_node.host_end - cur_node.host_start;
> not_found_cnt += last - i;
> for (i = first; i <= last; i++)
> - tgt->list[i].key = NULL;
> + {
> + tgt->list[i].key = NULL;
> + switch (get_kind (short_mapkind, kinds, i) & typemask)
> + {
> + case GOMP_MAP_ALLOC:
> + case GOMP_MAP_FROM:
> + case GOMP_MAP_FORCE_ALLOC:
> + case GOMP_MAP_ALWAYS_FROM:
> + break;
> + default:
> + /* All the others copy data if newly allocated. */
> + gomp_cache_add (&cache, tgt_size - cur_node.host_end
> + + (uintptr_t) hostaddrs[i],
> + sizes[i]);
A similar switch needed to be duplicated below. Would it be appropriate to
pass the map kind to gomp_cache_add, or have a thin wrapper around it to have
checks for appropriate kinds in one place?
Thanks.
Alexander