mirror of
https://github.com/cp2k/cp2k.git
synced 2026-07-28 22:25:32 -04:00
OFFLOAD: slightly revised init/deinit (#5352)
This commit is contained in:
parent
8dea62cad1
commit
76dcc75b62
3 changed files with 36 additions and 27 deletions
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue