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