Commit 4219ddb3 by Ilya Verbin Committed by Ilya Verbin

libgomp-plugin-intelmic.cpp (struct TargetImageDesc): New.

liboffloadmic/
	* plugin/libgomp-plugin-intelmic.cpp (struct TargetImageDesc): New.
	(ImgDescMap): New typedef.
	(image_descriptors): New static var.
	(init): Allocate image_descriptors.
	(offload): Remove vars2 argument.  Pass NULL to __offload_offload1
	instead of vars2.
	(unregister_main_image): New static function.
	(register_main_image): Call unregister_main_image at exit.
	(GOMP_OFFLOAD_init_device): Print device number, fix offload args.
	(GOMP_OFFLOAD_fini_device): Likewise.
	(get_target_table): Remove vd1g and vd2g, don't pass them to offload.
	(offload_image): Remove declaration of the struct TargetImage.
	Free table.  Insert new descriptor into image_descriptors.
	(GOMP_OFFLOAD_unload_image): Call __offload_unregister_image, free
	the corresponding descriptor, and remove it from address_table and
	image_descriptors.
	(GOMP_OFFLOAD_alloc): Print device number, remove vd1g.
	(GOMP_OFFLOAD_free): Likewise.
	(GOMP_OFFLOAD_host2dev): Print device number, remove vd1g and vd2g.
	(GOMP_OFFLOAD_dev2host): Likewise.
	(GOMP_OFFLOAD_run): Print device number, remove vd1g.
	* plugin/offload_target_main.cpp (__offload_target_table_p1): Remove
	vd2, don't pass it to __offload_target_enter.
	(__offload_target_table_p2): Likewise.
	(__offload_target_alloc): Likewise.
	(__offload_target_free): Likewise.
	(__offload_target_host2tgt_p1): Likewise.
	(__offload_target_host2tgt_p2): Likewise.
	(__offload_target_tgt2host_p1): Likewise.
	(__offload_target_tgt2host_p2): Likewise.
	(__offload_target_run): Likewise.
	(__offload_target_tgt2tgt): Remove vd1g, don't pass it to
	__offload_target_enter.

