xref: /petsc/src/sys/objects/device/util/devicereg.c (revision 0e6b6b5985dd9b1172860d21fb88bd3966bf7c54)
1*0e6b6b59SJacob Faibussowitsch #include <petsc/private/deviceimpl.h> /*I <petscdevice.h> I*/
2*0e6b6b59SJacob Faibussowitsch 
3*0e6b6b59SJacob Faibussowitsch PetscLogEvent CUBLAS_HANDLE_CREATE;
4*0e6b6b59SJacob Faibussowitsch PetscLogEvent CUSOLVER_HANDLE_CREATE;
5*0e6b6b59SJacob Faibussowitsch PetscLogEvent HIPSOLVER_HANDLE_CREATE;
6*0e6b6b59SJacob Faibussowitsch PetscLogEvent HIPBLAS_HANDLE_CREATE;
7*0e6b6b59SJacob Faibussowitsch 
8*0e6b6b59SJacob Faibussowitsch PetscLogEvent DCONTEXT_Create;
9*0e6b6b59SJacob Faibussowitsch PetscLogEvent DCONTEXT_Destroy;
10*0e6b6b59SJacob Faibussowitsch PetscLogEvent DCONTEXT_ChangeStream;
11*0e6b6b59SJacob Faibussowitsch PetscLogEvent DCONTEXT_SetDevice;
12*0e6b6b59SJacob Faibussowitsch PetscLogEvent DCONTEXT_SetUp;
13*0e6b6b59SJacob Faibussowitsch PetscLogEvent DCONTEXT_Duplicate;
14*0e6b6b59SJacob Faibussowitsch PetscLogEvent DCONTEXT_QueryIdle;
15*0e6b6b59SJacob Faibussowitsch PetscLogEvent DCONTEXT_WaitForCtx;
16*0e6b6b59SJacob Faibussowitsch PetscLogEvent DCONTEXT_Fork;
17*0e6b6b59SJacob Faibussowitsch PetscLogEvent DCONTEXT_Join;
18*0e6b6b59SJacob Faibussowitsch PetscLogEvent DCONTEXT_Sync;
19*0e6b6b59SJacob Faibussowitsch PetscLogEvent DCONTEXT_Mark;
20*0e6b6b59SJacob Faibussowitsch 
21*0e6b6b59SJacob Faibussowitsch // DO NOT MOVE THESE (literally, they must be exactly here)!
22*0e6b6b59SJacob Faibussowitsch //
23*0e6b6b59SJacob Faibussowitsch // pgcc has a _very_ strange bug, where if both of these are defined at the top of this file,
24*0e6b6b59SJacob Faibussowitsch // then building src/sys/objects/device/test/ex2.c results in "undefined reference to
25*0e6b6b59SJacob Faibussowitsch // PETSC_DEVICE_CONTEXT_CLASSID". If you initialize PETSC_DEVICE_CONTEXT_CLASSID it goes
26*0e6b6b59SJacob Faibussowitsch // away. If you move the definition down, it goes away.
27*0e6b6b59SJacob Faibussowitsch PetscClassId PETSC_DEVICE_CLASSID;
28*0e6b6b59SJacob Faibussowitsch PetscClassId PETSC_DEVICE_CONTEXT_CLASSID;
29*0e6b6b59SJacob Faibussowitsch 
30*0e6b6b59SJacob Faibussowitsch // clang-format off
31*0e6b6b59SJacob Faibussowitsch const char *const PetscStreamTypes[] = {
32*0e6b6b59SJacob Faibussowitsch   "global_blocking",
33*0e6b6b59SJacob Faibussowitsch   "default_blocking",
34*0e6b6b59SJacob Faibussowitsch   "global_nonblocking",
35*0e6b6b59SJacob Faibussowitsch   "max",
36*0e6b6b59SJacob Faibussowitsch   "PetscStreamType",
37*0e6b6b59SJacob Faibussowitsch   "PETSC_STREAM_",
38*0e6b6b59SJacob Faibussowitsch   PETSC_NULLPTR
39*0e6b6b59SJacob Faibussowitsch };
40*0e6b6b59SJacob Faibussowitsch 
41*0e6b6b59SJacob Faibussowitsch const char *const PetscDeviceContextJoinModes[] = {
42*0e6b6b59SJacob Faibussowitsch   "destroy",
43*0e6b6b59SJacob Faibussowitsch   "sync",
44*0e6b6b59SJacob Faibussowitsch   "no_sync",
45*0e6b6b59SJacob Faibussowitsch   "PetscDeviceContextJoinMode",
46*0e6b6b59SJacob Faibussowitsch   "PETSC_DEVICE_CONTEXT_JOIN_",
47*0e6b6b59SJacob Faibussowitsch   PETSC_NULLPTR
48*0e6b6b59SJacob Faibussowitsch };
49*0e6b6b59SJacob Faibussowitsch 
50*0e6b6b59SJacob Faibussowitsch const char *const PetscDeviceTypes[] = {
51*0e6b6b59SJacob Faibussowitsch   "host",
52*0e6b6b59SJacob Faibussowitsch   "cuda",
53*0e6b6b59SJacob Faibussowitsch   "hip",
54*0e6b6b59SJacob Faibussowitsch   "sycl",
55*0e6b6b59SJacob Faibussowitsch   "max",
56*0e6b6b59SJacob Faibussowitsch   "PetscDeviceType",
57*0e6b6b59SJacob Faibussowitsch   "PETSC_DEVICE_",
58*0e6b6b59SJacob Faibussowitsch   PETSC_NULLPTR
59*0e6b6b59SJacob Faibussowitsch };
60*0e6b6b59SJacob Faibussowitsch 
61*0e6b6b59SJacob Faibussowitsch const char *const PetscDeviceInitTypes[] = {
62*0e6b6b59SJacob Faibussowitsch   "none",
63*0e6b6b59SJacob Faibussowitsch   "lazy",
64*0e6b6b59SJacob Faibussowitsch   "eager",
65*0e6b6b59SJacob Faibussowitsch   "PetscDeviceInitType",
66*0e6b6b59SJacob Faibussowitsch   "PETSC_DEVICE_INIT_",
67*0e6b6b59SJacob Faibussowitsch   PETSC_NULLPTR
68*0e6b6b59SJacob Faibussowitsch };
69*0e6b6b59SJacob Faibussowitsch 
70*0e6b6b59SJacob Faibussowitsch #ifdef __cplusplus
71*0e6b6b59SJacob Faibussowitsch #include <petsc/private/cpp/type_traits.hpp>
72*0e6b6b59SJacob Faibussowitsch 
73*0e6b6b59SJacob Faibussowitsch static_assert(Petsc::util::integral_value(PETSC_DEVICE_INIT_NONE) == 0, "");
74*0e6b6b59SJacob Faibussowitsch static_assert(Petsc::util::integral_value(PETSC_DEVICE_INIT_LAZY) == 1, "");
75*0e6b6b59SJacob Faibussowitsch static_assert(Petsc::util::integral_value(PETSC_DEVICE_INIT_EAGER) == 2, "");
76*0e6b6b59SJacob Faibussowitsch 
77*0e6b6b59SJacob Faibussowitsch static_assert(
78*0e6b6b59SJacob Faibussowitsch   PETSC_STATIC_ARRAY_LENGTH(PetscDeviceInitTypes) == 6,
79*0e6b6b59SJacob Faibussowitsch   "Must change CUPMDevice<T>::initialize number of enum values in -device_enable_cupm to match!"
80*0e6b6b59SJacob Faibussowitsch );
81*0e6b6b59SJacob Faibussowitsch #endif
82*0e6b6b59SJacob Faibussowitsch 
83*0e6b6b59SJacob Faibussowitsch const char *const PetscDeviceAttributes[] = {
84*0e6b6b59SJacob Faibussowitsch   "shared_mem_per_block",
85*0e6b6b59SJacob Faibussowitsch   "max",
86*0e6b6b59SJacob Faibussowitsch   "PetscDeviceAttribute",
87*0e6b6b59SJacob Faibussowitsch   "PETSC_DEVICE_ATTR_",
88*0e6b6b59SJacob Faibussowitsch   PETSC_NULLPTR
89*0e6b6b59SJacob Faibussowitsch };
90*0e6b6b59SJacob Faibussowitsch // clang-format on
91*0e6b6b59SJacob Faibussowitsch 
92*0e6b6b59SJacob Faibussowitsch static PetscBool registered = PETSC_FALSE;
93*0e6b6b59SJacob Faibussowitsch 
94*0e6b6b59SJacob Faibussowitsch static PetscErrorCode PetscDeviceRegisterEvent_Private(const char name[], PetscClassId id, PetscLogEvent *event) {
95*0e6b6b59SJacob Faibussowitsch   PetscFunctionBegin;
96*0e6b6b59SJacob Faibussowitsch   PetscCall(PetscLogEventRegister(name, id, event));
97*0e6b6b59SJacob Faibussowitsch   PetscCall(PetscLogEventSetCollective(*event, PETSC_FALSE));
98*0e6b6b59SJacob Faibussowitsch   PetscFunctionReturn(0);
99*0e6b6b59SJacob Faibussowitsch }
100*0e6b6b59SJacob Faibussowitsch 
101*0e6b6b59SJacob Faibussowitsch /*@C
102*0e6b6b59SJacob Faibussowitsch   PetscDeviceFinalizePackage - This function cleans up all components of the `PetscDevice`
103*0e6b6b59SJacob Faibussowitsch   package. It is called from `PetscFinalize()`.
104*0e6b6b59SJacob Faibussowitsch 
105*0e6b6b59SJacob Faibussowitsch   Developer Note:
106*0e6b6b59SJacob Faibussowitsch   This function is automatically registered to be called during `PetscFinalize()` by
107*0e6b6b59SJacob Faibussowitsch   `PetscDeviceInitializePackage()` so there should be no need to call it yourself.
108*0e6b6b59SJacob Faibussowitsch 
109*0e6b6b59SJacob Faibussowitsch   Level: developer
110*0e6b6b59SJacob Faibussowitsch 
111*0e6b6b59SJacob Faibussowitsch .seealso: `PetscFinalize()`, `PetscDeviceInitializePackage()`
112*0e6b6b59SJacob Faibussowitsch @*/
113*0e6b6b59SJacob Faibussowitsch PetscErrorCode PetscDeviceFinalizePackage(void) {
114*0e6b6b59SJacob Faibussowitsch   PetscFunctionBegin;
115*0e6b6b59SJacob Faibussowitsch   registered = PETSC_FALSE;
116*0e6b6b59SJacob Faibussowitsch   PetscFunctionReturn(0);
117*0e6b6b59SJacob Faibussowitsch }
118*0e6b6b59SJacob Faibussowitsch 
119*0e6b6b59SJacob Faibussowitsch /*@C
120*0e6b6b59SJacob Faibussowitsch   PetscDeviceInitializePackage - This function initializes everything in the `PetscDevice`
121*0e6b6b59SJacob Faibussowitsch   package. It is called on the first call to `PetscDeviceContextCreate()` or
122*0e6b6b59SJacob Faibussowitsch   `PetscDeviceCreate()` when using shared or static libraries.
123*0e6b6b59SJacob Faibussowitsch 
124*0e6b6b59SJacob Faibussowitsch   Level: developer
125*0e6b6b59SJacob Faibussowitsch 
126*0e6b6b59SJacob Faibussowitsch .seealso: `PetscInitialize()`, `PetscDeviceFinalizePackage()`, `PetscDeviceContextCreate()`,
127*0e6b6b59SJacob Faibussowitsch `PetscDeviceCreate()`
128*0e6b6b59SJacob Faibussowitsch @*/
129*0e6b6b59SJacob Faibussowitsch PetscErrorCode PetscDeviceInitializePackage(void) {
130*0e6b6b59SJacob Faibussowitsch   PetscFunctionBegin;
131*0e6b6b59SJacob Faibussowitsch   PetscCheck(PetscDeviceConfiguredFor_Internal(PETSC_DEVICE_DEFAULT()), PETSC_COMM_SELF, PETSC_ERR_SUP, "PETSc is not configured with device support (PETSC_DEVICE_DEFAULT = '%s')", PetscDeviceTypes[PETSC_DEVICE_DEFAULT()]);
132*0e6b6b59SJacob Faibussowitsch   if (PetscLikely(registered)) PetscFunctionReturn(0);
133*0e6b6b59SJacob Faibussowitsch   registered = PETSC_TRUE;
134*0e6b6b59SJacob Faibussowitsch   PetscCall(PetscRegisterFinalize(PetscDeviceFinalizePackage));
135*0e6b6b59SJacob Faibussowitsch   // class registration
136*0e6b6b59SJacob Faibussowitsch   PetscCall(PetscClassIdRegister("PetscDevice", &PETSC_DEVICE_CLASSID));
137*0e6b6b59SJacob Faibussowitsch   PetscCall(PetscClassIdRegister("PetscDeviceContext", &PETSC_DEVICE_CONTEXT_CLASSID));
138*0e6b6b59SJacob Faibussowitsch   // events
139*0e6b6b59SJacob Faibussowitsch   if (PetscDefined(HAVE_CUDA)) {
140*0e6b6b59SJacob Faibussowitsch     PetscCall(PetscDeviceRegisterEvent_Private("cuBLAS Init", PETSC_DEVICE_CONTEXT_CLASSID, &CUBLAS_HANDLE_CREATE));
141*0e6b6b59SJacob Faibussowitsch     PetscCall(PetscDeviceRegisterEvent_Private("cuSolver Init", PETSC_DEVICE_CONTEXT_CLASSID, &CUSOLVER_HANDLE_CREATE));
142*0e6b6b59SJacob Faibussowitsch   }
143*0e6b6b59SJacob Faibussowitsch   if (PetscDefined(HAVE_HIP)) {
144*0e6b6b59SJacob Faibussowitsch     PetscCall(PetscDeviceRegisterEvent_Private("hipBLAS Init", PETSC_DEVICE_CONTEXT_CLASSID, &HIPBLAS_HANDLE_CREATE));
145*0e6b6b59SJacob Faibussowitsch     PetscCall(PetscDeviceRegisterEvent_Private("hipSolver Init", PETSC_DEVICE_CONTEXT_CLASSID, &HIPSOLVER_HANDLE_CREATE));
146*0e6b6b59SJacob Faibussowitsch   }
147*0e6b6b59SJacob Faibussowitsch   PetscCall(PetscDeviceRegisterEvent_Private("DCtxCreate", PETSC_DEVICE_CONTEXT_CLASSID, &DCONTEXT_Create));
148*0e6b6b59SJacob Faibussowitsch   PetscCall(PetscDeviceRegisterEvent_Private("DCtxDestroy", PETSC_DEVICE_CONTEXT_CLASSID, &DCONTEXT_Destroy));
149*0e6b6b59SJacob Faibussowitsch   PetscCall(PetscDeviceRegisterEvent_Private("DCtxChangeStream", PETSC_DEVICE_CONTEXT_CLASSID, &DCONTEXT_ChangeStream));
150*0e6b6b59SJacob Faibussowitsch   PetscCall(PetscDeviceRegisterEvent_Private("DCtxSetUp", PETSC_DEVICE_CONTEXT_CLASSID, &DCONTEXT_SetUp));
151*0e6b6b59SJacob Faibussowitsch   PetscCall(PetscDeviceRegisterEvent_Private("DCtxSetDevice", PETSC_DEVICE_CONTEXT_CLASSID, &DCONTEXT_SetDevice));
152*0e6b6b59SJacob Faibussowitsch   PetscCall(PetscDeviceRegisterEvent_Private("DCtxDuplicate", PETSC_DEVICE_CONTEXT_CLASSID, &DCONTEXT_Duplicate));
153*0e6b6b59SJacob Faibussowitsch   PetscCall(PetscDeviceRegisterEvent_Private("DCtxQueryIdle", PETSC_DEVICE_CONTEXT_CLASSID, &DCONTEXT_QueryIdle));
154*0e6b6b59SJacob Faibussowitsch   PetscCall(PetscDeviceRegisterEvent_Private("DCtxWaitForCtx", PETSC_DEVICE_CONTEXT_CLASSID, &DCONTEXT_WaitForCtx));
155*0e6b6b59SJacob Faibussowitsch   PetscCall(PetscDeviceRegisterEvent_Private("DCtxFork", PETSC_DEVICE_CONTEXT_CLASSID, &DCONTEXT_Fork));
156*0e6b6b59SJacob Faibussowitsch   PetscCall(PetscDeviceRegisterEvent_Private("DCtxJoin", PETSC_DEVICE_CONTEXT_CLASSID, &DCONTEXT_Join));
157*0e6b6b59SJacob Faibussowitsch   PetscCall(PetscDeviceRegisterEvent_Private("DCtxSync", PETSC_DEVICE_CONTEXT_CLASSID, &DCONTEXT_Sync));
158*0e6b6b59SJacob Faibussowitsch   PetscCall(PetscDeviceRegisterEvent_Private("DCtxMark", PETSC_DEVICE_CONTEXT_CLASSID, &DCONTEXT_Mark));
159*0e6b6b59SJacob Faibussowitsch   {
160*0e6b6b59SJacob Faibussowitsch     const PetscClassId classids[] = {PETSC_DEVICE_CONTEXT_CLASSID, PETSC_DEVICE_CLASSID};
161*0e6b6b59SJacob Faibussowitsch 
162*0e6b6b59SJacob Faibussowitsch     PetscCall(PetscInfoProcessClass("device", PETSC_STATIC_ARRAY_LENGTH(classids), classids));
163*0e6b6b59SJacob Faibussowitsch   }
164*0e6b6b59SJacob Faibussowitsch   PetscFunctionReturn(0);
165*0e6b6b59SJacob Faibussowitsch }
166