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. 3cb23e90cSJeremy L Thompson // 43d8e8822SJeremy L Thompson // SPDX-License-Identifier: BSD-2-Clause 5cb23e90cSJeremy L Thompson // 63d8e8822SJeremy L Thompson // This file is part of CEED: http://github.com/ceed 7cb23e90cSJeremy L Thompson 8*49aac155SJeremy L Thompson #include <ceed.h> 9ec3da8bcSJed Brown #include <ceed/backend.h> 106dbfb411Snbeams #include <stdlib.h> 112b730f8bSJeremy L Thompson #include <string.h> 122b730f8bSJeremy L Thompson 13cb23e90cSJeremy L Thompson #include "ceed-magma.h" 14cb23e90cSJeremy L Thompson 151d013790SJed Brown CEED_INTERN int CeedInit_Magma_Det(const char *resource, Ceed ceed) { 166dbfb411Snbeams const int nrc = 18; // number of characters in resource 172b730f8bSJeremy L Thompson if (strncmp(resource, "/gpu/cuda/magma/det", nrc) && strncmp(resource, "/gpu/hip/magma/det", nrc)) { 18cb23e90cSJeremy L Thompson // LCOV_EXCL_START 192b730f8bSJeremy L Thompson return CeedError(ceed, CEED_ERROR_BACKEND, "Magma backend cannot use resource: %s", resource); 20cb23e90cSJeremy L Thompson // LCOV_EXCL_STOP 212b730f8bSJeremy L Thompson } 222b730f8bSJeremy L Thompson CeedCallBackend(CeedSetDeterministic(ceed, true)); 23cb23e90cSJeremy L Thompson 246dbfb411Snbeams Ceed_Magma *data; 252b730f8bSJeremy L Thompson CeedCallBackend(CeedCalloc(sizeof(Ceed_Magma), &data)); 262b730f8bSJeremy L Thompson CeedCallBackend(CeedSetData(ceed, data)); 276dbfb411Snbeams 286dbfb411Snbeams // get/set device ID 296dbfb411Snbeams const char *device_spec = strstr(resource, ":device_id="); 306dbfb411Snbeams const int deviceID = (device_spec) ? atoi(device_spec + 11) : -1; 316dbfb411Snbeams 326dbfb411Snbeams int currentDeviceID; 336dbfb411Snbeams magma_getdevice(¤tDeviceID); 346dbfb411Snbeams if (deviceID >= 0 && currentDeviceID != deviceID) { 356dbfb411Snbeams magma_setdevice(deviceID); 366dbfb411Snbeams currentDeviceID = deviceID; 376dbfb411Snbeams } 386dbfb411Snbeams // create a queue that uses the null stream 396dbfb411Snbeams data->device = currentDeviceID; 406dbfb411Snbeams 41cb23e90cSJeremy L Thompson // Create reference CEED that implementation will be dispatched 42cb23e90cSJeremy L Thompson // through unless overridden 43cb23e90cSJeremy L Thompson Ceed ceedref; 44e5f091ebSnbeams #ifdef CEED_MAGMA_USE_HIP 452b730f8bSJeremy L Thompson CeedCallBackend(CeedInit("/gpu/hip/magma", &ceedref)); 46adb2481bSnbeams #else 472b730f8bSJeremy L Thompson CeedCallBackend(CeedInit("/gpu/cuda/magma", &ceedref)); 48adb2481bSnbeams #endif 492b730f8bSJeremy L Thompson CeedCallBackend(CeedSetDelegate(ceed, ceedref)); 50cb23e90cSJeremy L Thompson 51cb23e90cSJeremy L Thompson // Create reference CEED for restriction 52cb23e90cSJeremy L Thompson Ceed restrictionceedref; 53e5f091ebSnbeams #ifdef CEED_MAGMA_USE_HIP 54a31f51a5Snbeams CeedInit("/gpu/hip/ref", &restrictionceedref); 55a31f51a5Snbeams #else 56461525f5SNatalie Beams CeedInit("/gpu/cuda/ref", &restrictionceedref); 57a31f51a5Snbeams #endif 582b730f8bSJeremy L Thompson CeedCallBackend(CeedSetObjectDelegate(ceed, restrictionceedref, "ElemRestriction")); 59cb23e90cSJeremy L Thompson 60e15f9bd0SJeremy L Thompson return CEED_ERROR_SUCCESS; 61cb23e90cSJeremy L Thompson } 62cb23e90cSJeremy L Thompson 631d013790SJed Brown CEED_INTERN int CeedRegister_Magma_Det(void) { 64e5f091ebSnbeams #ifdef CEED_MAGMA_USE_HIP 651d013790SJed Brown return CeedRegister("/gpu/hip/magma/det", CeedInit_Magma_Det, 125); 66adb2481bSnbeams #else 671d013790SJed Brown return CeedRegister("/gpu/cuda/magma/det", CeedInit_Magma_Det, 125); 68adb2481bSnbeams #endif 69cb23e90cSJeremy L Thompson } 70