(git:ccc2433)
offload_buffer.c
Go to the documentation of this file.
1 /*----------------------------------------------------------------------------*/
2 /* CP2K: A general program to perform molecular dynamics simulations */
3 /* Copyright 2000-2024 CP2K developers group <https://cp2k.org> */
4 /* */
5 /* SPDX-License-Identifier: BSD-3-Clause */
6 /*----------------------------------------------------------------------------*/
7 
8 #include <assert.h>
9 #include <stdio.h>
10 #include <stdlib.h>
11 
12 #include "offload_buffer.h"
13 #include "offload_library.h"
14 #include "offload_runtime.h"
15 
16 /*******************************************************************************
17  * \brief Allocates a buffer of given length, ie., number of elements.
18  * \author Ole Schuett
19  ******************************************************************************/
20 void offload_create_buffer(const int length, offload_buffer **buffer) {
21  const size_t requested_size = sizeof(double) * length;
22 
23  if (*buffer != NULL) {
24  if ((*buffer)->size >= requested_size) {
25  return; // reuse existing buffer
26  } else {
27  offload_free_buffer(*buffer);
28  }
29  }
30 
31  (*buffer) = malloc(sizeof(offload_buffer));
32  (*buffer)->size = requested_size;
33  (*buffer)->host_buffer = NULL;
34  (*buffer)->device_buffer = NULL;
35 #if defined(__OFFLOAD)
37  offloadMallocHost((void **)&(*buffer)->host_buffer, requested_size);
38  offloadMalloc((void **)&(*buffer)->device_buffer, requested_size);
39 #else
40  (*buffer)->host_buffer = malloc(requested_size);
41  (*buffer)->device_buffer = NULL;
42 #endif
43  if (NULL == (*buffer)->host_buffer) { /* unified memory */
44  (*buffer)->host_buffer = (*buffer)->device_buffer;
45  }
46 }
47 
48 /*******************************************************************************
49  * \brief Deallocate given buffer.
50  * \author Ole Schuett
51  ******************************************************************************/
53  if (NULL == buffer)
54  return;
55 #if defined(__OFFLOAD)
56  offloadFreeHost(buffer->host_buffer);
57  offloadFree(buffer->device_buffer);
58 #else
59  free(buffer->host_buffer);
60 #endif
61  free(buffer);
62 }
63 
64 /*******************************************************************************
65  * \brief Returns a pointer to the host buffer.
66  * \author Ole Schuett
67  ******************************************************************************/
69  assert(NULL != buffer);
70  return buffer->host_buffer;
71 }
72 
73 // EOF
subroutine, public offload_activate_chosen_device()
Activates the device selected via offload_set_chosen_device()
Definition: offload_api.F:174
void offload_free_buffer(offload_buffer *buffer)
Deallocate given buffer.
double * offload_get_buffer_host_pointer(offload_buffer *buffer)
Returns a pointer to the host buffer.
void offload_create_buffer(const int length, offload_buffer **buffer)
Allocates a buffer of given length, ie., number of elements.
Internal representation of a buffer.
double * device_buffer
double * host_buffer