[PATCH] Remove use of 'struct map' from plugin (nvptx)

libgomp/
	* plugin/plugin-nvptx.c (struct map): Removed.
	(map_init, map_pop): Remove use of struct map. (map_push):
	Likewise and change argument list.
	* testsuite/libgomp.oacc-c-c++-common/mapping-1.c: New

Co-Authored-By: James Norris <jnorris@codesourcery.com>

From-SVN: r263212
This commit is contained in:
Cesar Philippidis 2018-08-01 07:09:56 -07:00 committed by Cesar Philippidis
parent 5ecfbf82a4
commit 094db6beb9
3 changed files with 77 additions and 27 deletions

View File

@ -1,3 +1,11 @@
2018-08-01 Cesar Philippidis <cesar@codesourcery.com>
James Norris <jnorris@codesourcery.com>
* plugin/plugin-nvptx.c (struct map): Removed.
(map_init, map_pop): Remove use of struct map. (map_push):
Likewise and change argument list.
* testsuite/libgomp.oacc-c-c++-common/mapping-1.c: New
2018-08-01 Tom de Vries <tdevries@suse.de>
* plugin/cuda-lib.def: New file. Factor out of ...

View File

@ -177,13 +177,6 @@ struct nvptx_thread
struct ptx_device *ptx_dev;
};
struct map
{
int async;
size_t size;
char mappings[0];
};
static bool
map_init (struct ptx_stream *s)
{
@ -217,16 +210,12 @@ map_fini (struct ptx_stream *s)
static void
map_pop (struct ptx_stream *s)
{
struct map *m;
assert (s != NULL);
assert (s->h_next);
assert (s->h_prev);
assert (s->h_tail);
m = s->h_tail;
s->h_tail += m->size;
s->h_tail = s->h_next;
if (s->h_tail >= s->h_end)
s->h_tail = s->h_begin + (int) (s->h_tail - s->h_end);
@ -244,37 +233,27 @@ map_pop (struct ptx_stream *s)
}
static void
map_push (struct ptx_stream *s, int async, size_t size, void **h, void **d)
map_push (struct ptx_stream *s, size_t size, void **h, void **d)
{
int left;
int offset;
struct map *m;
assert (s != NULL);
left = s->h_end - s->h_next;
size += sizeof (struct map);
assert (s->h_prev);
assert (s->h_next);
if (size >= left)
{
m = s->h_prev;
m->size += left;
s->h_next = s->h_begin;
if (s->h_next + size > s->h_end)
GOMP_PLUGIN_fatal ("unable to push map");
assert (s->h_next == s->h_prev);
s->h_next = s->h_prev = s->h_tail = s->h_begin;
}
assert (s->h_next);
m = s->h_next;
m->async = async;
m->size = size;
offset = (void *)&m->mappings[0] - s->h;
offset = s->h_next - s->h;
*d = (void *)(s->d + offset);
*h = (void *)(s->h + offset);
@ -1210,7 +1189,7 @@ nvptx_exec (void (*fn), size_t mapnum, void **hostaddrs, void **devaddrs,
/* This reserves a chunk of a pre-allocated page of memory mapped on both
the host and the device. HP is a host pointer to the new chunk, and DP is
the corresponding device pointer. */
map_push (dev_str, async, mapnum * sizeof (void *), &hp, &dp);
map_push (dev_str, mapnum * sizeof (void *), &hp, &dp);
GOMP_PLUGIN_debug (0, " %s: prepare mappings\n", __FUNCTION__);

View File

@ -0,0 +1,63 @@
/* { dg-do run } */
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
/* Exercise the kernel launch argument mapping. */
int
main (int argc, char **argv)
{
int a[256], b[256], c[256], d[256], e[256], f[256];
int i;
int n;
/* 48 is the size of the mappings for the first parallel construct. */
n = sysconf (_SC_PAGESIZE) / 48 - 1;
i = 0;
for (i = 0; i < n; i++)
{
#pragma acc parallel copy (a, b, c, d)
{
int j;
for (j = 0; j < 256; j++)
{
a[j] = j;
b[j] = j;
c[j] = j;
d[j] = j;
}
}
}
#pragma acc parallel copy (a, b, c, d, e, f)
{
int j;
for (j = 0; j < 256; j++)
{
a[j] = j;
b[j] = j;
c[j] = j;
d[j] = j;
e[j] = j;
f[j] = j;
}
}
for (i = 0; i < 256; i++)
{
if (a[i] != i) abort();
if (b[i] != i) abort();
if (c[i] != i) abort();
if (d[i] != i) abort();
if (e[i] != i) abort();
if (f[i] != i) abort();
}
exit (0);
}