gcc/libgomp/plugin/plugin-host.c
Julian Brown d93bdab53b mkoffload.c (process): Support variable mapping.
gcc/
	* config/nvptx/mkoffload.c (process): Support variable mapping.

	libgomp/
	* libgomp.h (target_mem_desc: Remove mem_map field.
	(acc_dispatch_t): Remove open_device_func, close_device_func,
	get_device_num_func, set_device_num_func, target_data members.
	Change create_thread_data_func argument to device number instead of
	generic pointer.
	* oacc-async.c (assert.h): Include.
	(acc_async_test, acc_async_test_all, acc_wait, acc_wait_async)
	(acc_wait_all, acc_wait_all_async): Use current host thread's
	active device, not base_dev.
	* oacc-cuda.c (acc_get_current_cuda_device)
	(acc_get_current_cuda_context, acc_get_cuda_stream)
	(acc_set_cuda_stream): Likewise.
	* oacc-host.c (host_dispatch): Don't set open_device_func,
	close_device_func, get_device_num_func or set_device_num_func.
	* oacc-init.c (base_dev, init_key): Remove.
	(cached_base_dev): New.
	(name_of_acc_device_t): New.
	(acc_init_1): Initialise default-numbered device, not zeroth.
	(acc_shutdown_1): Close all devices of a given type.
	(goacc_destroy_thread): Don't use base_dev.
	(lazy_open, lazy_init, lazy_init_and_open): Remove.
	(goacc_attach_host_thread_to_device): New.
	(acc_init): Reimplement with goacc_attach_host_thread_to_device.
	(acc_get_num_devices): Don't use base_dev.
	(acc_set_device_type): Reimplement.
	(acc_get_device_type): Don't use base_dev.
	(acc_get_device_num): Tweak logic.
	(acc_set_device_num): Likewise.
	(acc_on_device): Use acc_get_device_type.
	(goacc_runtime_initialize): Initialize cached_base_dev not base_dev.
	(goacc_lazy_initialize): Reimplement with acc_init and
	goacc_attach_host_thread_to_device.
	* oacc-int.h (goacc_thread): Add base_dev field.
	(base_dev): Remove extern declaration.
	(goacc_attach_host_thread_to_device): Add prototype.
	* oacc-mem.c (acc_malloc): Use current thread's device instead of
	base_dev.
	(acc_free): Likewise.
	(acc_memcpy_to_device): Likewise.
	(acc_memcpy_from_device): Likewise.
	* oacc-parallel.c (select_acc_device): Remove. Replace calls with
	goacc_lazy_initialize (throughout).
	(GOACC_parallel): Use tgt_offset to locate target functions.
	* target.c (gomp_map_vars): Don't set tgt->mem_map.
	(gomp_unmap_vars): Use devicep->mem_map pointer not tgt->mem_map.
	(gomp_load_plugin_for_device): Remove open_device, close_device,
	get_device_num, set_device_num openacc hook initialisation. Don't set
	openacc.target_data.
	* plugin/plugin-host.c (GOMP_OFFLOAD_openacc_open_device)
	(GOMP_OFFLOAD_openacc_close_device)
	(GOMP_OFFLOAD_openacc_get_device_num)
	(GOMP_OFFLOAD_openacc_set_device_num): Remove.
	(GOMP_OFFLOAD_openacc_create_thread_data): Change (unused) argument
	to int.
	* plugin/plugin-nvptx.c (ptx_inited): Remove.
	(instantiated_devices, ptx_dev_lock): New.
	(struct ptx_image_data): New.
	(ptx_devices, ptx_images, ptx_image_lock): New.
	(fini_streams_for_device): Reorder cuStreamDestroy call.
	(nvptx_get_num_devices): Remove forward declaration.
	(nvptx_init): Change return type to bool.
	(nvptx_fini): Remove.
	(nvptx_attach_host_thread_to_device): New.
	(nvptx_open_device): Return struct ptx_device* instead of void*.
	(nvptx_close_device): Change argument type to struct ptx_device*,
	return type to void.
	(nvptx_get_num_devices): Use instantiated_devices not ptx_inited.
	(kernel_target_data, kernel_host_table): Remove static globals.
	(GOMP_OFFLOAD_register_image, GOMP_OFFLOAD_get_table): Remove.
	(GOMP_OFFLOAD_init_device): Reimplement.
	(GOMP_OFFLOAD_fini_device): Likewise.
	(GOMP_OFFLOAD_load_image, GOMP_OFFLOAD_unload_image): New.
	(GOMP_OFFLOAD_alloc, GOMP_OFFLOAD_free, GOMP_OFFLOAD_dev2host)
	(GOMP_OFFLOAD_host2dev): Use ORD argument.
	(GOMP_OFFLOAD_openacc_open_device)
	(GOMP_OFFLOAD_openacc_close_device)
	(GOMP_OFFLOAD_openacc_set_device_num)
	(GOMP_OFFLOAD_openacc_get_device_num): Remove.
	(GOMP_OFFLOAD_openacc_create_thread_data): Change argument to int
	(device number).

	libgomp/testsuite/
	* libgomp.oacc-c-c++-common/lib-9.c: Fix devnum check in test.

From-SVN: r221922
2015-04-08 15:58:33 +00:00

243 lines
5.3 KiB
C

/* OpenACC Runtime Library: acc_device_host, acc_device_host_nonshm.
Copyright (C) 2013-2015 Free Software Foundation, Inc.
Contributed by Mentor Embedded.
This file is part of the GNU Offloading and Multi Processing Library
(libgomp).
Libgomp is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3, or (at your option)
any later version.
Libgomp is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
FOR A PARTICULAR PURPOSE. See the GNU General Public License for
more details.
Under Section 7 of GPL version 3, you are granted additional
permissions described in the GCC Runtime Library Exception, version
3.1, as published by the Free Software Foundation.
You should have received a copy of the GNU General Public License and
a copy of the GCC Runtime Library Exception along with this program;
see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
<http://www.gnu.org/licenses/>. */
/* Simple implementation of support routines for a shared-memory
acc_device_host, and a non-shared memory acc_device_host_nonshm, with the
latter built as a plugin. */
#include "openacc.h"
#include "config.h"
#ifdef HOST_NONSHM_PLUGIN
#include "libgomp-plugin.h"
#include "oacc-plugin.h"
#else
#include "libgomp.h"
#include "oacc-int.h"
#endif
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#ifdef HOST_NONSHM_PLUGIN
#define STATIC
#define GOMP(X) GOMP_PLUGIN_##X
#define SELF "host_nonshm plugin: "
#else
#define STATIC static
#define GOMP(X) gomp_##X
#define SELF "host: "
#endif
STATIC const char *
GOMP_OFFLOAD_get_name (void)
{
#ifdef HOST_NONSHM_PLUGIN
return "host_nonshm";
#else
return "host";
#endif
}
STATIC unsigned int
GOMP_OFFLOAD_get_caps (void)
{
unsigned int caps = (GOMP_OFFLOAD_CAP_OPENACC_200
| GOMP_OFFLOAD_CAP_NATIVE_EXEC);
#ifndef HOST_NONSHM_PLUGIN
caps |= GOMP_OFFLOAD_CAP_SHARED_MEM;
#endif
return caps;
}
STATIC int
GOMP_OFFLOAD_get_type (void)
{
#ifdef HOST_NONSHM_PLUGIN
return OFFLOAD_TARGET_TYPE_HOST_NONSHM;
#else
return OFFLOAD_TARGET_TYPE_HOST;
#endif
}
STATIC int
GOMP_OFFLOAD_get_num_devices (void)
{
return 1;
}
STATIC void
GOMP_OFFLOAD_init_device (int n __attribute__ ((unused)))
{
}
STATIC void
GOMP_OFFLOAD_fini_device (int n __attribute__ ((unused)))
{
}
STATIC int
GOMP_OFFLOAD_load_image (int n __attribute__ ((unused)),
void *i __attribute__ ((unused)),
struct addr_pair **r __attribute__ ((unused)))
{
return 0;
}
STATIC void
GOMP_OFFLOAD_unload_image (int n __attribute__ ((unused)),
void *i __attribute__ ((unused)))
{
}
STATIC void *
GOMP_OFFLOAD_alloc (int n __attribute__ ((unused)), size_t s)
{
return GOMP (malloc) (s);
}
STATIC void
GOMP_OFFLOAD_free (int n __attribute__ ((unused)), void *p)
{
free (p);
}
STATIC void *
GOMP_OFFLOAD_host2dev (int n __attribute__ ((unused)), void *d, const void *h,
size_t s)
{
#ifdef HOST_NONSHM_PLUGIN
memcpy (d, h, s);
#endif
return 0;
}
STATIC void *
GOMP_OFFLOAD_dev2host (int n __attribute__ ((unused)), void *h, const void *d,
size_t s)
{
#ifdef HOST_NONSHM_PLUGIN
memcpy (h, d, s);
#endif
return 0;
}
STATIC void
GOMP_OFFLOAD_run (int n __attribute__ ((unused)), void *fn_ptr, void *vars)
{
void (*fn)(void *) = (void (*)(void *)) fn_ptr;
fn (vars);
}
STATIC void
GOMP_OFFLOAD_openacc_parallel (void (*fn) (void *),
size_t mapnum __attribute__ ((unused)),
void **hostaddrs __attribute__ ((unused)),
void **devaddrs __attribute__ ((unused)),
size_t *sizes __attribute__ ((unused)),
unsigned short *kinds __attribute__ ((unused)),
int num_gangs __attribute__ ((unused)),
int num_workers __attribute__ ((unused)),
int vector_length __attribute__ ((unused)),
int async __attribute__ ((unused)),
void *targ_mem_desc __attribute__ ((unused)))
{
#ifdef HOST_NONSHM_PLUGIN
fn (devaddrs);
#else
fn (hostaddrs);
#endif
}
STATIC void
GOMP_OFFLOAD_openacc_register_async_cleanup (void *targ_mem_desc)
{
#ifdef HOST_NONSHM_PLUGIN
/* "Asynchronous" launches are executed synchronously on the (non-SHM) host,
so there's no point in delaying host-side cleanup -- just do it now. */
GOMP_PLUGIN_async_unmap_vars (targ_mem_desc);
#endif
}
STATIC void
GOMP_OFFLOAD_openacc_async_set_async (int async __attribute__ ((unused)))
{
}
STATIC int
GOMP_OFFLOAD_openacc_async_test (int async __attribute__ ((unused)))
{
return 1;
}
STATIC int
GOMP_OFFLOAD_openacc_async_test_all (void)
{
return 1;
}
STATIC void
GOMP_OFFLOAD_openacc_async_wait (int async __attribute__ ((unused)))
{
}
STATIC void
GOMP_OFFLOAD_openacc_async_wait_all (void)
{
}
STATIC void
GOMP_OFFLOAD_openacc_async_wait_async (int async1 __attribute__ ((unused)),
int async2 __attribute__ ((unused)))
{
}
STATIC void
GOMP_OFFLOAD_openacc_async_wait_all_async (int async __attribute__ ((unused)))
{
}
STATIC void *
GOMP_OFFLOAD_openacc_create_thread_data (int ord
__attribute__ ((unused)))
{
return NULL;
}
STATIC void
GOMP_OFFLOAD_openacc_destroy_thread_data (void *tls_data
__attribute__ ((unused)))
{
}