Hi! On Tue, 11 Nov 2014 13:53:23 +0000, Julian Brown <jul...@codesourcery.com> wrote: > On Tue, 23 Sep 2014 19:19:31 +0100 > Julian Brown <jul...@codesourcery.com> wrote: > > > This patch contains the bulk of the OpenACC 2.0 runtime support, > > building around, or on top of, the OpenMP 4.0 support (as previously > > posted or already extant upstream) where we could. [...] > > Here is a new version of the OpenACC support patch for libgomp, [...]
> --- a/libgomp/target.c > +++ b/libgomp/target.c > @@ -920,6 +1111,43 @@ gomp_target_init (void) > } > while (next); > > + /* Prefer a device with TARGET_CAP_OPENMP_400 for ICV default-device-var. > */ > + if (num_devices > 1) > + { > + int d = gomp_icv (false)->default_device_var; > + > + if (!(devices[d].capabilities & TARGET_CAP_OPENMP_400)) > + { > + for (i = 0; i < num_devices; i++) > + { > + if (devices[i].capabilities & TARGET_CAP_OPENMP_400) > + { > + struct gomp_device_descr device_tmp = devices[d]; > + devices[d] = devices[i]; > + devices[d].id = d + 1; > + devices[i] = device_tmp; > + devices[i].id = i + 1; > + > + break; > + } > + } > + } > + } A thinko of mine; committed to gomp-4_0-branch in r219029: commit 806b4f5eed613a43bf52082816469268df0ed9a5 Author: tschwinge <tschwinge@138bc75d-0d04-0410-961f-82ee72b054a4> Date: Mon Dec 22 18:31:42 2014 +0000 libgomp: For OpenMP offloading, only publicize GOMP_OFFLOAD_CAP_OPENMP_400 devices. libgomp/ * target.c (num_devices_openmp): New variable. (gomp_get_num_devices): Use it. (gomp_target_init): Initialize it, and sort the devices array appropriately. With Intel MIC offloading (emulation), this fixes: FAIL: libgomp.c/examples-4/e.57.2.c execution test FAIL: libgomp.fortran/examples-4/e.57.2.f90 -O0 execution test FAIL: libgomp.fortran/examples-4/e.57.2.f90 -O1 execution test FAIL: libgomp.fortran/examples-4/e.57.2.f90 -O2 execution test FAIL: libgomp.fortran/examples-4/e.57.2.f90 -O3 -fomit-frame-pointer execution test FAIL: libgomp.fortran/examples-4/e.57.2.f90 -O3 -fomit-frame-pointer -funroll-loops execution test FAIL: libgomp.fortran/examples-4/e.57.2.f90 -O3 -fomit-frame-pointer -funroll-all-loops -finline-functions execution test FAIL: libgomp.fortran/examples-4/e.57.2.f90 -O3 -g execution test FAIL: libgomp.fortran/examples-4/e.57.2.f90 -Os execution test git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gomp-4_0-branch@219029 138bc75d-0d04-0410-961f-82ee72b054a4 --- libgomp/ChangeLog.gomp | 5 +++++ libgomp/target.c | 52 ++++++++++++++++++++++++++++---------------------- 2 files changed, 34 insertions(+), 23 deletions(-) diff --git libgomp/ChangeLog.gomp libgomp/ChangeLog.gomp index eabf737..b9bd024 100644 --- libgomp/ChangeLog.gomp +++ libgomp/ChangeLog.gomp @@ -1,5 +1,10 @@ 2014-12-22 Thomas Schwinge <tho...@codesourcery.com> + * target.c (num_devices_openmp): New variable. + (gomp_get_num_devices): Use it. + (gomp_target_init): Initialize it, and sort the devices array + appropriately. + * libgomp.h (struct gomp_device_descr): Remove id member. Update all users. diff --git libgomp/target.c libgomp/target.c index 226b95b..bf6edd2 100644 --- libgomp/target.c +++ libgomp/target.c @@ -67,6 +67,9 @@ static struct gomp_device_descr *devices; /* Total number of available devices. */ static int num_devices; +/* Number of GOMP_OFFLOAD_CAP_OPENMP_400 devices. */ +static int num_devices_openmp; + /* The comparison function. */ attribute_hidden int @@ -94,7 +97,7 @@ attribute_hidden int gomp_get_num_devices (void) { gomp_init_targets_once (); - return num_devices; + return num_devices_openmp; } static struct gomp_device_descr * @@ -1048,9 +1051,11 @@ gomp_register_image_for_device (struct gomp_device_descr *device, } /* This function initializes the runtime needed for offloading. - It parses the list of offload targets and tries to load the plugins for these - targets. Result of the function is properly initialized variable NUM_DEVICES - and array DEVICES, containing descriptors for corresponding devices. */ + It parses the list of offload targets and tries to load the plugins for + these targets. On return, the variables NUM_DEVICES and NUM_DEVICES_OPENMP + will be set, and the array DEVICES initialized, containing descriptors for + corresponding devices, first the GOMP_OFFLOAD_CAP_OPENMP_400 ones, follows + by the others. */ static void gomp_target_init (void) @@ -1089,6 +1094,8 @@ gomp_target_init (void) new_num_devices = current_device.get_num_devices_func (); if (new_num_devices >= 1) { + /* Augment DEVICES and NUM_DEVICES. */ + devices = realloc (devices, (num_devices + new_num_devices) * sizeof (struct gomp_device_descr)); if (!devices) @@ -1121,27 +1128,26 @@ gomp_target_init (void) } while (next); - /* Prefer a device with GOMP_OFFLOAD_CAP_OPENMP_400 for ICV - default-device-var. */ - if (num_devices > 1) + /* In DEVICES, sort the GOMP_OFFLOAD_CAP_OPENMP_400 ones first, and set + NUM_DEVICES_OPENMP. */ + struct gomp_device_descr *devices_s + = malloc (num_devices * sizeof (struct gomp_device_descr)); + if (!devices_s) { - int d = gomp_icv (false)->default_device_var; - - if (!(devices[d].capabilities & GOMP_OFFLOAD_CAP_OPENMP_400)) - { - for (i = 0; i < num_devices; i++) - { - if (devices[i].capabilities & GOMP_OFFLOAD_CAP_OPENMP_400) - { - struct gomp_device_descr device_tmp = devices[d]; - devices[d] = devices[i]; - devices[i] = device_tmp; - - break; - } - } - } + num_devices = 0; + free (devices); + devices = NULL; } + num_devices_openmp = 0; + for (i = 0; i < num_devices; i++) + if (devices[i].capabilities & GOMP_OFFLOAD_CAP_OPENMP_400) + devices_s[num_devices_openmp++] = devices[i]; + int num_devices_after_openmp = num_devices_openmp; + for (i = 0; i < num_devices; i++) + if (!(devices[i].capabilities & GOMP_OFFLOAD_CAP_OPENMP_400)) + devices_s[num_devices_after_openmp++] = devices[i]; + free (devices); + devices = devices_s; for (i = 0; i < num_devices; i++) { Grüße, Thomas
signature.asc
Description: PGP signature