Previous support for device memory allocators used a single free
routine and did not provide the original kind of the allocation. This is
problematic as some of these memory types required different handling.
Previously this was worked around using a map in runtime to record the
original kind of each pointer. Instead, this patch introduces new free
routines similar to the existing allocation routines. This allows us to
avoid a map traversal every time we free a device pointer.
The only interfaces defined by the standard are omp_target_alloc and
omp_target_free, these do not take a kind as omp_alloc does. The
standard dictates the following:
"The omp_target_alloc routine returns a device pointer that references
the device address of a storage location of size bytes. The storage
location is dynamically allocated in the device data environment of the
device specified by device_num."
Which suggests that these routines only allocate the default device
memory for the kind. So this has been changed to reflect this. This
change is somewhat breaking if users were using omp_target_free as
previously shown in the tests.
Might be better to avoid the default argument here in favour of explicit at call site since that'll help pair up allocation kind when reading the implementation. Probably as a follow up patch to this one since the verbosity would detract from the review.