Skip to content

Commit ebc204c

Browse files
authored
Merge pull request #740 from CEED/natalie/device-id
Update device ID selection for HIP/CUDA/MAGMA backends
2 parents b761d2c + 6dbfb41 commit ebc204c

16 files changed

+90
-66
lines changed

README.rst

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -265,6 +265,11 @@ Currently, each MAGMA library installation is only built for either CUDA or HIP.
265265
set of libCEED backends (``/gpu/cuda/magma/*`` or ``/gpu/hip/magma/*``) will automatically be built
266266
for the version of the MAGMA library found in ``MAGMA_DIR``.
267267

268+
Users can specify a device for all CUDA, HIP, and MAGMA backends through adding `:device_id=#`
269+
after the resource name. For example:
270+
271+
- `/gpu/cuda/gen:device_id=1`
272+
268273
The ``/*/occa`` backends rely upon the `OCCA <http://github.com/libocca/occa>`_ package to provide
269274
cross platform performance. To enable the OCCA backend, the environment variable ``OCCA_DIR`` must point
270275
to the top-level OCCA directory, with the OCCA library located in the ``${OCCA_DIR}/lib`` (By default,

backends/cuda-gen/ceed-cuda-gen.c

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -32,15 +32,15 @@ static int CeedInit_Cuda_gen(const char *resource, Ceed ceed) {
3232
"Cuda backend cannot use resource: %s", resource);
3333
// LCOV_EXCL_STOP
3434

35-
Ceed ceedshared;
36-
CeedInit("/gpu/cuda/shared", &ceedshared);
37-
ierr = CeedSetDelegate(ceed, ceedshared); CeedChkBackend(ierr);
38-
39-
Ceed_Cuda_gen *data;
35+
Ceed_Cuda *data;
4036
ierr = CeedCalloc(1, &data); CeedChkBackend(ierr);
4137
ierr = CeedSetData(ceed, data); CeedChkBackend(ierr);
4238
ierr = CeedCudaInit(ceed, resource, nrc); CeedChkBackend(ierr);
4339

40+
Ceed ceedshared;
41+
CeedInit("/gpu/cuda/shared", &ceedshared);
42+
ierr = CeedSetDelegate(ceed, ceedshared); CeedChkBackend(ierr);
43+
4444
const char fallbackresource[] = "/gpu/cuda/ref";
4545
ierr = CeedSetOperatorFallbackResource(ceed, fallbackresource);
4646
CeedChkBackend(ierr);

backends/cuda-gen/ceed-cuda-gen.h

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -44,10 +44,6 @@ typedef struct {
4444
void *d_c;
4545
} CeedQFunction_Cuda_gen;
4646

47-
typedef struct {
48-
Ceed_Cuda base;
49-
} Ceed_Cuda_gen;
50-
5147
CEED_INTERN int CeedQFunctionCreate_Cuda_gen(CeedQFunction qf);
5248

5349
CEED_INTERN int CeedOperatorCreate_Cuda_gen(CeedOperator op);

backends/cuda-shared/ceed-cuda-shared-basis.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -773,7 +773,7 @@ int CeedBasisApplyTensor_Cuda_shared(CeedBasis basis, const CeedInt nelem,
773773
int ierr;
774774
Ceed ceed;
775775
ierr = CeedBasisGetCeed(basis, &ceed); CeedChkBackend(ierr);
776-
Ceed_Cuda_shared *ceed_Cuda;
776+
Ceed_Cuda *ceed_Cuda;
777777
CeedGetData(ceed, &ceed_Cuda); CeedChkBackend(ierr);
778778
CeedBasis_Cuda_shared *data;
779779
CeedBasisGetData(basis, &data); CeedChkBackend(ierr);

backends/cuda-shared/ceed-cuda-shared.c

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616

1717
#include <ceed/ceed.h>
1818
#include <ceed/backend.h>
19-
#include <stdbool.h>
2019
#include <string.h>
2120
#include "ceed-cuda-shared.h"
2221
#include "../cuda/ceed-cuda.h"
@@ -34,15 +33,15 @@ static int CeedInit_Cuda_shared(const char *resource, Ceed ceed) {
3433
// LCOV_EXCL_STOP
3534
ierr = CeedSetDeterministic(ceed, true); CeedChk(ierr);
3635

37-
Ceed ceedref;
38-
CeedInit("/gpu/cuda/ref", &ceedref);
39-
ierr = CeedSetDelegate(ceed, ceedref); CeedChk(ierr);
40-
41-
Ceed_Cuda_shared *data;
36+
Ceed_Cuda *data;
4237
ierr = CeedCalloc(1, &data); CeedChk(ierr);
4338
ierr = CeedSetData(ceed, data); CeedChk(ierr);
4439
ierr = CeedCudaInit(ceed, resource, nrc); CeedChk(ierr);
4540

41+
Ceed ceedref;
42+
CeedInit("/gpu/cuda/ref", &ceedref);
43+
ierr = CeedSetDelegate(ceed, ceedref); CeedChk(ierr);
44+
4645
ierr = CeedSetBackendFunction(ceed, "Ceed", ceed, "BasisCreateTensorH1",
4746
CeedBasisCreateTensorH1_Cuda_shared);
4847
CeedChk(ierr);

backends/cuda-shared/ceed-cuda-shared.h

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -35,10 +35,6 @@ typedef struct {
3535
CeedScalar *c_G;
3636
} CeedBasis_Cuda_shared;
3737

38-
typedef struct {
39-
Ceed_Cuda base;
40-
} Ceed_Cuda_shared;
41-
4238
CEED_INTERN int CeedBasisCreateTensorH1_Cuda_shared(CeedInt dim, CeedInt P1d,
4339
CeedInt Q1d, const CeedScalar *interp1d, const CeedScalar *grad1d,
4440
const CeedScalar *qref1d, const CeedScalar *qweight1d, CeedBasis basis);

backends/cuda/ceed-cuda.c

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@
2121
#include <cuda_runtime.h>
2222
#include <nvrtc.h>
2323
#include <stdarg.h>
24-
#include <stdbool.h>
2524
#include <stdio.h>
2625
#include <stdlib.h>
2726
#include <string.h>
@@ -150,22 +149,22 @@ static int CeedGetPreferredMemType_Cuda(CeedMemType *type) {
150149
//------------------------------------------------------------------------------
151150
int CeedCudaInit(Ceed ceed, const char *resource, int nrc) {
152151
int ierr;
153-
const int rlen = strlen(resource);
154-
const bool slash = (rlen>nrc) ? (resource[nrc] == '/') : false;
155-
const int deviceID = (slash && rlen > nrc + 1) ? atoi(&resource[nrc + 1]) : -1;
152+
const char *device_spec = strstr(resource, ":device_id=");
153+
const int deviceID = (device_spec) ? atoi(device_spec+11) : -1;
156154

157155
int currentDeviceID;
158156
ierr = cudaGetDevice(&currentDeviceID); CeedChk_Cu(ceed,ierr);
159157
if (deviceID >= 0 && currentDeviceID != deviceID) {
160158
ierr = cudaSetDevice(deviceID); CeedChk_Cu(ceed,ierr);
159+
currentDeviceID = deviceID;
161160
}
162-
163161
struct cudaDeviceProp deviceProp;
164-
ierr = cudaGetDeviceProperties(&deviceProp, deviceID); CeedChk_Cu(ceed,ierr);
162+
ierr = cudaGetDeviceProperties(&deviceProp, currentDeviceID);
163+
CeedChk_Cu(ceed,ierr);
165164

166165
Ceed_Cuda *data;
167166
ierr = CeedGetData(ceed, &data); CeedChkBackend(ierr);
168-
data->deviceId = deviceID;
167+
data->deviceId = currentDeviceID;
169168
data->optblocksize = deviceProp.maxThreadsPerBlock;
170169
return CEED_ERROR_SUCCESS;
171170
}
@@ -210,6 +209,7 @@ static int CeedInit_Cuda(const char *resource, Ceed ceed) {
210209
return CeedError(ceed, CEED_ERROR_BACKEND,
211210
"Cuda backend cannot use resource: %s", resource);
212211
// LCOV_EXCL_STOP
212+
ierr = CeedSetDeterministic(ceed, true); CeedChk(ierr);
213213

214214
Ceed_Cuda *data;
215215
ierr = CeedCalloc(1, &data); CeedChkBackend(ierr);

backends/hip-gen/ceed-hip-gen.c

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -32,15 +32,15 @@ static int CeedInit_Hip_gen(const char *resource, Ceed ceed) {
3232
"Hip backend cannot use resource: %s", resource);
3333
// LCOV_EXCL_STOP
3434

35-
Ceed ceedshared;
36-
CeedInit("/gpu/hip/shared", &ceedshared);
37-
ierr = CeedSetDelegate(ceed, ceedshared); CeedChkBackend(ierr);
38-
39-
Ceed_Hip_gen *data;
35+
Ceed_Hip *data;
4036
ierr = CeedCalloc(1, &data); CeedChkBackend(ierr);
4137
ierr = CeedSetData(ceed, data); CeedChkBackend(ierr);
4238
ierr = CeedHipInit(ceed, resource, nrc); CeedChkBackend(ierr);
4339

40+
Ceed ceedshared;
41+
CeedInit("/gpu/hip/shared", &ceedshared);
42+
ierr = CeedSetDelegate(ceed, ceedshared); CeedChkBackend(ierr);
43+
4444
const char fallbackresource[] = "/gpu/hip/ref";
4545
ierr = CeedSetOperatorFallbackResource(ceed, fallbackresource);
4646
CeedChkBackend(ierr);

backends/hip-gen/ceed-hip-gen.h

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -44,10 +44,6 @@ typedef struct {
4444
void *d_c;
4545
} CeedQFunction_Hip_gen;
4646

47-
typedef struct {
48-
Ceed_Hip base;
49-
} Ceed_Hip_gen;
50-
5147
CEED_INTERN int CeedQFunctionCreate_Hip_gen(CeedQFunction qf);
5248

5349
CEED_INTERN int CeedOperatorCreate_Hip_gen(CeedOperator op);

backends/hip-shared/ceed-hip-shared-basis.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -859,7 +859,7 @@ int CeedBasisApplyTensor_Hip_shared(CeedBasis basis, const CeedInt nelem,
859859
int ierr;
860860
Ceed ceed;
861861
ierr = CeedBasisGetCeed(basis, &ceed); CeedChkBackend(ierr);
862-
Ceed_Hip_shared *ceed_Hip;
862+
Ceed_Hip *ceed_Hip;
863863
CeedGetData(ceed, &ceed_Hip); CeedChkBackend(ierr);
864864
CeedBasis_Hip_shared *data;
865865
CeedBasisGetData(basis, &data); CeedChkBackend(ierr);

0 commit comments

Comments
 (0)