From-SVN: r230614
parent 2c443701
2015-11-19 Ilya Verbin <ilya.verbin@intel.com>
* plugin/libgomp-plugin-intelmic.cpp (struct TargetImageDesc): New.
(ImgDescMap): New typedef.
(image_descriptors): New static var.
(init): Allocate image_descriptors.
(offload): Remove vars2 argument. Pass NULL to __offload_offload1
instead of vars2.
(unregister_main_image): New static function.
(register_main_image): Call unregister_main_image at exit.
(GOMP_OFFLOAD_init_device): Print device number, fix offload args.
(GOMP_OFFLOAD_fini_device): Likewise.
(get_target_table): Remove vd1g and vd2g, don't pass them to offload.
(offload_image): Remove declaration of the struct TargetImage.
Free table. Insert new descriptor into image_descriptors.
(GOMP_OFFLOAD_unload_image): Call __offload_unregister_image, free
the corresponding descriptor, and remove it from address_table and
image_descriptors.
(GOMP_OFFLOAD_alloc): Print device number, remove vd1g.
(GOMP_OFFLOAD_free): Likewise.
(GOMP_OFFLOAD_host2dev): Print device number, remove vd1g and vd2g.
(GOMP_OFFLOAD_dev2host): Likewise.
(GOMP_OFFLOAD_run): Print device number, remove vd1g.
* plugin/offload_target_main.cpp (__offload_target_table_p1): Remove
vd2, don't pass it to __offload_target_enter.
(__offload_target_table_p2): Likewise.
(__offload_target_alloc): Likewise.
(__offload_target_free): Likewise.
(__offload_target_host2tgt_p1): Likewise.
(__offload_target_host2tgt_p2): Likewise.
(__offload_target_tgt2host_p1): Likewise.
(__offload_target_tgt2host_p2): Likewise.
(__offload_target_run): Likewise.
(__offload_target_tgt2tgt): Remove vd1g, don't pass it to
__offload_target_enter.
2015-11-14 Ilya Verbin <ilya.verbin@intel.com> 2015-11-14 Ilya Verbin <ilya.verbin@intel.com>
* runtime/offload_host.cpp (task_completion_callback): New * runtime/offload_host.cpp (task_completion_callback): New
...@@ -11,7 +47,7 @@ ...@@ -11,7 +47,7 @@
(register_main_image): Call register_main_image. (register_main_image): Call register_main_image.
(GOMP_OFFLOAD_init_device, get_target_table, GOMP_OFFLOAD_alloc, (GOMP_OFFLOAD_init_device, get_target_table, GOMP_OFFLOAD_alloc,
GOMP_OFFLOAD_free, GOMP_OFFLOAD_host2dev, GOMP_OFFLOAD_dev2host, GOMP_OFFLOAD_free, GOMP_OFFLOAD_host2dev, GOMP_OFFLOAD_dev2host,
GOMP_OFFLOAD_dev2dev) Adjust offload callers. GOMP_OFFLOAD_dev2dev): Adjust offload callers.
(GOMP_OFFLOAD_async_run): New function. (GOMP_OFFLOAD_async_run): New function.
(GOMP_OFFLOAD_run): Implement using GOMP_OFFLOAD_async_run. (GOMP_OFFLOAD_run): Implement using GOMP_OFFLOAD_async_run.
......
...@@ -65,6 +65,17 @@ typedef std::vector<AddrVect> DevAddrVect; ...@@ -65,6 +65,17 @@ typedef std::vector<AddrVect> DevAddrVect;
/* Addresses for all images and all devices. */ /* Addresses for all images and all devices. */
typedef std::map<const void *, DevAddrVect> ImgDevAddrMap; typedef std::map<const void *, DevAddrVect> ImgDevAddrMap;
/* Image descriptor needed by __offload_[un]register_image. */
struct TargetImageDesc {
int64_t size;
/* 10 characters is enough for max int value. */
char name[sizeof ("lib0000000000.so")];
char data[];
};
/* Image descriptors, indexed by a pointer obtained from libgomp. */
typedef std::map<const void *, TargetImageDesc *> ImgDescMap;
/* Total number of available devices. */ /* Total number of available devices. */
static int num_devices; static int num_devices;
...@@ -76,6 +87,9 @@ static int num_images; ...@@ -76,6 +87,9 @@ static int num_images;
second key is number of device. Contains a vector of pointer pairs. */ second key is number of device. Contains a vector of pointer pairs. */
static ImgDevAddrMap *address_table; static ImgDevAddrMap *address_table;
/* Descriptors of all images, registered in liboffloadmic. */
static ImgDescMap *image_descriptors;
/* Thread-safe registration of the main image. */ /* Thread-safe registration of the main image. */
static pthread_once_t main_image_is_registered = PTHREAD_ONCE_INIT; static pthread_once_t main_image_is_registered = PTHREAD_ONCE_INIT;
...@@ -156,6 +170,7 @@ init (void) ...@@ -156,6 +170,7 @@ init (void)
out: out:
address_table = new ImgDevAddrMap; address_table = new ImgDevAddrMap;
image_descriptors = new ImgDescMap;
num_devices = _Offload_number_of_devices (); num_devices = _Offload_number_of_devices ();
} }
...@@ -192,14 +207,13 @@ GOMP_OFFLOAD_get_num_devices (void) ...@@ -192,14 +207,13 @@ GOMP_OFFLOAD_get_num_devices (void)
static void static void
offload (const char *file, uint64_t line, int device, const char *name, offload (const char *file, uint64_t line, int device, const char *name,
int num_vars, VarDesc *vars, VarDesc2 *vars2, const void **async_data) int num_vars, VarDesc *vars, const void **async_data)
{ {
OFFLOAD ofld = __offload_target_acquire1 (&device, file, line); OFFLOAD ofld = __offload_target_acquire1 (&device, file, line);
if (ofld) if (ofld)
{ {
if (async_data == NULL) if (async_data == NULL)
__offload_offload1 (ofld, name, 0, num_vars, vars, vars2, 0, NULL, __offload_offload1 (ofld, name, 0, num_vars, vars, NULL, 0, NULL, NULL);
NULL);
else else
{ {
OffloadFlags flags; OffloadFlags flags;
...@@ -217,13 +231,27 @@ offload (const char *file, uint64_t line, int device, const char *name, ...@@ -217,13 +231,27 @@ offload (const char *file, uint64_t line, int device, const char *name,
} }
static void static void
unregister_main_image ()
{
__offload_unregister_image (&main_target_image);
}
static void
register_main_image () register_main_image ()
{ {
/* Do not check the return value, because old versions of liboffloadmic did
not have return values. */
__offload_register_image (&main_target_image); __offload_register_image (&main_target_image);
/* liboffloadmic will call GOMP_PLUGIN_target_task_completion when /* liboffloadmic will call GOMP_PLUGIN_target_task_completion when
asynchronous task on target is completed. */ asynchronous task on target is completed. */
__offload_register_task_callback (GOMP_PLUGIN_target_task_completion); __offload_register_task_callback (GOMP_PLUGIN_target_task_completion);
if (atexit (unregister_main_image) != 0)
{
fprintf (stderr, "%s: atexit failed\n", __FILE__);
exit (1);
}
} }
/* liboffloadmic loads and runs offload_target_main on all available devices /* liboffloadmic loads and runs offload_target_main on all available devices
...@@ -231,16 +259,16 @@ register_main_image () ...@@ -231,16 +259,16 @@ register_main_image ()
extern "C" void extern "C" void
GOMP_OFFLOAD_init_device (int device) GOMP_OFFLOAD_init_device (int device)
{ {
TRACE (""); TRACE ("(device = %d)", device);
pthread_once (&main_image_is_registered, register_main_image); pthread_once (&main_image_is_registered, register_main_image);
offload (__FILE__, __LINE__, device, "__offload_target_init_proc", 0, offload (__FILE__, __LINE__, device, "__offload_target_init_proc", 0, NULL,
NULL, NULL, NULL); NULL);
} }
extern "C" void extern "C" void
GOMP_OFFLOAD_fini_device (int device) GOMP_OFFLOAD_fini_device (int device)
{ {
TRACE (""); TRACE ("(device = %d)", device);
/* Unreachable for GOMP_OFFLOAD_CAP_OPENMP_400. */ /* Unreachable for GOMP_OFFLOAD_CAP_OPENMP_400. */
abort (); abort ();
} }
...@@ -253,10 +281,9 @@ get_target_table (int device, int &num_funcs, int &num_vars, void **&table) ...@@ -253,10 +281,9 @@ get_target_table (int device, int &num_funcs, int &num_vars, void **&table)
vd1[0].size = sizeof (num_funcs); vd1[0].size = sizeof (num_funcs);
vd1[1].ptr = &num_vars; vd1[1].ptr = &num_vars;
vd1[1].size = sizeof (num_vars); vd1[1].size = sizeof (num_vars);
VarDesc2 vd1g[2] = { { "num_funcs", 0 }, { "num_vars", 0 } };
offload (__FILE__, __LINE__, device, "__offload_target_table_p1", 2, offload (__FILE__, __LINE__, device, "__offload_target_table_p1", 2, vd1,
vd1, vd1g, NULL); NULL);
int table_size = num_funcs + 2 * num_vars; int table_size = num_funcs + 2 * num_vars;
if (table_size > 0) if (table_size > 0)
...@@ -267,10 +294,9 @@ get_target_table (int device, int &num_funcs, int &num_vars, void **&table) ...@@ -267,10 +294,9 @@ get_target_table (int device, int &num_funcs, int &num_vars, void **&table)
vd2 = vd_tgt2host; vd2 = vd_tgt2host;
vd2.ptr = table; vd2.ptr = table;
vd2.size = table_size * sizeof (void *); vd2.size = table_size * sizeof (void *);
VarDesc2 vd2g = { "table", 0 };
offload (__FILE__, __LINE__, device, "__offload_target_table_p2", 1, offload (__FILE__, __LINE__, device, "__offload_target_table_p2", 1, &vd2,
&vd2, &vd2g, NULL); NULL);
} }
} }
...@@ -280,13 +306,6 @@ get_target_table (int device, int &num_funcs, int &num_vars, void **&table) ...@@ -280,13 +306,6 @@ get_target_table (int device, int &num_funcs, int &num_vars, void **&table)
static void static void
offload_image (const void *target_image) offload_image (const void *target_image)
{ {
struct TargetImage {
int64_t size;
/* 10 characters is enough for max int value. */
char name[sizeof ("lib0000000000.so")];
char data[];
} __attribute__ ((packed));
void *image_start = ((void **) target_image)[0]; void *image_start = ((void **) target_image)[0];
void *image_end = ((void **) target_image)[1]; void *image_end = ((void **) target_image)[1];
...@@ -294,9 +313,8 @@ offload_image (const void *target_image) ...@@ -294,9 +313,8 @@ offload_image (const void *target_image)
target_image, image_start, image_end); target_image, image_start, image_end);
int64_t image_size = (uintptr_t) image_end - (uintptr_t) image_start; int64_t image_size = (uintptr_t) image_end - (uintptr_t) image_start;
TargetImage *image TargetImageDesc *image = (TargetImageDesc *) malloc (offsetof (TargetImageDesc, data)
= (TargetImage *) malloc (sizeof (int64_t) + sizeof ("lib0000000000.so") + image_size);
+ image_size);
if (!image) if (!image)
{ {
fprintf (stderr, "%s: Can't allocate memory\n", __FILE__); fprintf (stderr, "%s: Can't allocate memory\n", __FILE__);
...@@ -309,6 +327,8 @@ offload_image (const void *target_image) ...@@ -309,6 +327,8 @@ offload_image (const void *target_image)
TRACE ("() __offload_register_image %s { %p, %d }", TRACE ("() __offload_register_image %s { %p, %d }",
image->name, image_start, image->size); image->name, image_start, image->size);
/* Do not check the return value, because old versions of liboffloadmic did
not have return values. */
__offload_register_image (image); __offload_register_image (image);
/* Receive tables for target_image from all devices. */ /* Receive tables for target_image from all devices. */
...@@ -343,11 +363,11 @@ offload_image (const void *target_image) ...@@ -343,11 +363,11 @@ offload_image (const void *target_image)
} }
dev_table.push_back (curr_dev_table); dev_table.push_back (curr_dev_table);
delete [] table;
} }
address_table->insert (std::make_pair (target_image, dev_table)); address_table->insert (std::make_pair (target_image, dev_table));
image_descriptors->insert (std::make_pair (target_image, image));
free (image);
} }
/* Return the libgomp version number we're compatible with. There is /* Return the libgomp version number we're compatible with. There is
...@@ -398,49 +418,53 @@ GOMP_OFFLOAD_unload_image (int device, unsigned version, ...@@ -398,49 +418,53 @@ GOMP_OFFLOAD_unload_image (int device, unsigned version,
TRACE ("(device = %d, target_image = %p)", device, target_image); TRACE ("(device = %d, target_image = %p)", device, target_image);
/* TODO: Currently liboffloadmic doesn't support __offload_unregister_image /* liboffloadmic unloads the image from all available devices. */
for libraries. */ if (image_descriptors->count (target_image) > 0)
{
TargetImageDesc *image_desc = (*image_descriptors)[target_image];
__offload_unregister_image (image_desc);
free (image_desc);
address_table->erase (target_image); address_table->erase (target_image);
image_descriptors->erase (target_image);
}
} }
extern "C" void * extern "C" void *
GOMP_OFFLOAD_alloc (int device, size_t size) GOMP_OFFLOAD_alloc (int device, size_t size)
{ {
TRACE ("(size = %d)", size); TRACE ("(device = %d, size = %d)", device, size);
void *tgt_ptr; void *tgt_ptr;
VarDesc vd1[2] = { vd_host2tgt, vd_tgt2host }; VarDesc vd[2] = { vd_host2tgt, vd_tgt2host };
vd1[0].ptr = &size; vd[0].ptr = &size;
vd1[0].size = sizeof (size); vd[0].size = sizeof (size);
vd1[1].ptr = &tgt_ptr; vd[1].ptr = &tgt_ptr;
vd1[1].size = sizeof (void *); vd[1].size = sizeof (void *);
VarDesc2 vd1g[2] = { { "size", 0 }, { "tgt_ptr", 0 } };
offload (__FILE__, __LINE__, device, "__offload_target_alloc", 2, vd, NULL);
offload (__FILE__, __LINE__, device, "__offload_target_alloc", 2, vd1, vd1g,
NULL);
return tgt_ptr; return tgt_ptr;
} }
extern "C" void extern "C" void
GOMP_OFFLOAD_free (int device, void *tgt_ptr) GOMP_OFFLOAD_free (int device, void *tgt_ptr)
{ {
TRACE ("(tgt_ptr = %p)", tgt_ptr); TRACE ("(device = %d, tgt_ptr = %p)", device, tgt_ptr);
VarDesc vd1 = vd_host2tgt; VarDesc vd = vd_host2tgt;
vd1.ptr = &tgt_ptr; vd.ptr = &tgt_ptr;
vd1.size = sizeof (void *); vd.size = sizeof (void *);
VarDesc2 vd1g = { "tgt_ptr", 0 };
offload (__FILE__, __LINE__, device, "__offload_target_free", 1, &vd1, &vd1g, offload (__FILE__, __LINE__, device, "__offload_target_free", 1, &vd, NULL);
NULL);
} }
extern "C" void * extern "C" void *
GOMP_OFFLOAD_host2dev (int device, void *tgt_ptr, const void *host_ptr, GOMP_OFFLOAD_host2dev (int device, void *tgt_ptr, const void *host_ptr,
size_t size) size_t size)
{ {
TRACE ("(tgt_ptr = %p, host_ptr = %p, size = %d)", tgt_ptr, host_ptr, size); TRACE ("(device = %d, tgt_ptr = %p, host_ptr = %p, size = %d)",
device, tgt_ptr, host_ptr, size);
if (!size) if (!size)
return tgt_ptr; return tgt_ptr;
...@@ -449,18 +473,16 @@ GOMP_OFFLOAD_host2dev (int device, void *tgt_ptr, const void *host_ptr, ...@@ -449,18 +473,16 @@ GOMP_OFFLOAD_host2dev (int device, void *tgt_ptr, const void *host_ptr,
vd1[0].size = sizeof (void *); vd1[0].size = sizeof (void *);
vd1[1].ptr = &size; vd1[1].ptr = &size;
vd1[1].size = sizeof (size); vd1[1].size = sizeof (size);
VarDesc2 vd1g[2] = { { "tgt_ptr", 0 }, { "size", 0 } };
offload (__FILE__, __LINE__, device, "__offload_target_host2tgt_p1", 2, offload (__FILE__, __LINE__, device, "__offload_target_host2tgt_p1", 2, vd1,
vd1, vd1g, NULL); NULL);
VarDesc vd2 = vd_host2tgt; VarDesc vd2 = vd_host2tgt;
vd2.ptr = (void *) host_ptr; vd2.ptr = (void *) host_ptr;
vd2.size = size; vd2.size = size;
VarDesc2 vd2g = { "var", 0 };
offload (__FILE__, __LINE__, device, "__offload_target_host2tgt_p2", 1, offload (__FILE__, __LINE__, device, "__offload_target_host2tgt_p2", 1, &vd2,
&vd2, &vd2g, NULL); NULL);
return tgt_ptr; return tgt_ptr;
} }
...@@ -469,7 +491,8 @@ extern "C" void * ...@@ -469,7 +491,8 @@ extern "C" void *
GOMP_OFFLOAD_dev2host (int device, void *host_ptr, const void *tgt_ptr, GOMP_OFFLOAD_dev2host (int device, void *host_ptr, const void *tgt_ptr,
size_t size) size_t size)
{ {
TRACE ("(host_ptr = %p, tgt_ptr = %p, size = %d)", host_ptr, tgt_ptr, size); TRACE ("(device = %d, host_ptr = %p, tgt_ptr = %p, size = %d)",
device, host_ptr, tgt_ptr, size);
if (!size) if (!size)
return host_ptr; return host_ptr;
...@@ -478,18 +501,16 @@ GOMP_OFFLOAD_dev2host (int device, void *host_ptr, const void *tgt_ptr, ...@@ -478,18 +501,16 @@ GOMP_OFFLOAD_dev2host (int device, void *host_ptr, const void *tgt_ptr,
vd1[0].size = sizeof (void *); vd1[0].size = sizeof (void *);
vd1[1].ptr = &size; vd1[1].ptr = &size;
vd1[1].size = sizeof (size); vd1[1].size = sizeof (size);
VarDesc2 vd1g[2] = { { "tgt_ptr", 0 }, { "size", 0 } };
offload (__FILE__, __LINE__, device, "__offload_target_tgt2host_p1", 2, offload (__FILE__, __LINE__, device, "__offload_target_tgt2host_p1", 2, vd1,
vd1, vd1g, NULL); NULL);
VarDesc vd2 = vd_tgt2host; VarDesc vd2 = vd_tgt2host;
vd2.ptr = (void *) host_ptr; vd2.ptr = (void *) host_ptr;
vd2.size = size; vd2.size = size;
VarDesc2 vd2g = { "var", 0 };
offload (__FILE__, __LINE__, device, "__offload_target_tgt2host_p2", 1, offload (__FILE__, __LINE__, device, "__offload_target_tgt2host_p2", 1, &vd2,
&vd2, &vd2g, NULL); NULL);
return host_ptr; return host_ptr;
} }
...@@ -498,21 +519,20 @@ extern "C" void * ...@@ -498,21 +519,20 @@ extern "C" void *
GOMP_OFFLOAD_dev2dev (int device, void *dst_ptr, const void *src_ptr, GOMP_OFFLOAD_dev2dev (int device, void *dst_ptr, const void *src_ptr,
size_t size) size_t size)
{ {
TRACE ("(dst_ptr = %p, src_ptr = %p, size = %d)", dst_ptr, src_ptr, size); TRACE ("(device = %d, dst_ptr = %p, src_ptr = %p, size = %d)",
device, dst_ptr, src_ptr, size);
if (!size) if (!size)
return dst_ptr; return dst_ptr;
VarDesc vd1[3] = { vd_host2tgt, vd_host2tgt, vd_host2tgt }; VarDesc vd[3] = { vd_host2tgt, vd_host2tgt, vd_host2tgt };
vd1[0].ptr = &dst_ptr; vd[0].ptr = &dst_ptr;
vd1[0].size = sizeof (void *); vd[0].size = sizeof (void *);
vd1[1].ptr = &src_ptr; vd[1].ptr = &src_ptr;
vd1[1].size = sizeof (void *); vd[1].size = sizeof (void *);
vd1[2].ptr = &size; vd[2].ptr = &size;
vd1[2].size = sizeof (size); vd[2].size = sizeof (size);
VarDesc2 vd1g[3] = { { "dst_ptr", 0 }, { "src_ptr", 0 }, { "size", 0 } };
offload (__FILE__, __LINE__, device, "__offload_target_tgt2tgt", 3, vd1, offload (__FILE__, __LINE__, device, "__offload_target_tgt2tgt", 3, vd, NULL);
vd1g, NULL);
return dst_ptr; return dst_ptr;
} }
...@@ -530,7 +550,7 @@ GOMP_OFFLOAD_async_run (int device, void *tgt_fn, void *tgt_vars, ...@@ -530,7 +550,7 @@ GOMP_OFFLOAD_async_run (int device, void *tgt_fn, void *tgt_vars,
vd[1].ptr = &tgt_vars; vd[1].ptr = &tgt_vars;
vd[1].size = sizeof (void *); vd[1].size = sizeof (void *);
offload (__FILE__, __LINE__, device, "__offload_target_run", 2, vd, NULL, offload (__FILE__, __LINE__, device, "__offload_target_run", 2, vd,
(const void **) async_data); (const void **) async_data);
} }
......
/* Plugin for offload execution on Intel MIC devices. /* Plugin for offload execution on Intel MIC devices.
Copyright (C) 2014 Free Software Foundation, Inc. Copyright (C) 2014-2015 Free Software Foundation, Inc.
Contributed by Ilya Verbin <ilya.verbin@intel.com>. Contributed by Ilya Verbin <ilya.verbin@intel.com>.
...@@ -139,14 +139,13 @@ __offload_target_table_p1 (OFFLOAD ofldt) ...@@ -139,14 +139,13 @@ __offload_target_table_p1 (OFFLOAD ofldt)
int num_vars = (var_table_end - var_table_begin) / 2; int num_vars = (var_table_end - var_table_begin) / 2;
TRACE ("(num_funcs = %d, num_vars = %d)", num_funcs, num_vars); TRACE ("(num_funcs = %d, num_vars = %d)", num_funcs, num_vars);
VarDesc vd1[2] = { vd_tgt2host, vd_tgt2host }; VarDesc vd[2] = { vd_tgt2host, vd_tgt2host };
vd1[0].ptr = &num_funcs; vd[0].ptr = &num_funcs;
vd1[0].size = sizeof (num_funcs); vd[0].size = sizeof (num_funcs);
vd1[1].ptr = &num_vars; vd[1].ptr = &num_vars;
vd1[1].size = sizeof (num_vars); vd[1].size = sizeof (num_vars);
VarDesc2 vd2[2] = { { "num_funcs", 0 }, { "num_vars", 0 } };
__offload_target_enter (ofldt, 2, vd1, vd2); __offload_target_enter (ofldt, 2, vd, NULL);
__offload_target_leave (ofldt); __offload_target_leave (ofldt);
} }
...@@ -166,13 +165,11 @@ __offload_target_table_p2 (OFFLOAD ofldt) ...@@ -166,13 +165,11 @@ __offload_target_table_p2 (OFFLOAD ofldt)
void **table = (void **) malloc (table_size); void **table = (void **) malloc (table_size);
TRACE ("(table_size = %d)", table_size); TRACE ("(table_size = %d)", table_size);
VarDesc vd1; VarDesc vd = vd_tgt2host;
vd1 = vd_tgt2host; vd.ptr = table;
vd1.ptr = table; vd.size = table_size;
vd1.size = table_size;
VarDesc2 vd2 = { "table", 0 };
__offload_target_enter (ofldt, 1, &vd1, &vd2); __offload_target_enter (ofldt, 1, &vd, NULL);
void **p; void **p;
int i = 0; int i = 0;
...@@ -193,14 +190,13 @@ __offload_target_alloc (OFFLOAD ofldt) ...@@ -193,14 +190,13 @@ __offload_target_alloc (OFFLOAD ofldt)
size_t size = 0; size_t size = 0;
void *ptr = NULL; void *ptr = NULL;
VarDesc vd1[2] = { vd_host2tgt, vd_tgt2host }; VarDesc vd[2] = { vd_host2tgt, vd_tgt2host };
vd1[0].ptr = &size; vd[0].ptr = &size;
vd1[0].size = sizeof (size); vd[0].size = sizeof (size);
vd1[1].ptr = &ptr; vd[1].ptr = &ptr;
vd1[1].size = sizeof (void *); vd[1].size = sizeof (void *);
VarDesc2 vd2[2] = { { "size", 0 }, { "ptr", 0 } };
__offload_target_enter (ofldt, 2, vd1, vd2); __offload_target_enter (ofldt, 2, vd, NULL);
ptr = malloc (size); ptr = malloc (size);
TRACE ("(size = %d): ptr = %p", size, ptr); TRACE ("(size = %d): ptr = %p", size, ptr);
__offload_target_leave (ofldt); __offload_target_leave (ofldt);
...@@ -212,12 +208,11 @@ __offload_target_free (OFFLOAD ofldt) ...@@ -212,12 +208,11 @@ __offload_target_free (OFFLOAD ofldt)
{ {
void *ptr = 0; void *ptr = 0;
VarDesc vd1 = vd_host2tgt; VarDesc vd = vd_host2tgt;
vd1.ptr = &ptr; vd.ptr = &ptr;
vd1.size = sizeof (void *); vd.size = sizeof (void *);
VarDesc2 vd2 = { "ptr", 0 };
__offload_target_enter (ofldt, 1, &vd1, &vd2); __offload_target_enter (ofldt, 1, &vd, NULL);
TRACE ("(ptr = %p)", ptr); TRACE ("(ptr = %p)", ptr);
free (ptr); free (ptr);
__offload_target_leave (ofldt); __offload_target_leave (ofldt);
...@@ -231,14 +226,13 @@ __offload_target_host2tgt_p1 (OFFLOAD ofldt) ...@@ -231,14 +226,13 @@ __offload_target_host2tgt_p1 (OFFLOAD ofldt)
void *var_ptr = NULL; void *var_ptr = NULL;
size_t var_size = 0; size_t var_size = 0;
VarDesc vd1[2] = { vd_host2tgt, vd_host2tgt }; VarDesc vd[2] = { vd_host2tgt, vd_host2tgt };
vd1[0].ptr = &var_ptr; vd[0].ptr = &var_ptr;
vd1[0].size = sizeof (void *); vd[0].size = sizeof (void *);
vd1[1].ptr = &var_size; vd[1].ptr = &var_size;
vd1[1].size = sizeof (var_size); vd[1].size = sizeof (var_size);
VarDesc2 vd2[2] = { { "var_ptr", 0 }, { "var_size", 0 } };
__offload_target_enter (ofldt, 2, vd1, vd2); __offload_target_enter (ofldt, 2, vd, NULL);
TRACE ("(var_ptr = %p, var_size = %d)", var_ptr, var_size); TRACE ("(var_ptr = %p, var_size = %d)", var_ptr, var_size);
last_var_ptr = var_ptr; last_var_ptr = var_ptr;
last_var_size = var_size; last_var_size = var_size;
...@@ -252,12 +246,11 @@ __offload_target_host2tgt_p2 (OFFLOAD ofldt) ...@@ -252,12 +246,11 @@ __offload_target_host2tgt_p2 (OFFLOAD ofldt)
TRACE ("(last_var_ptr = %p, last_var_size = %d)", TRACE ("(last_var_ptr = %p, last_var_size = %d)",
last_var_ptr, last_var_size); last_var_ptr, last_var_size);
VarDesc vd1 = vd_host2tgt; VarDesc vd = vd_host2tgt;
vd1.ptr = last_var_ptr; vd.ptr = last_var_ptr;
vd1.size = last_var_size; vd.size = last_var_size;
VarDesc2 vd2 = { "var", 0 };
__offload_target_enter (ofldt, 1, &vd1, &vd2); __offload_target_enter (ofldt, 1, &vd, NULL);
__offload_target_leave (ofldt); __offload_target_leave (ofldt);
} }
...@@ -269,14 +262,13 @@ __offload_target_tgt2host_p1 (OFFLOAD ofldt) ...@@ -269,14 +262,13 @@ __offload_target_tgt2host_p1 (OFFLOAD ofldt)
void *var_ptr = NULL; void *var_ptr = NULL;
size_t var_size = 0; size_t var_size = 0;
VarDesc vd1[2] = { vd_host2tgt, vd_host2tgt }; VarDesc vd[2] = { vd_host2tgt, vd_host2tgt };
vd1[0].ptr = &var_ptr; vd[0].ptr = &var_ptr;
vd1[0].size = sizeof (void *); vd[0].size = sizeof (void *);
vd1[1].ptr = &var_size; vd[1].ptr = &var_size;
vd1[1].size = sizeof (var_size); vd[1].size = sizeof (var_size);
VarDesc2 vd2[2] = { { "var_ptr", 0 }, { "var_size", 0 } };
__offload_target_enter (ofldt, 2, vd1, vd2); __offload_target_enter (ofldt, 2, vd, NULL);
TRACE ("(var_ptr = %p, var_size = %d)", var_ptr, var_size); TRACE ("(var_ptr = %p, var_size = %d)", var_ptr, var_size);
last_var_ptr = var_ptr; last_var_ptr = var_ptr;
last_var_size = var_size; last_var_size = var_size;
...@@ -290,12 +282,11 @@ __offload_target_tgt2host_p2 (OFFLOAD ofldt) ...@@ -290,12 +282,11 @@ __offload_target_tgt2host_p2 (OFFLOAD ofldt)
TRACE ("(last_var_ptr = %p, last_var_size = %d)", TRACE ("(last_var_ptr = %p, last_var_size = %d)",
last_var_ptr, last_var_size); last_var_ptr, last_var_size);
VarDesc vd1 = vd_tgt2host; VarDesc vd = vd_tgt2host;
vd1.ptr = last_var_ptr; vd.ptr = last_var_ptr;
vd1.size = last_var_size; vd.size = last_var_size;
VarDesc2 vd2 = { "var", 0 };
__offload_target_enter (ofldt, 1, &vd1, &vd2); __offload_target_enter (ofldt, 1, &vd, NULL);
__offload_target_leave (ofldt); __offload_target_leave (ofldt);
} }
...@@ -307,16 +298,15 @@ __offload_target_tgt2tgt (OFFLOAD ofldt) ...@@ -307,16 +298,15 @@ __offload_target_tgt2tgt (OFFLOAD ofldt)
void *dst_ptr = NULL; void *dst_ptr = NULL;
size_t size = 0; size_t size = 0;
VarDesc vd1[3] = { vd_host2tgt, vd_host2tgt, vd_host2tgt }; VarDesc vd[3] = { vd_host2tgt, vd_host2tgt, vd_host2tgt };
vd1[0].ptr = &dst_ptr; vd[0].ptr = &dst_ptr;
vd1[0].size = sizeof (void *); vd[0].size = sizeof (void *);
vd1[1].ptr = &src_ptr; vd[1].ptr = &src_ptr;
vd1[1].size = sizeof (void *); vd[1].size = sizeof (void *);
vd1[2].ptr = &size; vd[2].ptr = &size;
vd1[2].size = sizeof (size); vd[2].size = sizeof (size);
VarDesc2 vd1g[3] = { { "dst_ptr", 0 }, { "src_ptr", 0 }, { "size", 0 } };
__offload_target_enter (ofldt, 3, vd1, vd1g); __offload_target_enter (ofldt, 3, vd, NULL);
TRACE ("(dst_ptr = %p, src_ptr = %p, size = %d)", dst_ptr, src_ptr, size); TRACE ("(dst_ptr = %p, src_ptr = %p, size = %d)", dst_ptr, src_ptr, size);
memcpy (dst_ptr, src_ptr, size); memcpy (dst_ptr, src_ptr, size);
__offload_target_leave (ofldt); __offload_target_leave (ofldt);
...@@ -329,14 +319,13 @@ __offload_target_run (OFFLOAD ofldt) ...@@ -329,14 +319,13 @@ __offload_target_run (OFFLOAD ofldt)
void *fn_ptr; void *fn_ptr;
void *vars_ptr; void *vars_ptr;
VarDesc vd1[2] = { vd_host2tgt, vd_host2tgt }; VarDesc vd[2] = { vd_host2tgt, vd_host2tgt };
vd1[0].ptr = &fn_ptr; vd[0].ptr = &fn_ptr;
vd1[0].size = sizeof (void *); vd[0].size = sizeof (void *);
vd1[1].ptr = &vars_ptr; vd[1].ptr = &vars_ptr;
vd1[1].size = sizeof (void *); vd[1].size = sizeof (void *);
VarDesc2 vd2[2] = { { "fn_ptr", 0 }, { "vars_ptr", 0 } };
__offload_target_enter (ofldt, 2, vd1, vd2); __offload_target_enter (ofldt, 2, vd, NULL);
TRACE ("(fn_ptr = %p, vars_ptr = %p)", fn_ptr, vars_ptr); TRACE ("(fn_ptr = %p, vars_ptr = %p)", fn_ptr, vars_ptr);
void (*fn)(void *) = (void (*)(void *)) fn_ptr; void (*fn)(void *) = (void (*)(void *)) fn_ptr;
fn (vars_ptr); fn (vars_ptr);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment