/* 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
. */
/* 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
#include
#include
#include
#include
#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
#ifdef HOST_NONSHM_PLUGIN
#include "plugin-host.h"
#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
struct nonshm_thread *thd = GOMP_PLUGIN_acc_thread ();
thd->nonshm_exec = true;
fn (devaddrs);
thd->nonshm_exec = false;
#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)))
{
#ifdef HOST_NONSHM_PLUGIN
struct nonshm_thread *thd
= GOMP_PLUGIN_malloc (sizeof (struct nonshm_thread));
thd->nonshm_exec = false;
return thd;
#else
return NULL;
#endif
}
STATIC void
GOMP_OFFLOAD_openacc_destroy_thread_data (void *tls_data)
{
#ifdef HOST_NONSHM_PLUGIN
free (tls_data);
#endif
}