xref: /libCEED/rust/libceed-sys/c-src/backends/magma/ceed-magma.c (revision e5f091eb2082fd2e5a436aed5b3c40dee25ac3c3)
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 
8ec3da8bcSJed Brown #include <ceed/ceed.h>
9ec3da8bcSJed Brown #include <ceed/backend.h>
103d576824SJeremy L Thompson #include <string.h>
116dbfb411Snbeams #include <stdlib.h>
1238612b08SStan Tomov #include "ceed-magma.h"
1352d6035fSJeremy L Thompson 
14e0582403Sabdelfattah83 static int CeedDestroy_Magma(Ceed ceed) {
15e0582403Sabdelfattah83   int ierr;
16e0582403Sabdelfattah83   Ceed_Magma *data;
17e15f9bd0SJeremy L Thompson   ierr = CeedGetData(ceed, &data); CeedChkBackend(ierr);
18e0582403Sabdelfattah83   magma_queue_destroy( data->queue );
19e15f9bd0SJeremy L Thompson   ierr = CeedFree(&data); CeedChkBackend(ierr);
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
266dbfb411Snbeams   if (strncmp(resource, "/gpu/cuda/magma", nrc)
276dbfb411Snbeams       && strncmp(resource, "/gpu/hip/magma", nrc))
287f5b9731SStan Tomov     // LCOV_EXCL_START
29e15f9bd0SJeremy L Thompson     return CeedError(ceed, CEED_ERROR_BACKEND,
30e15f9bd0SJeremy L Thompson                      "Magma backend cannot use resource: %s", resource);
317f5b9731SStan Tomov   // LCOV_EXCL_STOP
327f5b9731SStan Tomov 
331dc2661bSVeselin Dobrev   ierr = magma_init();
347f5b9731SStan Tomov   if (ierr)
357f5b9731SStan Tomov     // LCOV_EXCL_START
36e15f9bd0SJeremy L Thompson     return CeedError(ceed, CEED_ERROR_BACKEND, "error in magma_init(): %d\n", ierr);
377f5b9731SStan Tomov   // LCOV_EXCL_STOP
3893fbe329SStan Tomov 
39e0582403Sabdelfattah83   Ceed_Magma *data;
40e15f9bd0SJeremy L Thompson   ierr = CeedCalloc(sizeof(Ceed_Magma), &data); CeedChkBackend(ierr);
41e15f9bd0SJeremy L Thompson   ierr = CeedSetData(ceed, data); CeedChkBackend(ierr);
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;
58*e5f091ebSnbeams   #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;
67*e5f091ebSnbeams   #ifdef CEED_MAGMA_USE_HIP
686dbfb411Snbeams   CeedInit("/gpu/hip/ref", &ceedref);
696dbfb411Snbeams   #else
706dbfb411Snbeams   CeedInit("/gpu/cuda/ref", &ceedref);
716dbfb411Snbeams   #endif
726dbfb411Snbeams   ierr = CeedSetDelegate(ceed, ceedref); CeedChkBackend(ierr);
736dbfb411Snbeams 
74868539c2SNatalie Beams   ierr = CeedSetBackendFunction(ceed, "Ceed", ceed, "ElemRestrictionCreate",
75e15f9bd0SJeremy L Thompson                                 CeedElemRestrictionCreate_Magma); CeedChkBackend(ierr);
76868539c2SNatalie Beams   ierr = CeedSetBackendFunction(ceed, "Ceed", ceed,
77868539c2SNatalie Beams                                 "ElemRestrictionCreateBlocked",
78e15f9bd0SJeremy L Thompson                                 CeedElemRestrictionCreateBlocked_Magma); CeedChkBackend(ierr);
797f5b9731SStan Tomov   ierr = CeedSetBackendFunction(ceed, "Ceed", ceed, "BasisCreateTensorH1",
80e15f9bd0SJeremy L Thompson                                 CeedBasisCreateTensorH1_Magma); CeedChkBackend(ierr);
817f5b9731SStan Tomov   ierr = CeedSetBackendFunction(ceed, "Ceed", ceed, "BasisCreateH1",
82e15f9bd0SJeremy L Thompson                                 CeedBasisCreateH1_Magma); CeedChkBackend(ierr);
83e0582403Sabdelfattah83   ierr = CeedSetBackendFunction(ceed, "Ceed", ceed, "Destroy",
84e15f9bd0SJeremy L Thompson                                 CeedDestroy_Magma); CeedChkBackend(ierr);
85e15f9bd0SJeremy L Thompson   return CEED_ERROR_SUCCESS;
8682b77998SStan Tomov }
8782b77998SStan Tomov 
881d013790SJed Brown CEED_INTERN int CeedRegister_Magma(void) {
89*e5f091ebSnbeams   #ifdef CEED_MAGMA_USE_HIP
901d013790SJed Brown   return CeedRegister("/gpu/hip/magma", CeedInit_Magma, 120);
91adb2481bSnbeams   #else
921d013790SJed Brown   return CeedRegister("/gpu/cuda/magma", CeedInit_Magma, 120);
93adb2481bSnbeams   #endif
9482b77998SStan Tomov }
95