xref: /libCEED/rust/libceed-sys/c-src/backends/magma/ceed-magma.c (revision 49aac155e7a09736f56fb3abac0f57dab29f7cbf)
13d8e8822SJeremy L Thompson // Copyright (c) 2017-2022, Lawrence Livermore National Security, LLC and other CEED contributors.
23d8e8822SJeremy L Thompson // All Rights Reserved. See the top-level LICENSE and NOTICE files for details.
382b77998SStan Tomov //
43d8e8822SJeremy L Thompson // SPDX-License-Identifier: BSD-2-Clause
582b77998SStan Tomov //
63d8e8822SJeremy L Thompson // This file is part of CEED:  http://github.com/ceed
782b77998SStan Tomov 
838612b08SStan Tomov #include "ceed-magma.h"
952d6035fSJeremy L Thompson 
10*49aac155SJeremy L Thompson #include <ceed.h>
112b730f8bSJeremy L Thompson #include <ceed/backend.h>
122b730f8bSJeremy L Thompson #include <stdlib.h>
132b730f8bSJeremy L Thompson #include <string.h>
142b730f8bSJeremy L Thompson 
15e0582403Sabdelfattah83 static int CeedDestroy_Magma(Ceed ceed) {
16e0582403Sabdelfattah83   Ceed_Magma *data;
172b730f8bSJeremy L Thompson   CeedCallBackend(CeedGetData(ceed, &data));
18e0582403Sabdelfattah83   magma_queue_destroy(data->queue);
192b730f8bSJeremy L Thompson   CeedCallBackend(CeedFree(&data));
20e15f9bd0SJeremy L Thompson   return CEED_ERROR_SUCCESS;
21e0582403Sabdelfattah83 }
22e0582403Sabdelfattah83 
2382b77998SStan Tomov static int CeedInit_Magma(const char *resource, Ceed ceed) {
241dc2661bSVeselin Dobrev   int       ierr;
256dbfb411Snbeams   const int nrc = 14;  // number of characters in resource
262b730f8bSJeremy L Thompson   if (strncmp(resource, "/gpu/cuda/magma", nrc) && strncmp(resource, "/gpu/hip/magma", nrc)) {
277f5b9731SStan Tomov     // LCOV_EXCL_START
282b730f8bSJeremy L Thompson     return CeedError(ceed, CEED_ERROR_BACKEND, "Magma backend cannot use resource: %s", resource);
297f5b9731SStan Tomov     // LCOV_EXCL_STOP
302b730f8bSJeremy L Thompson   }
317f5b9731SStan Tomov 
321dc2661bSVeselin Dobrev   ierr = magma_init();
332b730f8bSJeremy L Thompson   if (ierr) {
347f5b9731SStan Tomov     // LCOV_EXCL_START
35e15f9bd0SJeremy L Thompson     return CeedError(ceed, CEED_ERROR_BACKEND, "error in magma_init(): %d\n", ierr);
367f5b9731SStan Tomov     // LCOV_EXCL_STOP
372b730f8bSJeremy L Thompson   }
3893fbe329SStan Tomov 
39e0582403Sabdelfattah83   Ceed_Magma *data;
402b730f8bSJeremy L Thompson   CeedCallBackend(CeedCalloc(sizeof(Ceed_Magma), &data));
412b730f8bSJeremy L Thompson   CeedCallBackend(CeedSetData(ceed, data));
42e0582403Sabdelfattah83 
43e0582403Sabdelfattah83   // kernel selection
44e0582403Sabdelfattah83   data->basis_kernel_mode = MAGMA_KERNEL_DIM_SPECIFIC;
45e0582403Sabdelfattah83 
466dbfb411Snbeams   // get/set device ID
476dbfb411Snbeams   const char *device_spec = strstr(resource, ":device_id=");
486dbfb411Snbeams   const int   deviceID    = (device_spec) ? atoi(device_spec + 11) : -1;
496dbfb411Snbeams 
506dbfb411Snbeams   int currentDeviceID;
516dbfb411Snbeams   magma_getdevice(&currentDeviceID);
526dbfb411Snbeams   if (deviceID >= 0 && currentDeviceID != deviceID) {
536dbfb411Snbeams     magma_setdevice(deviceID);
546dbfb411Snbeams     currentDeviceID = deviceID;
556dbfb411Snbeams   }
56e0582403Sabdelfattah83   // create a queue that uses the null stream
576dbfb411Snbeams   data->device = currentDeviceID;
58e5f091ebSnbeams #ifdef CEED_MAGMA_USE_HIP
59969f2b10Snbeams   magma_queue_create_from_hip(data->device, NULL, NULL, NULL, &(data->queue));
60969f2b10Snbeams #else
61e0582403Sabdelfattah83   magma_queue_create_from_cuda(data->device, NULL, NULL, NULL, &(data->queue));
62969f2b10Snbeams #endif
63e0582403Sabdelfattah83 
646dbfb411Snbeams   // Create reference CEED that implementation will be dispatched
656dbfb411Snbeams   //   through unless overridden
666dbfb411Snbeams   Ceed ceedref;
67e5f091ebSnbeams #ifdef CEED_MAGMA_USE_HIP
682b730f8bSJeremy L Thompson   CeedCallBackend(CeedInit("/gpu/hip/ref", &ceedref));
696dbfb411Snbeams #else
702b730f8bSJeremy L Thompson   CeedCallBackend(CeedInit("/gpu/cuda/ref", &ceedref));
716dbfb411Snbeams #endif
722b730f8bSJeremy L Thompson   CeedCallBackend(CeedSetDelegate(ceed, ceedref));
736dbfb411Snbeams 
742b730f8bSJeremy L Thompson   CeedCallBackend(CeedSetBackendFunction(ceed, "Ceed", ceed, "ElemRestrictionCreate", CeedElemRestrictionCreate_Magma));
752b730f8bSJeremy L Thompson   CeedCallBackend(CeedSetBackendFunction(ceed, "Ceed", ceed, "ElemRestrictionCreateBlocked", CeedElemRestrictionCreateBlocked_Magma));
762b730f8bSJeremy L Thompson   CeedCallBackend(CeedSetBackendFunction(ceed, "Ceed", ceed, "BasisCreateTensorH1", CeedBasisCreateTensorH1_Magma));
772b730f8bSJeremy L Thompson   CeedCallBackend(CeedSetBackendFunction(ceed, "Ceed", ceed, "BasisCreateH1", CeedBasisCreateH1_Magma));
782b730f8bSJeremy L Thompson   CeedCallBackend(CeedSetBackendFunction(ceed, "Ceed", ceed, "Destroy", CeedDestroy_Magma));
79e15f9bd0SJeremy L Thompson   return CEED_ERROR_SUCCESS;
8082b77998SStan Tomov }
8182b77998SStan Tomov 
821d013790SJed Brown CEED_INTERN int CeedRegister_Magma(void) {
83e5f091ebSnbeams #ifdef CEED_MAGMA_USE_HIP
841d013790SJed Brown   return CeedRegister("/gpu/hip/magma", CeedInit_Magma, 120);
85adb2481bSnbeams #else
861d013790SJed Brown   return CeedRegister("/gpu/cuda/magma", CeedInit_Magma, 120);
87adb2481bSnbeams #endif
8882b77998SStan Tomov }
89