diff --git a/src/offload/offload_api.F b/src/offload/offload_api.F index 054b81ee3e..6186f2e771 100644 --- a/src/offload/offload_api.F +++ b/src/offload/offload_api.F @@ -261,7 +261,6 @@ CONTAINS END SUBROUTINE offload_create_buffer_c END INTERFACE INTERFACE - FUNCTION offload_get_buffer_host_pointer_c(buffer) & BIND(C, name="offload_get_buffer_host_pointer") IMPORT :: C_PTR diff --git a/src/offload/offload_buffer.c b/src/offload/offload_buffer.c index b96a078241..45bfc93d49 100644 --- a/src/offload/offload_buffer.c +++ b/src/offload/offload_buffer.c @@ -18,34 +18,54 @@ #endif /******************************************************************************* - * \brief Allocates a buffer of given length, ie., number of elements. - * \author Ole Schuett + * \brief Internal routine to deallocate given buffer. + * \author Hans Pabst + ******************************************************************************/ +static void offload_free_buffer_internal(offload_buffer *buffer) { + assert(NULL != buffer); +#if defined(OFFLOAD_BUFFER_MEMPOOL) + offload_mempool_host_free(buffer->host_buffer); + offload_mempool_device_free(buffer->device_buffer); +#elif defined(__OFFLOAD) + offloadFreeHost(buffer->host_buffer); + offloadFree(buffer->device_buffer); +#else + free(buffer->host_buffer); + assert(NULL == buffer->device_buffer); +#endif +} + +/******************************************************************************* + * \brief Allocates a buffer (NULL or valid) with the given number of elements. + * \author Ole Schuett and Hans Pabst ******************************************************************************/ void offload_create_buffer(const int length, offload_buffer **buffer) { const size_t requested_size = sizeof(double) * length; if (*buffer != NULL) { -#if !defined(OFFLOAD_BUFFER_MEMPOOL) - if ((*buffer)->size >= requested_size) { + if (requested_size <= (*buffer)->size) { return; // reuse existing buffer - } else -#endif - { - offload_free_buffer(*buffer); + } else { + offload_free_buffer_internal(*buffer); } + } else { + (*buffer) = malloc(sizeof(offload_buffer)); + assert(NULL != *buffer); } - (*buffer) = malloc(sizeof(offload_buffer)); - assert(NULL != *buffer); (*buffer)->size = requested_size; (*buffer)->host_buffer = NULL; (*buffer)->device_buffer = NULL; #if defined(OFFLOAD_BUFFER_MEMPOOL) +#if !defined(__OFFLOAD_UNIFIED_MEMORY) (*buffer)->host_buffer = offload_mempool_host_malloc(requested_size); +#endif (*buffer)->device_buffer = offload_mempool_device_malloc(requested_size); #elif defined(__OFFLOAD) offload_activate_chosen_device(); +#if !defined(__OFFLOAD_UNIFIED_MEMORY) offloadMallocHost((void **)&(*buffer)->host_buffer, requested_size); +#endif offloadMalloc((void **)&(*buffer)->device_buffer, requested_size); #else (*buffer)->host_buffer = malloc(requested_size); @@ -61,24 +81,14 @@ void offload_create_buffer(const int length, offload_buffer **buffer) { * \author Ole Schuett ******************************************************************************/ void offload_free_buffer(offload_buffer *buffer) { - if (NULL == buffer) { - return; + if (NULL != buffer) { + offload_free_buffer_internal(buffer); + free(buffer); } -#if defined(OFFLOAD_BUFFER_MEMPOOL) - offload_mempool_host_free(buffer->host_buffer); - offload_mempool_device_free(buffer->device_buffer); -#elif defined(__OFFLOAD) - offloadFreeHost(buffer->host_buffer); - offloadFree(buffer->device_buffer); -#else - free(buffer->host_buffer); - assert(NULL == buffer->device_buffer); -#endif - free(buffer); } /******************************************************************************* - * \brief Returns a pointer to the host buffer. + * \brief Returns a pointer to the host buffer (Fortran API). * \author Ole Schuett ******************************************************************************/ double *offload_get_buffer_host_pointer(offload_buffer *buffer) { diff --git a/src/offload/offload_buffer.h b/src/offload/offload_buffer.h index 9b44e75b35..be358edc4e 100644 --- a/src/offload/offload_buffer.h +++ b/src/offload/offload_buffer.h @@ -20,7 +20,7 @@ typedef struct { } offload_buffer; /******************************************************************************* - * \brief Allocates a buffer of given length, ie., number of elements. + * \brief Allocate a buffer (NULL or valid) with the given number of elements. * \author Ole Schuett ******************************************************************************/ void offload_create_buffer(const int length, offload_buffer **buffer); @@ -32,7 +32,7 @@ void offload_create_buffer(const int length, offload_buffer **buffer); void offload_free_buffer(offload_buffer *buffer); /******************************************************************************* - * \brief Returns a pointer to the host buffer. + * \brief Return a pointer to the host buffer (Fortran API). * \author Ole Schuett ******************************************************************************/ double *offload_get_buffer_host_pointer(offload_buffer *buffer);