1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116
|
/* -----------------------------------------------------------------
* Programmer(s): David J. Gardner @ LLNL
* -----------------------------------------------------------------
* SUNDIALS Copyright Start
* Copyright (c) 2002-2022, Lawrence Livermore National Security
* and Southern Methodist University.
* All rights reserved.
*
* See the top-level LICENSE and NOTICE files for details.
*
* SPDX-License-Identifier: BSD-3-Clause
* SUNDIALS Copyright End
* -----------------------------------------------------------------
* Example of a custom SUNMemoryHelper that only supports SYCL
* unmanaged memory only and synchronous copies.
* -----------------------------------------------------------------*/
#include <cstdlib>
#include <CL/sycl.hpp>
#include <sundials/sundials_memory.h>
int MyMemoryHelper_Alloc(SUNMemoryHelper helper, SUNMemory* memptr,
size_t memsize, SUNMemoryType mem_type, void* queue)
{
if (!queue) return -1;
sycl::queue* sycl_queue = static_cast<sycl::queue*>(queue);
SUNMemory mem = SUNMemoryNewEmpty();
if (mem == NULL) return -1;
mem->ptr = NULL;
mem->own = SUNTRUE;
if (mem_type == SUNMEMTYPE_HOST)
{
mem->ptr = malloc(memsize);
if (mem->ptr == NULL) { free(mem); return -1; }
mem->type = SUNMEMTYPE_HOST;
}
else if (mem_type == SUNMEMTYPE_DEVICE)
{
mem->ptr = sycl::malloc_device(memsize, *sycl_queue);
if (mem->ptr == NULL) { free(mem); return -1; }
mem->type = SUNMEMTYPE_DEVICE;
}
else
{
free(mem);
return -1;
}
*memptr = mem;
return 0;
}
int MyMemoryHelper_Dealloc(SUNMemoryHelper helper, SUNMemory mem, void* queue)
{
if (!mem) return 0;
if (mem->ptr && mem->own)
{
if (!queue) return -1;
sycl::queue* sycl_queue = static_cast<sycl::queue*>(queue);
if (mem->type == SUNMEMTYPE_HOST)
{
free(mem->ptr);
mem->ptr = NULL;
}
else if (mem->type == SUNMEMTYPE_DEVICE)
{
sycl::free(mem->ptr, *sycl_queue);
mem->ptr = NULL;
}
else
{
return -1;
}
}
free(mem);
return 0;
}
int MyMemoryHelper_Copy(SUNMemoryHelper helper, SUNMemory dst,
SUNMemory src, size_t memory_size, void* queue)
{
if (!queue) return -1;
sycl::queue* sycl_queue = static_cast<sycl::queue*>(queue);
if (src->type == SUNMEMTYPE_HOST && dst->type == SUNMEMTYPE_HOST)
{
memcpy(dst->ptr, src->ptr, memory_size);
}
else
{
sycl_queue->memcpy(dst->ptr, src->ptr, memory_size);
}
sycl_queue->wait_and_throw();
return 0;
}
SUNMemoryHelper MyMemoryHelper(SUNContext sunctx)
{
SUNMemoryHelper helper = SUNMemoryHelper_NewEmpty(sunctx);
if (helper == NULL) return NULL;
/* Set the ops */
helper->ops->alloc = MyMemoryHelper_Alloc;
helper->ops->dealloc = MyMemoryHelper_Dealloc;
helper->ops->copy = MyMemoryHelper_Copy;
return helper;
}
|