/* 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>.
- This file is part of the GNU OpenMP Library (libgomp).
+ 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
int num_vars = (var_table_end - var_table_begin) / 2;
TRACE ("(num_funcs = %d, num_vars = %d)", num_funcs, num_vars);
- VarDesc vd1[2] = { vd_tgt2host, vd_tgt2host };
- vd1[0].ptr = &num_funcs;
- vd1[0].size = sizeof (num_funcs);
- vd1[1].ptr = &num_vars;
- vd1[1].size = sizeof (num_vars);
- VarDesc2 vd2[2] = { { "num_funcs", 0 }, { "num_vars", 0 } };
+ VarDesc vd[2] = { vd_tgt2host, vd_tgt2host };
+ vd[0].ptr = &num_funcs;
+ vd[0].size = sizeof (num_funcs);
+ vd[1].ptr = &num_vars;
+ vd[1].size = sizeof (num_vars);
- __offload_target_enter (ofldt, 2, vd1, vd2);
+ __offload_target_enter (ofldt, 2, vd, NULL);
__offload_target_leave (ofldt);
}
void **table = (void **) malloc (table_size);
TRACE ("(table_size = %d)", table_size);
- VarDesc vd1;
- vd1 = vd_tgt2host;
- vd1.ptr = table;
- vd1.size = table_size;
- VarDesc2 vd2 = { "table", 0 };
+ VarDesc vd = vd_tgt2host;
+ vd.ptr = table;
+ vd.size = table_size;
- __offload_target_enter (ofldt, 1, &vd1, &vd2);
+ __offload_target_enter (ofldt, 1, &vd, NULL);
void **p;
int i = 0;
size_t size = 0;
void *ptr = NULL;
- VarDesc vd1[2] = { vd_host2tgt, vd_tgt2host };
- vd1[0].ptr = &size;
- vd1[0].size = sizeof (size);
- vd1[1].ptr = &ptr;
- vd1[1].size = sizeof (void *);
- VarDesc2 vd2[2] = { { "size", 0 }, { "ptr", 0 } };
+ VarDesc vd[2] = { vd_host2tgt, vd_tgt2host };
+ vd[0].ptr = &size;
+ vd[0].size = sizeof (size);
+ vd[1].ptr = &ptr;
+ vd[1].size = sizeof (void *);
- __offload_target_enter (ofldt, 2, vd1, vd2);
+ __offload_target_enter (ofldt, 2, vd, NULL);
ptr = malloc (size);
TRACE ("(size = %d): ptr = %p", size, ptr);
__offload_target_leave (ofldt);
{
void *ptr = 0;
- VarDesc vd1 = vd_host2tgt;
- vd1.ptr = &ptr;
- vd1.size = sizeof (void *);
- VarDesc2 vd2 = { "ptr", 0 };
+ VarDesc vd = vd_host2tgt;
+ vd.ptr = &ptr;
+ vd.size = sizeof (void *);
- __offload_target_enter (ofldt, 1, &vd1, &vd2);
+ __offload_target_enter (ofldt, 1, &vd, NULL);
TRACE ("(ptr = %p)", ptr);
free (ptr);
__offload_target_leave (ofldt);
void *var_ptr = NULL;
size_t var_size = 0;
- VarDesc vd1[2] = { vd_host2tgt, vd_host2tgt };
- vd1[0].ptr = &var_ptr;
- vd1[0].size = sizeof (void *);
- vd1[1].ptr = &var_size;
- vd1[1].size = sizeof (var_size);
- VarDesc2 vd2[2] = { { "var_ptr", 0 }, { "var_size", 0 } };
+ VarDesc vd[2] = { vd_host2tgt, vd_host2tgt };
+ vd[0].ptr = &var_ptr;
+ vd[0].size = sizeof (void *);
+ vd[1].ptr = &var_size;
+ vd[1].size = sizeof (var_size);
- __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);
last_var_ptr = var_ptr;
last_var_size = var_size;
TRACE ("(last_var_ptr = %p, last_var_size = %d)",
last_var_ptr, last_var_size);
- VarDesc vd1 = vd_host2tgt;
- vd1.ptr = last_var_ptr;
- vd1.size = last_var_size;
- VarDesc2 vd2 = { "var", 0 };
+ VarDesc vd = vd_host2tgt;
+ vd.ptr = last_var_ptr;
+ vd.size = last_var_size;
- __offload_target_enter (ofldt, 1, &vd1, &vd2);
+ __offload_target_enter (ofldt, 1, &vd, NULL);
__offload_target_leave (ofldt);
}
void *var_ptr = NULL;
size_t var_size = 0;
- VarDesc vd1[2] = { vd_host2tgt, vd_host2tgt };
- vd1[0].ptr = &var_ptr;
- vd1[0].size = sizeof (void *);
- vd1[1].ptr = &var_size;
- vd1[1].size = sizeof (var_size);
- VarDesc2 vd2[2] = { { "var_ptr", 0 }, { "var_size", 0 } };
+ VarDesc vd[2] = { vd_host2tgt, vd_host2tgt };
+ vd[0].ptr = &var_ptr;
+ vd[0].size = sizeof (void *);
+ vd[1].ptr = &var_size;
+ vd[1].size = sizeof (var_size);
- __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);
last_var_ptr = var_ptr;
last_var_size = var_size;
TRACE ("(last_var_ptr = %p, last_var_size = %d)",
last_var_ptr, last_var_size);
- VarDesc vd1 = vd_tgt2host;
- vd1.ptr = last_var_ptr;
- vd1.size = last_var_size;
- VarDesc2 vd2 = { "var", 0 };
+ VarDesc vd = vd_tgt2host;
+ vd.ptr = last_var_ptr;
+ vd.size = last_var_size;
- __offload_target_enter (ofldt, 1, &vd1, &vd2);
+ __offload_target_enter (ofldt, 1, &vd, NULL);
+ __offload_target_leave (ofldt);
+}
+
+/* Copy SIZE bytes from SRC_PTR to DST_PTR. */
+static void
+__offload_target_tgt2tgt (OFFLOAD ofldt)
+{
+ void *src_ptr = NULL;
+ void *dst_ptr = NULL;
+ size_t size = 0;
+
+ VarDesc vd[3] = { vd_host2tgt, vd_host2tgt, vd_host2tgt };
+ vd[0].ptr = &dst_ptr;
+ vd[0].size = sizeof (void *);
+ vd[1].ptr = &src_ptr;
+ vd[1].size = sizeof (void *);
+ vd[2].ptr = &size;
+ vd[2].size = sizeof (size);
+
+ __offload_target_enter (ofldt, 3, vd, NULL);
+ TRACE ("(dst_ptr = %p, src_ptr = %p, size = %d)", dst_ptr, src_ptr, size);
+ memcpy (dst_ptr, src_ptr, size);
__offload_target_leave (ofldt);
}
void *fn_ptr;
void *vars_ptr;
- VarDesc vd1[2] = { vd_host2tgt, vd_host2tgt };
- vd1[0].ptr = &fn_ptr;
- vd1[0].size = sizeof (void *);
- vd1[1].ptr = &vars_ptr;
- vd1[1].size = sizeof (void *);
- VarDesc2 vd2[2] = { { "fn_ptr", 0 }, { "vars_ptr", 0 } };
+ VarDesc vd[2] = { vd_host2tgt, vd_host2tgt };
+ vd[0].ptr = &fn_ptr;
+ vd[0].size = sizeof (void *);
+ vd[1].ptr = &vars_ptr;
+ vd[1].size = sizeof (void *);
- __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);
void (*fn)(void *) = (void (*)(void *)) fn_ptr;
fn (vars_ptr);
REGISTER (host2tgt_p2);
REGISTER (tgt2host_p1);
REGISTER (tgt2host_p2);
+REGISTER (tgt2tgt);
REGISTER (run);
#undef REGISTER