107e4ef11SJacob Faibussowitsch #ifndef PETSCDEVICETYPES_H 2030f984aSJacob Faibussowitsch #define PETSCDEVICETYPES_H 3030f984aSJacob Faibussowitsch 40e6b6b59SJacob Faibussowitsch #include <petscsys.h> /*I <petscdevicetypes.h> I*/ 50e6b6b59SJacob Faibussowitsch 60e6b6b59SJacob Faibussowitsch // Some overzealous older gcc versions warn that the comparisons below are always true. Neat 70e6b6b59SJacob Faibussowitsch // that it can detect this, but the tautology *is* the point of the static_assert()! 80e6b6b59SJacob Faibussowitsch #if defined(__GNUC__) && __GNUC__ >= 6 && !PetscDefined(HAVE_WINDOWS_COMPILERS) 90e6b6b59SJacob Faibussowitsch #define PETSC_SHOULD_SILENCE_GCC_TAUTOLOGICAL_COMPARE_WARNING 1 100e6b6b59SJacob Faibussowitsch #else 110e6b6b59SJacob Faibussowitsch #define PETSC_SHOULD_SILENCE_GCC_TAUTOLOGICAL_COMPARE_WARNING 0 120e6b6b59SJacob Faibussowitsch #endif 13030f984aSJacob Faibussowitsch 14ac09b921SBarry Smith /* SUBMANSEC = Sys */ 15ac09b921SBarry Smith 16030f984aSJacob Faibussowitsch /*E 17030f984aSJacob Faibussowitsch PetscMemType - Memory type of a pointer 18030f984aSJacob Faibussowitsch 19030f984aSJacob Faibussowitsch Developer Note: 20030f984aSJacob Faibussowitsch Encoding of the bitmask in binary: xxxxyyyz 21fe0d65a2SJacob Faibussowitsch 22fe0d65a2SJacob Faibussowitsch $ z = 0 - Host memory 23fe0d65a2SJacob Faibussowitsch $ z = 1 - Device memory 24fe0d65a2SJacob Faibussowitsch $ yyy = 000 - CUDA-related memory 25fe0d65a2SJacob Faibussowitsch $ yyy = 001 - HIP-related memory 26a2158755SJunchao Zhang $ yyy = 010 - SYCL-related memory 27fe0d65a2SJacob Faibussowitsch $ xxxxyyy1 = 0000,0001 - CUDA memory 28fe0d65a2SJacob Faibussowitsch $ xxxxyyy1 = 0001,0001 - CUDA NVSHMEM memory 29fe0d65a2SJacob Faibussowitsch $ xxxxyyy1 = 0000,0011 - HIP memory 30a2158755SJunchao Zhang $ xxxxyyy1 = 0000,0101 - SYCL memory 31030f984aSJacob Faibussowitsch 32030f984aSJacob Faibussowitsch Other types of memory, e.g., CUDA managed memory, can be added when needed. 33030f984aSJacob Faibussowitsch 34fe0d65a2SJacob Faibussowitsch Level: beginner 35fe0d65a2SJacob Faibussowitsch 363214990dSStefano Zampini Notes: 3787497f52SBarry Smith `PETSC_MEMTYPE_KOKKOS` depends on the Kokkos backend configuration 383214990dSStefano Zampini 390e6b6b59SJacob Faibussowitsch Developer Notes: 400e6b6b59SJacob Faibussowitsch This enum uses a function (`PetscMemTypeToString()`) to convert to string representation so 410e6b6b59SJacob Faibussowitsch cannot be used in `PetscOptionsEnum()`. 420e6b6b59SJacob Faibussowitsch 430e6b6b59SJacob Faibussowitsch .seealso: `PetscMemTypeToString()`, `VecGetArrayAndMemType()`, 440e6b6b59SJacob Faibussowitsch `PetscSFBcastWithMemTypeBegin()`, `PetscSFReduceWithMemTypeBegin()` 45030f984aSJacob Faibussowitsch E*/ 46fe0d65a2SJacob Faibussowitsch typedef enum { 47fe0d65a2SJacob Faibussowitsch PETSC_MEMTYPE_HOST = 0, 48fe0d65a2SJacob Faibussowitsch PETSC_MEMTYPE_DEVICE = 0x01, 49fe0d65a2SJacob Faibussowitsch PETSC_MEMTYPE_CUDA = 0x01, 50fe0d65a2SJacob Faibussowitsch PETSC_MEMTYPE_NVSHMEM = 0x11, 51a2158755SJunchao Zhang PETSC_MEMTYPE_HIP = 0x03, 523214990dSStefano Zampini PETSC_MEMTYPE_SYCL = 0x05, 53fe0d65a2SJacob Faibussowitsch } PetscMemType; 54c0288c05SSatish Balay #if PetscDefined(HAVE_CUDA) 55c0288c05SSatish Balay #define PETSC_MEMTYPE_KOKKOS PETSC_MEMTYPE_CUDA 56c0288c05SSatish Balay #elif PetscDefined(HAVE_HIP) 57c0288c05SSatish Balay #define PETSC_MEMTYPE_KOKKOS PETSC_MEMTYPE_HIP 58c0288c05SSatish Balay #elif PetscDefined(HAVE_SYCL) 59c0288c05SSatish Balay #define PETSC_MEMTYPE_KOKKOS PETSC_MEMTYPE_SYCL 60c0288c05SSatish Balay #else 61c0288c05SSatish Balay #define PETSC_MEMTYPE_KOKKOS PETSC_MEMTYPE_HOST 62c0288c05SSatish Balay #endif 63030f984aSJacob Faibussowitsch 64030f984aSJacob Faibussowitsch #define PetscMemTypeHost(m) (((m)&0x1) == PETSC_MEMTYPE_HOST) 65030f984aSJacob Faibussowitsch #define PetscMemTypeDevice(m) (((m)&0x1) == PETSC_MEMTYPE_DEVICE) 66030f984aSJacob Faibussowitsch #define PetscMemTypeCUDA(m) (((m)&0xF) == PETSC_MEMTYPE_CUDA) 67030f984aSJacob Faibussowitsch #define PetscMemTypeHIP(m) (((m)&0xF) == PETSC_MEMTYPE_HIP) 68a2158755SJunchao Zhang #define PetscMemTypeSYCL(m) (((m)&0xF) == PETSC_MEMTYPE_SYCL) 69030f984aSJacob Faibussowitsch #define PetscMemTypeNVSHMEM(m) ((m) == PETSC_MEMTYPE_NVSHMEM) 70030f984aSJacob Faibussowitsch 710e6b6b59SJacob Faibussowitsch #if defined(__cplusplus) 720e6b6b59SJacob Faibussowitsch #if PETSC_SHOULD_SILENCE_GCC_TAUTOLOGICAL_COMPARE_WARNING 730e6b6b59SJacob Faibussowitsch #pragma GCC diagnostic push 740e6b6b59SJacob Faibussowitsch #pragma GCC diagnostic ignored "-Wtautological-compare" 750e6b6b59SJacob Faibussowitsch #endif 760e6b6b59SJacob Faibussowitsch static_assert(PetscMemTypeHost(PETSC_MEMTYPE_HOST), ""); 770e6b6b59SJacob Faibussowitsch static_assert(!PetscMemTypeHost(PETSC_MEMTYPE_DEVICE), ""); 780e6b6b59SJacob Faibussowitsch static_assert(!PetscMemTypeHost(PETSC_MEMTYPE_CUDA), ""); 790e6b6b59SJacob Faibussowitsch static_assert(!PetscMemTypeHost(PETSC_MEMTYPE_HIP), ""); 800e6b6b59SJacob Faibussowitsch static_assert(!PetscMemTypeHost(PETSC_MEMTYPE_SYCL), ""); 810e6b6b59SJacob Faibussowitsch static_assert(!PetscMemTypeHost(PETSC_MEMTYPE_NVSHMEM), ""); 820e6b6b59SJacob Faibussowitsch 830e6b6b59SJacob Faibussowitsch static_assert(!PetscMemTypeDevice(PETSC_MEMTYPE_HOST), ""); 840e6b6b59SJacob Faibussowitsch static_assert(PetscMemTypeDevice(PETSC_MEMTYPE_DEVICE), ""); 850e6b6b59SJacob Faibussowitsch static_assert(PetscMemTypeDevice(PETSC_MEMTYPE_CUDA), ""); 860e6b6b59SJacob Faibussowitsch static_assert(PetscMemTypeDevice(PETSC_MEMTYPE_HIP), ""); 870e6b6b59SJacob Faibussowitsch static_assert(PetscMemTypeDevice(PETSC_MEMTYPE_SYCL), ""); 880e6b6b59SJacob Faibussowitsch static_assert(PetscMemTypeDevice(PETSC_MEMTYPE_NVSHMEM), ""); 890e6b6b59SJacob Faibussowitsch 900e6b6b59SJacob Faibussowitsch static_assert(PetscMemTypeCUDA(PETSC_MEMTYPE_CUDA), ""); 910e6b6b59SJacob Faibussowitsch static_assert(PetscMemTypeCUDA(PETSC_MEMTYPE_NVSHMEM), ""); 920e6b6b59SJacob Faibussowitsch #if PETSC_SHOULD_SILENCE_GCC_TAUTOLOGICAL_COMPARE_WARNING 930e6b6b59SJacob Faibussowitsch #pragma GCC diagnostic pop 940e6b6b59SJacob Faibussowitsch #endif 950e6b6b59SJacob Faibussowitsch #endif // __cplusplus 960e6b6b59SJacob Faibussowitsch 970e6b6b59SJacob Faibussowitsch PETSC_NODISCARD static inline PETSC_CONSTEXPR_14 const char *PetscMemTypeToString(PetscMemType mtype) { 980e6b6b59SJacob Faibussowitsch #ifdef __cplusplus 990e6b6b59SJacob Faibussowitsch static_assert(PETSC_MEMTYPE_CUDA == PETSC_MEMTYPE_DEVICE, ""); 1000e6b6b59SJacob Faibussowitsch #endif 1010e6b6b59SJacob Faibussowitsch #define PETSC_CASE_NAME(v) \ 1020e6b6b59SJacob Faibussowitsch case v: return PetscStringize(v) 1030e6b6b59SJacob Faibussowitsch 1040e6b6b59SJacob Faibussowitsch switch (mtype) { 1050e6b6b59SJacob Faibussowitsch PETSC_CASE_NAME(PETSC_MEMTYPE_HOST); 1060e6b6b59SJacob Faibussowitsch /* PETSC_CASE_NAME(PETSC_MEMTYPE_DEVICE); same as PETSC_MEMTYPE_CUDA */ 1070e6b6b59SJacob Faibussowitsch PETSC_CASE_NAME(PETSC_MEMTYPE_CUDA); 1080e6b6b59SJacob Faibussowitsch PETSC_CASE_NAME(PETSC_MEMTYPE_NVSHMEM); 1090e6b6b59SJacob Faibussowitsch PETSC_CASE_NAME(PETSC_MEMTYPE_HIP); 1100e6b6b59SJacob Faibussowitsch PETSC_CASE_NAME(PETSC_MEMTYPE_SYCL); 1110e6b6b59SJacob Faibussowitsch } 1120e6b6b59SJacob Faibussowitsch PetscUnreachable(); 1130e6b6b59SJacob Faibussowitsch return "invalid"; 1140e6b6b59SJacob Faibussowitsch #undef PETSC_CASE_NAME 1150e6b6b59SJacob Faibussowitsch } 1160e6b6b59SJacob Faibussowitsch 1175b5f62f7SJacob Faibussowitsch #define PETSC_OFFLOAD_VECKOKKOS_DEPRECATED PETSC_OFFLOAD_VECKOKKOS PETSC_DEPRECATED_ENUM("Use PETSC_OFFLOAD_KOKKOS (since version 3.17.0)") 1180e6b6b59SJacob Faibussowitsch 119030f984aSJacob Faibussowitsch /*E 120030f984aSJacob Faibussowitsch PetscOffloadMask - indicates which memory (CPU, GPU, or none) contains valid data 121030f984aSJacob Faibussowitsch 122fe0d65a2SJacob Faibussowitsch $ PETSC_OFFLOAD_UNALLOCATED - no memory contains valid matrix entries; NEVER used for vectors 123fe0d65a2SJacob Faibussowitsch $ PETSC_OFFLOAD_GPU - GPU has valid vector/matrix entries 124fe0d65a2SJacob Faibussowitsch $ PETSC_OFFLOAD_CPU - CPU has valid vector/matrix entries 125fe0d65a2SJacob Faibussowitsch $ PETSC_OFFLOAD_BOTH - Both GPU and CPU have valid vector/matrix entries and they match 126ae76731bSJunchao Zhang $ PETSC_OFFLOAD_KOKKOS - Reserved for Kokkos matrix and vector. It means the offload is managed by Kokkos, thus this flag itself cannot tell you where the valid data is. 127030f984aSJacob Faibussowitsch 1280e6b6b59SJacob Faibussowitsch Developer Notes: 1290e6b6b59SJacob Faibussowitsch This enum uses a function (`PetscOffloadMaskToString()`) to convert to string representation so 1300e6b6b59SJacob Faibussowitsch cannot be used in `PetscOptionsEnum()`. 1310e6b6b59SJacob Faibussowitsch 132030f984aSJacob Faibussowitsch Level: developer 1330e6b6b59SJacob Faibussowitsch 1340e6b6b59SJacob Faibussowitsch .seealso: `PetscOffloadMaskToString()`, `PetscOffloadMaskToMemType()`, `PetscOffloadMaskToDeviceCopyMode()` 135030f984aSJacob Faibussowitsch E*/ 136fe0d65a2SJacob Faibussowitsch typedef enum { 137fe0d65a2SJacob Faibussowitsch PETSC_OFFLOAD_UNALLOCATED = 0x0, 138fe0d65a2SJacob Faibussowitsch PETSC_OFFLOAD_CPU = 0x1, 139fe0d65a2SJacob Faibussowitsch PETSC_OFFLOAD_GPU = 0x2, 140fe0d65a2SJacob Faibussowitsch PETSC_OFFLOAD_BOTH = 0x3, 141d795ed5eSJunchao Zhang PETSC_OFFLOAD_VECKOKKOS_DEPRECATED = 0x100, 142ae76731bSJunchao Zhang PETSC_OFFLOAD_KOKKOS = 0x100 143fe0d65a2SJacob Faibussowitsch } PetscOffloadMask; 144030f984aSJacob Faibussowitsch 1450e6b6b59SJacob Faibussowitsch #define PetscOffloadUnallocated(m) ((m) == PETSC_OFFLOAD_UNALLOCATED) 1460e6b6b59SJacob Faibussowitsch #define PetscOffloadHost(m) (((m)&PETSC_OFFLOAD_CPU) == PETSC_OFFLOAD_CPU) 1470e6b6b59SJacob Faibussowitsch #define PetscOffloadDevice(m) (((m)&PETSC_OFFLOAD_GPU) == PETSC_OFFLOAD_GPU) 148*a8e904f6SJacob Faibussowitsch #define PetscOffloadBoth(m) ((m) == PETSC_OFFLOAD_BOTH) 1490e6b6b59SJacob Faibussowitsch 1500e6b6b59SJacob Faibussowitsch #if defined(__cplusplus) 1510e6b6b59SJacob Faibussowitsch #if PETSC_SHOULD_SILENCE_GCC_TAUTOLOGICAL_COMPARE_WARNING 1520e6b6b59SJacob Faibussowitsch #pragma GCC diagnostic push 1530e6b6b59SJacob Faibussowitsch #pragma GCC diagnostic ignored "-Wtautological-compare" 1540e6b6b59SJacob Faibussowitsch #endif 1550e6b6b59SJacob Faibussowitsch static_assert(!PetscOffloadHost(PETSC_OFFLOAD_UNALLOCATED), ""); 1560e6b6b59SJacob Faibussowitsch static_assert(PetscOffloadHost(PETSC_OFFLOAD_BOTH), ""); 1570e6b6b59SJacob Faibussowitsch static_assert(!PetscOffloadHost(PETSC_OFFLOAD_GPU), ""); 1580e6b6b59SJacob Faibussowitsch static_assert(PetscOffloadHost(PETSC_OFFLOAD_BOTH), ""); 1590e6b6b59SJacob Faibussowitsch static_assert(!PetscOffloadHost(PETSC_OFFLOAD_KOKKOS), ""); 1600e6b6b59SJacob Faibussowitsch 1610e6b6b59SJacob Faibussowitsch static_assert(!PetscOffloadDevice(PETSC_OFFLOAD_UNALLOCATED), ""); 1620e6b6b59SJacob Faibussowitsch static_assert(!PetscOffloadDevice(PETSC_OFFLOAD_CPU), ""); 1630e6b6b59SJacob Faibussowitsch static_assert(PetscOffloadDevice(PETSC_OFFLOAD_GPU), ""); 1640e6b6b59SJacob Faibussowitsch static_assert(PetscOffloadDevice(PETSC_OFFLOAD_BOTH), ""); 1650e6b6b59SJacob Faibussowitsch static_assert(!PetscOffloadDevice(PETSC_OFFLOAD_KOKKOS), ""); 166*a8e904f6SJacob Faibussowitsch 167*a8e904f6SJacob Faibussowitsch static_assert(PetscOffloadBoth(PETSC_OFFLOAD_BOTH), ""); 168*a8e904f6SJacob Faibussowitsch static_assert(!PetscOffloadBoth(PETSC_OFFLOAD_CPU), ""); 169*a8e904f6SJacob Faibussowitsch static_assert(!PetscOffloadBoth(PETSC_OFFLOAD_GPU), ""); 170*a8e904f6SJacob Faibussowitsch static_assert(!PetscOffloadBoth(PETSC_OFFLOAD_GPU), ""); 171*a8e904f6SJacob Faibussowitsch static_assert(!PetscOffloadBoth(PETSC_OFFLOAD_KOKKOS), ""); 1720e6b6b59SJacob Faibussowitsch #if PETSC_SHOULD_SILENCE_GCC_TAUTOLOGICAL_COMPARE_WARNING 1730e6b6b59SJacob Faibussowitsch #pragma GCC diagnostic pop 1740e6b6b59SJacob Faibussowitsch #endif 1750e6b6b59SJacob Faibussowitsch #endif // __cplusplus 1760e6b6b59SJacob Faibussowitsch 1770e6b6b59SJacob Faibussowitsch PETSC_NODISCARD static inline PETSC_CONSTEXPR_14 const char *PetscOffloadMaskToString(PetscOffloadMask mask) { 1780e6b6b59SJacob Faibussowitsch #define PETSC_CASE_RETURN(v) \ 1790e6b6b59SJacob Faibussowitsch case v: return PetscStringize(v) 1800e6b6b59SJacob Faibussowitsch 1810e6b6b59SJacob Faibussowitsch switch (mask) { 1820e6b6b59SJacob Faibussowitsch PETSC_CASE_RETURN(PETSC_OFFLOAD_UNALLOCATED); 1830e6b6b59SJacob Faibussowitsch PETSC_CASE_RETURN(PETSC_OFFLOAD_CPU); 1840e6b6b59SJacob Faibussowitsch PETSC_CASE_RETURN(PETSC_OFFLOAD_GPU); 1850e6b6b59SJacob Faibussowitsch PETSC_CASE_RETURN(PETSC_OFFLOAD_BOTH); 1860e6b6b59SJacob Faibussowitsch PETSC_CASE_RETURN(PETSC_OFFLOAD_KOKKOS); 1870e6b6b59SJacob Faibussowitsch } 1880e6b6b59SJacob Faibussowitsch PetscUnreachable(); 1890e6b6b59SJacob Faibussowitsch return "invalid"; 1900e6b6b59SJacob Faibussowitsch #undef PETSC_CASE_RETURN 1910e6b6b59SJacob Faibussowitsch } 1920e6b6b59SJacob Faibussowitsch 1930e6b6b59SJacob Faibussowitsch PETSC_NODISCARD static inline PETSC_CONSTEXPR_14 PetscMemType PetscOffloadMaskToMemType(PetscOffloadMask mask) { 1940e6b6b59SJacob Faibussowitsch switch (mask) { 1950e6b6b59SJacob Faibussowitsch case PETSC_OFFLOAD_UNALLOCATED: 1960e6b6b59SJacob Faibussowitsch case PETSC_OFFLOAD_CPU: return PETSC_MEMTYPE_HOST; 1970e6b6b59SJacob Faibussowitsch case PETSC_OFFLOAD_GPU: 1980e6b6b59SJacob Faibussowitsch case PETSC_OFFLOAD_BOTH: return PETSC_MEMTYPE_DEVICE; 1990e6b6b59SJacob Faibussowitsch case PETSC_OFFLOAD_KOKKOS: return PETSC_MEMTYPE_KOKKOS; 2000e6b6b59SJacob Faibussowitsch } 2010e6b6b59SJacob Faibussowitsch PetscUnreachable(); 2020e6b6b59SJacob Faibussowitsch return PETSC_MEMTYPE_HOST; 2030e6b6b59SJacob Faibussowitsch } 2040e6b6b59SJacob Faibussowitsch 205030f984aSJacob Faibussowitsch /*E 20687497f52SBarry Smith PetscDeviceInitType - Initialization strategy for `PetscDevice` 207a4af0ceeSJacob Faibussowitsch 208a4af0ceeSJacob Faibussowitsch $ PETSC_DEVICE_INIT_NONE - PetscDevice is never initialized 209a4af0ceeSJacob Faibussowitsch $ PETSC_DEVICE_INIT_LAZY - PetscDevice is initialized on demand 210a4af0ceeSJacob Faibussowitsch $ PETSC_DEVICE_INIT_EAGER - PetscDevice is initialized as soon as possible 211a4af0ceeSJacob Faibussowitsch 212a4af0ceeSJacob Faibussowitsch Notes: 2130e6b6b59SJacob Faibussowitsch `PETSC_DEVICE_INIT_NONE` implies that any initialization of `PetscDevice` is disallowed and 214a4af0ceeSJacob Faibussowitsch doing so results in an error. Useful to ensure that no accelerator is used in a program. 215a4af0ceeSJacob Faibussowitsch 216a4af0ceeSJacob Faibussowitsch Level: beginner 217a4af0ceeSJacob Faibussowitsch 2180e6b6b59SJacob Faibussowitsch .seealso: `PetscDevice`, `PetscDeviceType`, `PetscDeviceInitialize()`, 2190e6b6b59SJacob Faibussowitsch `PetscDeviceInitialized()`, `PetscDeviceCreate()` 220a4af0ceeSJacob Faibussowitsch E*/ 221a4af0ceeSJacob Faibussowitsch typedef enum { 222a4af0ceeSJacob Faibussowitsch PETSC_DEVICE_INIT_NONE, 223a4af0ceeSJacob Faibussowitsch PETSC_DEVICE_INIT_LAZY, 224a4af0ceeSJacob Faibussowitsch PETSC_DEVICE_INIT_EAGER 225a4af0ceeSJacob Faibussowitsch } PetscDeviceInitType; 226a4af0ceeSJacob Faibussowitsch PETSC_EXTERN const char *const PetscDeviceInitTypes[]; 227a4af0ceeSJacob Faibussowitsch 228a4af0ceeSJacob Faibussowitsch /*E 229a4af0ceeSJacob Faibussowitsch PetscDeviceType - Kind of accelerator device backend 230030f984aSJacob Faibussowitsch 2310e6b6b59SJacob Faibussowitsch $ PETSC_DEVICE_HOST - Host, no accelerator backend found 232030f984aSJacob Faibussowitsch $ PETSC_DEVICE_CUDA - CUDA enabled GPU 233030f984aSJacob Faibussowitsch $ PETSC_DEVICE_HIP - ROCM/HIP enabled GPU 234a2158755SJunchao Zhang $ PETSC_DEVICE_SYCL - SYCL enabled device 235a4af0ceeSJacob Faibussowitsch $ PETSC_DEVICE_MAX - Always 1 greater than the largest valid PetscDeviceType, invalid type, do not use 236030f984aSJacob Faibussowitsch 237030f984aSJacob Faibussowitsch Notes: 2380e6b6b59SJacob Faibussowitsch One can also use the `PETSC_DEVICE_DEFAULT()` routine to get the current default `PetscDeviceType`. 239030f984aSJacob Faibussowitsch 240030f984aSJacob Faibussowitsch Level: beginner 241030f984aSJacob Faibussowitsch 2420e6b6b59SJacob Faibussowitsch .seealso: `PetscDevice`, `PetscDeviceInitType`, `PetscDeviceCreate()`, `PETSC_DEVICE_DEFAULT()` 243030f984aSJacob Faibussowitsch E*/ 244030f984aSJacob Faibussowitsch typedef enum { 2450e6b6b59SJacob Faibussowitsch PETSC_DEVICE_HOST, 246a4af0ceeSJacob Faibussowitsch PETSC_DEVICE_CUDA, 247a4af0ceeSJacob Faibussowitsch PETSC_DEVICE_HIP, 248a2158755SJunchao Zhang PETSC_DEVICE_SYCL, 249a4af0ceeSJacob Faibussowitsch PETSC_DEVICE_MAX 250a4af0ceeSJacob Faibussowitsch } PetscDeviceType; 251a4af0ceeSJacob Faibussowitsch PETSC_EXTERN const char *const PetscDeviceTypes[]; 252030f984aSJacob Faibussowitsch 253a16fd2c9SJacob Faibussowitsch /*E 254a16fd2c9SJacob Faibussowitsch PetscDeviceAttribute - Attribute detailing a property or feature of a `PetscDevice` 255a16fd2c9SJacob Faibussowitsch 256a16fd2c9SJacob Faibussowitsch $ PETSC_DEVICE_ATTR_SIZE_T_SHARED_MEM_PER_BLOCK - The maximum amount of shared memory per block in a 257a16fd2c9SJacob Faibussowitsch device kernel 258a16fd2c9SJacob Faibussowitsch $ PETSC_DEVICE_ATTR_MAX - Invalid attribute, do not use 259a16fd2c9SJacob Faibussowitsch 260a16fd2c9SJacob Faibussowitsch Level: beginner 261a16fd2c9SJacob Faibussowitsch 262a16fd2c9SJacob Faibussowitsch .seealso: `PetscDevice`, `PetscDeviceGetAttribute()` 263a16fd2c9SJacob Faibussowitsch E*/ 264a16fd2c9SJacob Faibussowitsch typedef enum { 265a16fd2c9SJacob Faibussowitsch PETSC_DEVICE_ATTR_SIZE_T_SHARED_MEM_PER_BLOCK, 266a16fd2c9SJacob Faibussowitsch PETSC_DEVICE_ATTR_MAX 267a16fd2c9SJacob Faibussowitsch } PetscDeviceAttribute; 268a16fd2c9SJacob Faibussowitsch PETSC_EXTERN const char *const PetscDeviceAttributes[]; 269a16fd2c9SJacob Faibussowitsch 270030f984aSJacob Faibussowitsch /*S 27187497f52SBarry Smith PetscDevice - Object to manage an accelerator "device" (usually a GPU) 272030f984aSJacob Faibussowitsch 2730e6b6b59SJacob Faibussowitsch Notes: 2740e6b6b59SJacob Faibussowitsch This object is used to house configuration and state of a device, but does not offer any 2750e6b6b59SJacob Faibussowitsch ability to interact with or drive device computation. This functionality is facilitated 2760e6b6b59SJacob Faibussowitsch instead by the `PetscDeviceContext` object. 277030f984aSJacob Faibussowitsch 278030f984aSJacob Faibussowitsch Level: beginner 279030f984aSJacob Faibussowitsch 2800e6b6b59SJacob Faibussowitsch .seealso: `PetscDeviceType`, `PetscDeviceInitType`, `PetscDeviceCreate()`, 2810e6b6b59SJacob Faibussowitsch `PetscDeviceConfigure()`, `PetscDeviceDestroy()`, `PetscDeviceContext`, 2820e6b6b59SJacob Faibussowitsch `PetscDeviceContextSetDevice()`, `PetscDeviceContextGetDevice()`, `PetscDeviceGetAttribute()` 283030f984aSJacob Faibussowitsch S*/ 284030f984aSJacob Faibussowitsch typedef struct _n_PetscDevice *PetscDevice; 285030f984aSJacob Faibussowitsch 286030f984aSJacob Faibussowitsch /*E 2870e6b6b59SJacob Faibussowitsch PetscStreamType - Stream blocking mode, indicates how a stream implementation will interact 2880e6b6b59SJacob Faibussowitsch with the default "NULL" stream, which is usually blocking. 289030f984aSJacob Faibussowitsch 290030f984aSJacob Faibussowitsch $ PETSC_STREAM_GLOBAL_BLOCKING - Alias for NULL stream. Any stream of this type will block the host for all other streams to finish work before starting its operations. 291030f984aSJacob Faibussowitsch $ PETSC_STREAM_DEFAULT_BLOCKING - Stream will act independent of other streams, but will still be blocked by actions on the NULL stream. 292030f984aSJacob Faibussowitsch $ PETSC_STREAM_GLOBAL_NONBLOCKING - Stream is truly asynchronous, and is blocked by nothing, not even the NULL stream. 293030f984aSJacob Faibussowitsch $ PETSC_STREAM_MAX - Always 1 greater than the largest PetscStreamType, do not use 294030f984aSJacob Faibussowitsch 295030f984aSJacob Faibussowitsch Level: intermediate 296030f984aSJacob Faibussowitsch 297db781477SPatrick Sanan .seealso: `PetscDeviceContextSetStreamType()`, `PetscDeviceContextGetStreamType()` 298030f984aSJacob Faibussowitsch E*/ 299030f984aSJacob Faibussowitsch typedef enum { 300a4af0ceeSJacob Faibussowitsch PETSC_STREAM_GLOBAL_BLOCKING, 301a4af0ceeSJacob Faibussowitsch PETSC_STREAM_DEFAULT_BLOCKING, 302a4af0ceeSJacob Faibussowitsch PETSC_STREAM_GLOBAL_NONBLOCKING, 303a4af0ceeSJacob Faibussowitsch PETSC_STREAM_MAX 304030f984aSJacob Faibussowitsch } PetscStreamType; 305030f984aSJacob Faibussowitsch PETSC_EXTERN const char *const PetscStreamTypes[]; 306030f984aSJacob Faibussowitsch 307030f984aSJacob Faibussowitsch /*E 3080e6b6b59SJacob Faibussowitsch PetscDeviceContextJoinMode - Describes the type of join operation to perform in 3090e6b6b59SJacob Faibussowitsch `PetscDeviceContextJoin()` 310030f984aSJacob Faibussowitsch 3115d84059aSJacob Faibussowitsch $ PETSC_DEVICE_CONTEXT_JOIN_DESTROY - Destroy all incoming sub-contexts after join. 3125d84059aSJacob Faibussowitsch $ PETSC_DEVICE_CONTEXT_JOIN_SYNC - Synchronize incoming sub-contexts after join. 3135d84059aSJacob Faibussowitsch $ PETSC_DEVICE_CONTEXT_JOIN_NO_SYNC - Do not synchronize incoming sub-contexts after join. 314030f984aSJacob Faibussowitsch 315030f984aSJacob Faibussowitsch Level: beginner 316030f984aSJacob Faibussowitsch 317db781477SPatrick Sanan .seealso: `PetscDeviceContext`, `PetscDeviceContextFork()`, `PetscDeviceContextJoin()` 318030f984aSJacob Faibussowitsch E*/ 319030f984aSJacob Faibussowitsch typedef enum { 320030f984aSJacob Faibussowitsch PETSC_DEVICE_CONTEXT_JOIN_DESTROY, 321030f984aSJacob Faibussowitsch PETSC_DEVICE_CONTEXT_JOIN_SYNC, 322030f984aSJacob Faibussowitsch PETSC_DEVICE_CONTEXT_JOIN_NO_SYNC 323030f984aSJacob Faibussowitsch } PetscDeviceContextJoinMode; 324030f984aSJacob Faibussowitsch PETSC_EXTERN const char *const PetscDeviceContextJoinModes[]; 325030f984aSJacob Faibussowitsch 326030f984aSJacob Faibussowitsch /*S 3270e6b6b59SJacob Faibussowitsch PetscDeviceContext - Container to manage stream dependencies and the various solver handles 3280e6b6b59SJacob Faibussowitsch for asynchronous device compute. 329030f984aSJacob Faibussowitsch 330030f984aSJacob Faibussowitsch Level: beginner 331030f984aSJacob Faibussowitsch 3320e6b6b59SJacob Faibussowitsch .seealso: `PetscDevice`, `PetscDeviceContextCreate()`, `PetscDeviceContextSetDevice()`, 3330e6b6b59SJacob Faibussowitsch `PetscDeviceContextDestroy()`,`PetscDeviceContextFork()`, `PetscDeviceContextJoin()` 334030f984aSJacob Faibussowitsch S*/ 3350e6b6b59SJacob Faibussowitsch typedef struct _p_PetscDeviceContext *PetscDeviceContext; 3360e6b6b59SJacob Faibussowitsch 3370e6b6b59SJacob Faibussowitsch /*E 3380e6b6b59SJacob Faibussowitsch PetscDeviceCopyMode - Describes the copy direction of a device-aware memcpy 3390e6b6b59SJacob Faibussowitsch 3400e6b6b59SJacob Faibussowitsch $ PETSC_DEVICE_COPY_HTOH - Copy from host memory to host memory 3410e6b6b59SJacob Faibussowitsch $ PETSC_DEVICE_COPY_DTOH - Copy from device memory to host memory 3420e6b6b59SJacob Faibussowitsch $ PETSC_DEVICE_COPY_HTOD - Copy from host memory to device memory 3430e6b6b59SJacob Faibussowitsch $ PETSC_DEVICE_COPY_DTOD - Copy from device memory to device memory 3440e6b6b59SJacob Faibussowitsch $ PETSC_DEVICE_COPY_AUTO - Infer the copy direction from the pointers 3450e6b6b59SJacob Faibussowitsch 3460e6b6b59SJacob Faibussowitsch Level: beginner 3470e6b6b59SJacob Faibussowitsch 3480e6b6b59SJacob Faibussowitsch .seealso: `PetscDeviceArrayCopy()`, `PetscDeviceMemcpy()` 3490e6b6b59SJacob Faibussowitsch E*/ 3500e6b6b59SJacob Faibussowitsch typedef enum { 3510e6b6b59SJacob Faibussowitsch PETSC_DEVICE_COPY_HTOH, 3520e6b6b59SJacob Faibussowitsch PETSC_DEVICE_COPY_DTOH, 3530e6b6b59SJacob Faibussowitsch PETSC_DEVICE_COPY_HTOD, 3540e6b6b59SJacob Faibussowitsch PETSC_DEVICE_COPY_DTOD, 3550e6b6b59SJacob Faibussowitsch PETSC_DEVICE_COPY_AUTO, 3560e6b6b59SJacob Faibussowitsch } PetscDeviceCopyMode; 3570e6b6b59SJacob Faibussowitsch PETSC_EXTERN const char *const PetscDeviceCopyModes[]; 3580e6b6b59SJacob Faibussowitsch 3590e6b6b59SJacob Faibussowitsch PETSC_NODISCARD static inline PetscDeviceCopyMode PetscOffloadMaskToDeviceCopyMode(PetscOffloadMask dest, PetscOffloadMask src) { 3600e6b6b59SJacob Faibussowitsch PetscDeviceCopyMode mode; 3610e6b6b59SJacob Faibussowitsch 3620e6b6b59SJacob Faibussowitsch PetscFunctionBegin; 3630e6b6b59SJacob Faibussowitsch PetscAssertAbort(dest != PETSC_OFFLOAD_UNALLOCATED, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Cannot copy to unallocated"); 3640e6b6b59SJacob Faibussowitsch PetscAssertAbort(src != PETSC_OFFLOAD_UNALLOCATED, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Cannot copy from unallocated"); 3650e6b6b59SJacob Faibussowitsch 3660e6b6b59SJacob Faibussowitsch if (PetscOffloadDevice(dest)) { 3670e6b6b59SJacob Faibussowitsch mode = PetscOffloadHost(src) ? PETSC_DEVICE_COPY_HTOD : PETSC_DEVICE_COPY_DTOD; 3680e6b6b59SJacob Faibussowitsch } else { 3690e6b6b59SJacob Faibussowitsch mode = PetscOffloadHost(src) ? PETSC_DEVICE_COPY_HTOH : PETSC_DEVICE_COPY_DTOH; 3700e6b6b59SJacob Faibussowitsch } 3710e6b6b59SJacob Faibussowitsch PetscFunctionReturn(mode); 3720e6b6b59SJacob Faibussowitsch } 3730e6b6b59SJacob Faibussowitsch 3740e6b6b59SJacob Faibussowitsch PETSC_NODISCARD static inline PETSC_CONSTEXPR_14 PetscDeviceCopyMode PetscMemTypeToDeviceCopyMode(PetscMemType dest, PetscMemType src) { 3750e6b6b59SJacob Faibussowitsch if (PetscMemTypeHost(dest)) { 3760e6b6b59SJacob Faibussowitsch return PetscMemTypeHost(src) ? PETSC_DEVICE_COPY_HTOH : PETSC_DEVICE_COPY_DTOH; 3770e6b6b59SJacob Faibussowitsch } else { 3780e6b6b59SJacob Faibussowitsch return PetscMemTypeDevice(src) ? PETSC_DEVICE_COPY_DTOD : PETSC_DEVICE_COPY_HTOD; 3790e6b6b59SJacob Faibussowitsch } 3800e6b6b59SJacob Faibussowitsch } 3810e6b6b59SJacob Faibussowitsch 3820e6b6b59SJacob Faibussowitsch /*E 3830e6b6b59SJacob Faibussowitsch PetscMemoryAccessMode - Describes the intended usage of a memory region 3840e6b6b59SJacob Faibussowitsch 3850e6b6b59SJacob Faibussowitsch + PETSC_MEMORY_ACCESS_READ - Read only 3860e6b6b59SJacob Faibussowitsch . PETSC_MEMORY_ACCESS_WRITE - Write only 3870e6b6b59SJacob Faibussowitsch - PETSC_MEMORY_ACCESS_READ_WRITE - Read and write 3880e6b6b59SJacob Faibussowitsch 3890e6b6b59SJacob Faibussowitsch Notes: 3900e6b6b59SJacob Faibussowitsch This `enum` is a bitmask with the following encoding (assuming 2 bit)\: 3910e6b6b59SJacob Faibussowitsch 3920e6b6b59SJacob Faibussowitsch .vb 3930e6b6b59SJacob Faibussowitsch PETSC_MEMORY_ACCESS_READ = 0b01 3940e6b6b59SJacob Faibussowitsch PETSC_MEMORY_ACCESS_WRITE = 0b10 3950e6b6b59SJacob Faibussowitsch PETSC_MEMORY_ACCESS_READ_WRITE = 0b11 3960e6b6b59SJacob Faibussowitsch 3970e6b6b59SJacob Faibussowitsch // consequently 3980e6b6b59SJacob Faibussowitsch PETSC_MEMORY_ACCESS_READ | PETSC_MEMORY_ACCESS_WRITE = PETSC_MEMORY_ACCESS_READ_WRITE 3990e6b6b59SJacob Faibussowitsch .ve 4000e6b6b59SJacob Faibussowitsch 4010e6b6b59SJacob Faibussowitsch The following convience macros are also provided\: 4020e6b6b59SJacob Faibussowitsch 4030e6b6b59SJacob Faibussowitsch - `PetscMemoryAccessRead(mode)`\: `true` if `mode` is any kind of read, `false` otherwise 4040e6b6b59SJacob Faibussowitsch - `PetscMemoryAccessWrite(mode)`\: `true` if `mode` is any kind of write, `false` otherwise 4050e6b6b59SJacob Faibussowitsch 4060e6b6b59SJacob Faibussowitsch Developer Notes: 4070e6b6b59SJacob Faibussowitsch This enum uses a function (`PetscMemoryAccessModeToString()`) to convert values to string 4080e6b6b59SJacob Faibussowitsch representation, so cannot be used in `PetscOptionsEnum()`. 4090e6b6b59SJacob Faibussowitsch 4100e6b6b59SJacob Faibussowitsch Level: beginner 4110e6b6b59SJacob Faibussowitsch 4120e6b6b59SJacob Faibussowitsch .seealso: `PetscMemoryAccessModeToString()`, `PetscDevice`, `PetscDeviceContext` 4130e6b6b59SJacob Faibussowitsch E*/ 4140e6b6b59SJacob Faibussowitsch typedef enum { 4150e6b6b59SJacob Faibussowitsch PETSC_MEMORY_ACCESS_READ = 0x1, // 01 4160e6b6b59SJacob Faibussowitsch PETSC_MEMORY_ACCESS_WRITE = 0x2, // 10 4170e6b6b59SJacob Faibussowitsch PETSC_MEMORY_ACCESS_READ_WRITE = 0x3, // 11 4180e6b6b59SJacob Faibussowitsch } PetscMemoryAccessMode; 4190e6b6b59SJacob Faibussowitsch 4200e6b6b59SJacob Faibussowitsch #define PetscMemoryAccessRead(m) (((m)&PETSC_MEMORY_ACCESS_READ) == PETSC_MEMORY_ACCESS_READ) 4210e6b6b59SJacob Faibussowitsch #define PetscMemoryAccessWrite(m) (((m)&PETSC_MEMORY_ACCESS_WRITE) == PETSC_MEMORY_ACCESS_WRITE) 4220e6b6b59SJacob Faibussowitsch 4230e6b6b59SJacob Faibussowitsch #if defined(__cplusplus) 4240e6b6b59SJacob Faibussowitsch #if PETSC_SHOULD_SILENCE_GCC_TAUTOLOGICAL_COMPARE_WARNING 4250e6b6b59SJacob Faibussowitsch #pragma GCC diagnostic push 4260e6b6b59SJacob Faibussowitsch #pragma GCC diagnostic ignored "-Wtautological-compare" 4270e6b6b59SJacob Faibussowitsch #endif 4280e6b6b59SJacob Faibussowitsch static_assert(PetscMemoryAccessRead(PETSC_MEMORY_ACCESS_READ), ""); 4290e6b6b59SJacob Faibussowitsch static_assert(PetscMemoryAccessRead(PETSC_MEMORY_ACCESS_READ_WRITE), ""); 4300e6b6b59SJacob Faibussowitsch static_assert(!PetscMemoryAccessRead(PETSC_MEMORY_ACCESS_WRITE), ""); 4310e6b6b59SJacob Faibussowitsch static_assert(PetscMemoryAccessWrite(PETSC_MEMORY_ACCESS_WRITE), ""); 4320e6b6b59SJacob Faibussowitsch static_assert(PetscMemoryAccessWrite(PETSC_MEMORY_ACCESS_READ_WRITE), ""); 4330e6b6b59SJacob Faibussowitsch static_assert(!PetscMemoryAccessWrite(PETSC_MEMORY_ACCESS_READ), ""); 4340e6b6b59SJacob Faibussowitsch static_assert((PETSC_MEMORY_ACCESS_READ | PETSC_MEMORY_ACCESS_WRITE) == PETSC_MEMORY_ACCESS_READ_WRITE, ""); 4350e6b6b59SJacob Faibussowitsch #if PETSC_SHOULD_SILENCE_GCC_TAUTOLOGICAL_COMPARE_WARNING 4360e6b6b59SJacob Faibussowitsch #pragma GCC diagnostic pop 4370e6b6b59SJacob Faibussowitsch #endif 4380e6b6b59SJacob Faibussowitsch #endif 4390e6b6b59SJacob Faibussowitsch 4400e6b6b59SJacob Faibussowitsch PETSC_NODISCARD static inline PETSC_CONSTEXPR_14 const char *PetscMemoryAccessModeToString(PetscMemoryAccessMode mode) { 4410e6b6b59SJacob Faibussowitsch #define PETSC_CASE_RETURN(v) \ 4420e6b6b59SJacob Faibussowitsch case v: return PetscStringize(v) 4430e6b6b59SJacob Faibussowitsch 4440e6b6b59SJacob Faibussowitsch switch (mode) { 4450e6b6b59SJacob Faibussowitsch PETSC_CASE_RETURN(PETSC_MEMORY_ACCESS_READ); 4460e6b6b59SJacob Faibussowitsch PETSC_CASE_RETURN(PETSC_MEMORY_ACCESS_WRITE); 4470e6b6b59SJacob Faibussowitsch PETSC_CASE_RETURN(PETSC_MEMORY_ACCESS_READ_WRITE); 4480e6b6b59SJacob Faibussowitsch } 4490e6b6b59SJacob Faibussowitsch PetscUnreachable(); 4500e6b6b59SJacob Faibussowitsch return "invalid"; 4510e6b6b59SJacob Faibussowitsch #undef PETSC_CASE_RETURN 4520e6b6b59SJacob Faibussowitsch } 4530e6b6b59SJacob Faibussowitsch 4540e6b6b59SJacob Faibussowitsch #undef PETSC_SHOULD_SILENCE_GCC_TAUTOLOGICAL_COMPARE_WARNING 4550e6b6b59SJacob Faibussowitsch 456030f984aSJacob Faibussowitsch #endif /* PETSCDEVICETYPES_H */ 457