OFFLOAD: slightly revised init/deinit (#5352)

This commit is contained in:
Hans Pabst 2026-06-04 13:36:27 +02:00 committed by GitHub
parent 8dea62cad1
commit 76dcc75b62
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 36 additions and 27 deletions

View file

@ -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

View file

@ -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) {

View file

@ -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);