1*a4963045SJacob Faibussowitsch #pragma once 2030f984aSJacob Faibussowitsch 30e6b6b59SJacob Faibussowitsch #include <petscsys.h> /*I <petscdevicetypes.h> I*/ 40e6b6b59SJacob Faibussowitsch 50e6b6b59SJacob Faibussowitsch // Some overzealous older gcc versions warn that the comparisons below are always true. Neat 60e6b6b59SJacob Faibussowitsch // that it can detect this, but the tautology *is* the point of the static_assert()! 70e6b6b59SJacob Faibussowitsch #if defined(__GNUC__) && __GNUC__ >= 6 && !PetscDefined(HAVE_WINDOWS_COMPILERS) 80e6b6b59SJacob Faibussowitsch #define PETSC_SHOULD_SILENCE_GCC_TAUTOLOGICAL_COMPARE_WARNING 1 90e6b6b59SJacob Faibussowitsch #else 100e6b6b59SJacob Faibussowitsch #define PETSC_SHOULD_SILENCE_GCC_TAUTOLOGICAL_COMPARE_WARNING 0 110e6b6b59SJacob Faibussowitsch #endif 12030f984aSJacob Faibussowitsch 13ac09b921SBarry Smith /* SUBMANSEC = Sys */ 14ac09b921SBarry Smith 15030f984aSJacob Faibussowitsch /*E 16030f984aSJacob Faibussowitsch PetscMemType - Memory type of a pointer 17030f984aSJacob Faibussowitsch 1816a05f60SBarry Smith Level: intermediate 19fe0d65a2SJacob Faibussowitsch 203214990dSStefano Zampini Notes: 2187497f52SBarry Smith `PETSC_MEMTYPE_KOKKOS` depends on the Kokkos backend configuration 223214990dSStefano Zampini 230e6b6b59SJacob Faibussowitsch Developer Notes: 240e6b6b59SJacob Faibussowitsch This enum uses a function (`PetscMemTypeToString()`) to convert to string representation so 250e6b6b59SJacob Faibussowitsch cannot be used in `PetscOptionsEnum()`. 260e6b6b59SJacob Faibussowitsch 2716a05f60SBarry Smith Developer Note: 2816a05f60SBarry Smith Encoding of the bitmask in binary: xxxxyyyz 2916a05f60SBarry Smith .vb 3016a05f60SBarry Smith z = 0 - Host memory 3116a05f60SBarry Smith z = 1 - Device memory 3216a05f60SBarry Smith yyy = 000 - CUDA-related memory 3316a05f60SBarry Smith yyy = 001 - HIP-related memory 3416a05f60SBarry Smith yyy = 010 - SYCL-related memory 3516a05f60SBarry Smith xxxxyyy1 = 0000,0001 - CUDA memory 3616a05f60SBarry Smith xxxxyyy1 = 0001,0001 - CUDA NVSHMEM memory 3716a05f60SBarry Smith xxxxyyy1 = 0000,0011 - HIP memory 3816a05f60SBarry Smith xxxxyyy1 = 0000,0101 - SYCL memory 3916a05f60SBarry Smith .ve 4016a05f60SBarry Smith 4116a05f60SBarry Smith Other types of memory, e.g., CUDA managed memory, can be added when needed. 4216a05f60SBarry Smith 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 97d71ae5a4SJacob Faibussowitsch PETSC_NODISCARD static inline PETSC_CONSTEXPR_14 const char *PetscMemTypeToString(PetscMemType mtype) 98d71ae5a4SJacob Faibussowitsch { 990e6b6b59SJacob Faibussowitsch #ifdef __cplusplus 1000e6b6b59SJacob Faibussowitsch static_assert(PETSC_MEMTYPE_CUDA == PETSC_MEMTYPE_DEVICE, ""); 1010e6b6b59SJacob Faibussowitsch #endif 1020e6b6b59SJacob Faibussowitsch #define PETSC_CASE_NAME(v) \ 103d71ae5a4SJacob Faibussowitsch case v: \ 104d71ae5a4SJacob Faibussowitsch return PetscStringize(v) 1050e6b6b59SJacob Faibussowitsch 1060e6b6b59SJacob Faibussowitsch switch (mtype) { 1070e6b6b59SJacob Faibussowitsch PETSC_CASE_NAME(PETSC_MEMTYPE_HOST); 1080e6b6b59SJacob Faibussowitsch /* PETSC_CASE_NAME(PETSC_MEMTYPE_DEVICE); same as PETSC_MEMTYPE_CUDA */ 1090e6b6b59SJacob Faibussowitsch PETSC_CASE_NAME(PETSC_MEMTYPE_CUDA); 1100e6b6b59SJacob Faibussowitsch PETSC_CASE_NAME(PETSC_MEMTYPE_NVSHMEM); 1110e6b6b59SJacob Faibussowitsch PETSC_CASE_NAME(PETSC_MEMTYPE_HIP); 1120e6b6b59SJacob Faibussowitsch PETSC_CASE_NAME(PETSC_MEMTYPE_SYCL); 1130e6b6b59SJacob Faibussowitsch } 1140e6b6b59SJacob Faibussowitsch PetscUnreachable(); 1150e6b6b59SJacob Faibussowitsch return "invalid"; 1160e6b6b59SJacob Faibussowitsch #undef PETSC_CASE_NAME 1170e6b6b59SJacob Faibussowitsch } 1180e6b6b59SJacob Faibussowitsch 119edd03b47SJacob Faibussowitsch #define PETSC_OFFLOAD_VECKOKKOS_DEPRECATED PETSC_OFFLOAD_VECKOKKOS PETSC_DEPRECATED_ENUM(3, 17, 0, "PETSC_OFFLOAD_KOKKOS", ) 1200e6b6b59SJacob Faibussowitsch 121030f984aSJacob Faibussowitsch /*E 122030f984aSJacob Faibussowitsch PetscOffloadMask - indicates which memory (CPU, GPU, or none) contains valid data 123030f984aSJacob Faibussowitsch 12416a05f60SBarry Smith Values: 12516a05f60SBarry Smith + `PETSC_OFFLOAD_UNALLOCATED` - no memory contains valid matrix entries; NEVER used for vectors 12616a05f60SBarry Smith . `PETSC_OFFLOAD_GPU` - GPU has valid vector/matrix entries 12716a05f60SBarry Smith . `PETSC_OFFLOAD_CPU` - CPU has valid vector/matrix entries 12816a05f60SBarry Smith . `PETSC_OFFLOAD_BOTH` - Both GPU and CPU have valid vector/matrix entries and they match 12916a05f60SBarry Smith - `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. 13016a05f60SBarry Smith 13116a05f60SBarry Smith Level: developer 132030f984aSJacob Faibussowitsch 1330e6b6b59SJacob Faibussowitsch Developer Notes: 1340e6b6b59SJacob Faibussowitsch This enum uses a function (`PetscOffloadMaskToString()`) to convert to string representation so 1350e6b6b59SJacob Faibussowitsch cannot be used in `PetscOptionsEnum()`. 1360e6b6b59SJacob Faibussowitsch 1370e6b6b59SJacob Faibussowitsch .seealso: `PetscOffloadMaskToString()`, `PetscOffloadMaskToMemType()`, `PetscOffloadMaskToDeviceCopyMode()` 138030f984aSJacob Faibussowitsch E*/ 139fe0d65a2SJacob Faibussowitsch typedef enum { 140fe0d65a2SJacob Faibussowitsch PETSC_OFFLOAD_UNALLOCATED = 0x0, 141fe0d65a2SJacob Faibussowitsch PETSC_OFFLOAD_CPU = 0x1, 142fe0d65a2SJacob Faibussowitsch PETSC_OFFLOAD_GPU = 0x2, 143fe0d65a2SJacob Faibussowitsch PETSC_OFFLOAD_BOTH = 0x3, 144d795ed5eSJunchao Zhang PETSC_OFFLOAD_VECKOKKOS_DEPRECATED = 0x100, 145ae76731bSJunchao Zhang PETSC_OFFLOAD_KOKKOS = 0x100 146fe0d65a2SJacob Faibussowitsch } PetscOffloadMask; 147030f984aSJacob Faibussowitsch 1480e6b6b59SJacob Faibussowitsch #define PetscOffloadUnallocated(m) ((m) == PETSC_OFFLOAD_UNALLOCATED) 1490e6b6b59SJacob Faibussowitsch #define PetscOffloadHost(m) (((m)&PETSC_OFFLOAD_CPU) == PETSC_OFFLOAD_CPU) 1500e6b6b59SJacob Faibussowitsch #define PetscOffloadDevice(m) (((m)&PETSC_OFFLOAD_GPU) == PETSC_OFFLOAD_GPU) 151a8e904f6SJacob Faibussowitsch #define PetscOffloadBoth(m) ((m) == PETSC_OFFLOAD_BOTH) 1520e6b6b59SJacob Faibussowitsch 1530e6b6b59SJacob Faibussowitsch #if defined(__cplusplus) 1540e6b6b59SJacob Faibussowitsch #if PETSC_SHOULD_SILENCE_GCC_TAUTOLOGICAL_COMPARE_WARNING 1550e6b6b59SJacob Faibussowitsch #pragma GCC diagnostic push 1560e6b6b59SJacob Faibussowitsch #pragma GCC diagnostic ignored "-Wtautological-compare" 1570e6b6b59SJacob Faibussowitsch #endif 1580e6b6b59SJacob Faibussowitsch static_assert(!PetscOffloadHost(PETSC_OFFLOAD_UNALLOCATED), ""); 1590e6b6b59SJacob Faibussowitsch static_assert(PetscOffloadHost(PETSC_OFFLOAD_BOTH), ""); 1600e6b6b59SJacob Faibussowitsch static_assert(!PetscOffloadHost(PETSC_OFFLOAD_GPU), ""); 1610e6b6b59SJacob Faibussowitsch static_assert(PetscOffloadHost(PETSC_OFFLOAD_BOTH), ""); 1620e6b6b59SJacob Faibussowitsch static_assert(!PetscOffloadHost(PETSC_OFFLOAD_KOKKOS), ""); 1630e6b6b59SJacob Faibussowitsch 1640e6b6b59SJacob Faibussowitsch static_assert(!PetscOffloadDevice(PETSC_OFFLOAD_UNALLOCATED), ""); 1650e6b6b59SJacob Faibussowitsch static_assert(!PetscOffloadDevice(PETSC_OFFLOAD_CPU), ""); 1660e6b6b59SJacob Faibussowitsch static_assert(PetscOffloadDevice(PETSC_OFFLOAD_GPU), ""); 1670e6b6b59SJacob Faibussowitsch static_assert(PetscOffloadDevice(PETSC_OFFLOAD_BOTH), ""); 1680e6b6b59SJacob Faibussowitsch static_assert(!PetscOffloadDevice(PETSC_OFFLOAD_KOKKOS), ""); 169a8e904f6SJacob Faibussowitsch 170a8e904f6SJacob Faibussowitsch static_assert(PetscOffloadBoth(PETSC_OFFLOAD_BOTH), ""); 171a8e904f6SJacob Faibussowitsch static_assert(!PetscOffloadBoth(PETSC_OFFLOAD_CPU), ""); 172a8e904f6SJacob Faibussowitsch static_assert(!PetscOffloadBoth(PETSC_OFFLOAD_GPU), ""); 173a8e904f6SJacob Faibussowitsch static_assert(!PetscOffloadBoth(PETSC_OFFLOAD_GPU), ""); 174a8e904f6SJacob Faibussowitsch static_assert(!PetscOffloadBoth(PETSC_OFFLOAD_KOKKOS), ""); 1750e6b6b59SJacob Faibussowitsch #if PETSC_SHOULD_SILENCE_GCC_TAUTOLOGICAL_COMPARE_WARNING 1760e6b6b59SJacob Faibussowitsch #pragma GCC diagnostic pop 1770e6b6b59SJacob Faibussowitsch #endif 1780e6b6b59SJacob Faibussowitsch #endif // __cplusplus 1790e6b6b59SJacob Faibussowitsch 180d71ae5a4SJacob Faibussowitsch PETSC_NODISCARD static inline PETSC_CONSTEXPR_14 const char *PetscOffloadMaskToString(PetscOffloadMask mask) 181d71ae5a4SJacob Faibussowitsch { 1820e6b6b59SJacob Faibussowitsch #define PETSC_CASE_RETURN(v) \ 183d71ae5a4SJacob Faibussowitsch case v: \ 184d71ae5a4SJacob Faibussowitsch return PetscStringize(v) 1850e6b6b59SJacob Faibussowitsch 1860e6b6b59SJacob Faibussowitsch switch (mask) { 1870e6b6b59SJacob Faibussowitsch PETSC_CASE_RETURN(PETSC_OFFLOAD_UNALLOCATED); 1880e6b6b59SJacob Faibussowitsch PETSC_CASE_RETURN(PETSC_OFFLOAD_CPU); 1890e6b6b59SJacob Faibussowitsch PETSC_CASE_RETURN(PETSC_OFFLOAD_GPU); 1900e6b6b59SJacob Faibussowitsch PETSC_CASE_RETURN(PETSC_OFFLOAD_BOTH); 1910e6b6b59SJacob Faibussowitsch PETSC_CASE_RETURN(PETSC_OFFLOAD_KOKKOS); 1920e6b6b59SJacob Faibussowitsch } 1930e6b6b59SJacob Faibussowitsch PetscUnreachable(); 1940e6b6b59SJacob Faibussowitsch return "invalid"; 1950e6b6b59SJacob Faibussowitsch #undef PETSC_CASE_RETURN 1960e6b6b59SJacob Faibussowitsch } 1970e6b6b59SJacob Faibussowitsch 198d71ae5a4SJacob Faibussowitsch PETSC_NODISCARD static inline PETSC_CONSTEXPR_14 PetscMemType PetscOffloadMaskToMemType(PetscOffloadMask mask) 199d71ae5a4SJacob Faibussowitsch { 2000e6b6b59SJacob Faibussowitsch switch (mask) { 2010e6b6b59SJacob Faibussowitsch case PETSC_OFFLOAD_UNALLOCATED: 202d71ae5a4SJacob Faibussowitsch case PETSC_OFFLOAD_CPU: 203d71ae5a4SJacob Faibussowitsch return PETSC_MEMTYPE_HOST; 2040e6b6b59SJacob Faibussowitsch case PETSC_OFFLOAD_GPU: 205d71ae5a4SJacob Faibussowitsch case PETSC_OFFLOAD_BOTH: 206d71ae5a4SJacob Faibussowitsch return PETSC_MEMTYPE_DEVICE; 207d71ae5a4SJacob Faibussowitsch case PETSC_OFFLOAD_KOKKOS: 208d71ae5a4SJacob Faibussowitsch return PETSC_MEMTYPE_KOKKOS; 2090e6b6b59SJacob Faibussowitsch } 2100e6b6b59SJacob Faibussowitsch PetscUnreachable(); 2110e6b6b59SJacob Faibussowitsch return PETSC_MEMTYPE_HOST; 2120e6b6b59SJacob Faibussowitsch } 2130e6b6b59SJacob Faibussowitsch 214030f984aSJacob Faibussowitsch /*E 21587497f52SBarry Smith PetscDeviceInitType - Initialization strategy for `PetscDevice` 216a4af0ceeSJacob Faibussowitsch 21716a05f60SBarry Smith Values: 21816a05f60SBarry Smith + `PETSC_DEVICE_INIT_NONE` - PetscDevice is never initialized 21916a05f60SBarry Smith . `PETSC_DEVICE_INIT_LAZY` - PetscDevice is initialized on demand 22016a05f60SBarry Smith - `PETSC_DEVICE_INIT_EAGER` - PetscDevice is initialized as soon as possible 22116a05f60SBarry Smith 22216a05f60SBarry Smith Level: beginner 223a4af0ceeSJacob Faibussowitsch 224a4af0ceeSJacob Faibussowitsch Notes: 2250e6b6b59SJacob Faibussowitsch `PETSC_DEVICE_INIT_NONE` implies that any initialization of `PetscDevice` is disallowed and 226a4af0ceeSJacob Faibussowitsch doing so results in an error. Useful to ensure that no accelerator is used in a program. 227a4af0ceeSJacob Faibussowitsch 2280e6b6b59SJacob Faibussowitsch .seealso: `PetscDevice`, `PetscDeviceType`, `PetscDeviceInitialize()`, 2290e6b6b59SJacob Faibussowitsch `PetscDeviceInitialized()`, `PetscDeviceCreate()` 230a4af0ceeSJacob Faibussowitsch E*/ 231a4af0ceeSJacob Faibussowitsch typedef enum { 232a4af0ceeSJacob Faibussowitsch PETSC_DEVICE_INIT_NONE, 233a4af0ceeSJacob Faibussowitsch PETSC_DEVICE_INIT_LAZY, 234a4af0ceeSJacob Faibussowitsch PETSC_DEVICE_INIT_EAGER 235a4af0ceeSJacob Faibussowitsch } PetscDeviceInitType; 236a4af0ceeSJacob Faibussowitsch PETSC_EXTERN const char *const PetscDeviceInitTypes[]; 237a4af0ceeSJacob Faibussowitsch 238a4af0ceeSJacob Faibussowitsch /*E 239a4af0ceeSJacob Faibussowitsch PetscDeviceType - Kind of accelerator device backend 240030f984aSJacob Faibussowitsch 24116a05f60SBarry Smith Values: 24216a05f60SBarry Smith + `PETSC_DEVICE_HOST` - Host, no accelerator backend found 24316a05f60SBarry Smith . `PETSC_DEVICE_CUDA` - CUDA enabled GPU 24416a05f60SBarry Smith . `PETSC_DEVICE_HIP` - ROCM/HIP enabled GPU 24516a05f60SBarry Smith . `PETSC_DEVICE_SYCL` - SYCL enabled device 24616a05f60SBarry Smith - `PETSC_DEVICE_MAX` - Always 1 greater than the largest valid `PetscDeviceType`, invalid type, do not use 24716a05f60SBarry Smith 24816a05f60SBarry Smith Level: beginner 249030f984aSJacob Faibussowitsch 250030f984aSJacob Faibussowitsch Notes: 2510e6b6b59SJacob Faibussowitsch One can also use the `PETSC_DEVICE_DEFAULT()` routine to get the current default `PetscDeviceType`. 252030f984aSJacob Faibussowitsch 2530e6b6b59SJacob Faibussowitsch .seealso: `PetscDevice`, `PetscDeviceInitType`, `PetscDeviceCreate()`, `PETSC_DEVICE_DEFAULT()` 254030f984aSJacob Faibussowitsch E*/ 255030f984aSJacob Faibussowitsch typedef enum { 2560e6b6b59SJacob Faibussowitsch PETSC_DEVICE_HOST, 257a4af0ceeSJacob Faibussowitsch PETSC_DEVICE_CUDA, 258a4af0ceeSJacob Faibussowitsch PETSC_DEVICE_HIP, 259a2158755SJunchao Zhang PETSC_DEVICE_SYCL, 260a4af0ceeSJacob Faibussowitsch PETSC_DEVICE_MAX 261a4af0ceeSJacob Faibussowitsch } PetscDeviceType; 262a4af0ceeSJacob Faibussowitsch PETSC_EXTERN const char *const PetscDeviceTypes[]; 263030f984aSJacob Faibussowitsch 264a16fd2c9SJacob Faibussowitsch /*E 265a16fd2c9SJacob Faibussowitsch PetscDeviceAttribute - Attribute detailing a property or feature of a `PetscDevice` 266a16fd2c9SJacob Faibussowitsch 26716a05f60SBarry Smith Values: 26816a05f60SBarry Smith + `PETSC_DEVICE_ATTR_SIZE_T_SHARED_MEM_PER_BLOCK` - The maximum amount of shared memory per block in a device kernel 26916a05f60SBarry Smith - `PETSC_DEVICE_ATTR_MAX` - Invalid attribute, do not use 270a16fd2c9SJacob Faibussowitsch 271a16fd2c9SJacob Faibussowitsch Level: beginner 272a16fd2c9SJacob Faibussowitsch 273a16fd2c9SJacob Faibussowitsch .seealso: `PetscDevice`, `PetscDeviceGetAttribute()` 274a16fd2c9SJacob Faibussowitsch E*/ 275a16fd2c9SJacob Faibussowitsch typedef enum { 276a16fd2c9SJacob Faibussowitsch PETSC_DEVICE_ATTR_SIZE_T_SHARED_MEM_PER_BLOCK, 277a16fd2c9SJacob Faibussowitsch PETSC_DEVICE_ATTR_MAX 278a16fd2c9SJacob Faibussowitsch } PetscDeviceAttribute; 279a16fd2c9SJacob Faibussowitsch PETSC_EXTERN const char *const PetscDeviceAttributes[]; 280a16fd2c9SJacob Faibussowitsch 281030f984aSJacob Faibussowitsch /*S 28287497f52SBarry Smith PetscDevice - Object to manage an accelerator "device" (usually a GPU) 283030f984aSJacob Faibussowitsch 28416a05f60SBarry Smith Level: beginner 28516a05f60SBarry Smith 2860e6b6b59SJacob Faibussowitsch Notes: 2870e6b6b59SJacob Faibussowitsch This object is used to house configuration and state of a device, but does not offer any 2880e6b6b59SJacob Faibussowitsch ability to interact with or drive device computation. This functionality is facilitated 2890e6b6b59SJacob Faibussowitsch instead by the `PetscDeviceContext` object. 290030f984aSJacob Faibussowitsch 2910e6b6b59SJacob Faibussowitsch .seealso: `PetscDeviceType`, `PetscDeviceInitType`, `PetscDeviceCreate()`, 2920e6b6b59SJacob Faibussowitsch `PetscDeviceConfigure()`, `PetscDeviceDestroy()`, `PetscDeviceContext`, 2930e6b6b59SJacob Faibussowitsch `PetscDeviceContextSetDevice()`, `PetscDeviceContextGetDevice()`, `PetscDeviceGetAttribute()` 294030f984aSJacob Faibussowitsch S*/ 295030f984aSJacob Faibussowitsch typedef struct _n_PetscDevice *PetscDevice; 296030f984aSJacob Faibussowitsch 297030f984aSJacob Faibussowitsch /*E 2980e6b6b59SJacob Faibussowitsch PetscStreamType - Stream blocking mode, indicates how a stream implementation will interact 29916a05f60SBarry Smith with the default `NULL` stream, which is usually blocking. 300030f984aSJacob Faibussowitsch 30116a05f60SBarry Smith Values: 30216a05f60SBarry Smith + `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. 30316a05f60SBarry Smith . `PETSC_STREAM_DEFAULT_BLOCKING` - Stream will act independent of other streams, but will still be blocked by actions on the `NULL` stream. 30416a05f60SBarry Smith . `PETSC_STREAM_GLOBAL_NONBLOCKING` - Stream is truly asynchronous, and is blocked by nothing, not even the `NULL` stream. 30516a05f60SBarry Smith - `PETSC_STREAM_MAX` - Always 1 greater than the largest `PetscStreamType`, do not use 306030f984aSJacob Faibussowitsch 307030f984aSJacob Faibussowitsch Level: intermediate 308030f984aSJacob Faibussowitsch 309db781477SPatrick Sanan .seealso: `PetscDeviceContextSetStreamType()`, `PetscDeviceContextGetStreamType()` 310030f984aSJacob Faibussowitsch E*/ 311030f984aSJacob Faibussowitsch typedef enum { 312a4af0ceeSJacob Faibussowitsch PETSC_STREAM_GLOBAL_BLOCKING, 313a4af0ceeSJacob Faibussowitsch PETSC_STREAM_DEFAULT_BLOCKING, 314a4af0ceeSJacob Faibussowitsch PETSC_STREAM_GLOBAL_NONBLOCKING, 315a4af0ceeSJacob Faibussowitsch PETSC_STREAM_MAX 316030f984aSJacob Faibussowitsch } PetscStreamType; 317030f984aSJacob Faibussowitsch PETSC_EXTERN const char *const PetscStreamTypes[]; 318030f984aSJacob Faibussowitsch 319030f984aSJacob Faibussowitsch /*E 3200e6b6b59SJacob Faibussowitsch PetscDeviceContextJoinMode - Describes the type of join operation to perform in 3210e6b6b59SJacob Faibussowitsch `PetscDeviceContextJoin()` 322030f984aSJacob Faibussowitsch 32316a05f60SBarry Smith Values: 32416a05f60SBarry Smith + `PETSC_DEVICE_CONTEXT_JOIN_DESTROY` - Destroy all incoming sub-contexts after join. 32516a05f60SBarry Smith . `PETSC_DEVICE_CONTEXT_JOIN_SYNC` - Synchronize incoming sub-contexts after join. 32616a05f60SBarry Smith - `PETSC_DEVICE_CONTEXT_JOIN_NO_SYNC` - Do not synchronize incoming sub-contexts after join. 327030f984aSJacob Faibussowitsch 328030f984aSJacob Faibussowitsch Level: beginner 329030f984aSJacob Faibussowitsch 330db781477SPatrick Sanan .seealso: `PetscDeviceContext`, `PetscDeviceContextFork()`, `PetscDeviceContextJoin()` 331030f984aSJacob Faibussowitsch E*/ 332030f984aSJacob Faibussowitsch typedef enum { 333030f984aSJacob Faibussowitsch PETSC_DEVICE_CONTEXT_JOIN_DESTROY, 334030f984aSJacob Faibussowitsch PETSC_DEVICE_CONTEXT_JOIN_SYNC, 335030f984aSJacob Faibussowitsch PETSC_DEVICE_CONTEXT_JOIN_NO_SYNC 336030f984aSJacob Faibussowitsch } PetscDeviceContextJoinMode; 337030f984aSJacob Faibussowitsch PETSC_EXTERN const char *const PetscDeviceContextJoinModes[]; 338030f984aSJacob Faibussowitsch 339030f984aSJacob Faibussowitsch /*S 3400e6b6b59SJacob Faibussowitsch PetscDeviceContext - Container to manage stream dependencies and the various solver handles 3410e6b6b59SJacob Faibussowitsch for asynchronous device compute. 342030f984aSJacob Faibussowitsch 343030f984aSJacob Faibussowitsch Level: beginner 344030f984aSJacob Faibussowitsch 3450e6b6b59SJacob Faibussowitsch .seealso: `PetscDevice`, `PetscDeviceContextCreate()`, `PetscDeviceContextSetDevice()`, 3460e6b6b59SJacob Faibussowitsch `PetscDeviceContextDestroy()`, `PetscDeviceContextFork()`, `PetscDeviceContextJoin()` 347030f984aSJacob Faibussowitsch S*/ 3480e6b6b59SJacob Faibussowitsch typedef struct _p_PetscDeviceContext *PetscDeviceContext; 3490e6b6b59SJacob Faibussowitsch 3500e6b6b59SJacob Faibussowitsch /*E 35116a05f60SBarry Smith PetscDeviceCopyMode - Describes the copy direction of a device-aware `memcpy` 3520e6b6b59SJacob Faibussowitsch 35316a05f60SBarry Smith Values: 35416a05f60SBarry Smith + `PETSC_DEVICE_COPY_HTOH` - Copy from host memory to host memory 35516a05f60SBarry Smith . `PETSC_DEVICE_COPY_DTOH` - Copy from device memory to host memory 35616a05f60SBarry Smith . `PETSC_DEVICE_COPY_HTOD` - Copy from host memory to device memory 35716a05f60SBarry Smith . `PETSC_DEVICE_COPY_DTOD` - Copy from device memory to device memory 35816a05f60SBarry Smith - `PETSC_DEVICE_COPY_AUTO` - Infer the copy direction from the pointers 3590e6b6b59SJacob Faibussowitsch 3600e6b6b59SJacob Faibussowitsch Level: beginner 3610e6b6b59SJacob Faibussowitsch 3620e6b6b59SJacob Faibussowitsch .seealso: `PetscDeviceArrayCopy()`, `PetscDeviceMemcpy()` 3630e6b6b59SJacob Faibussowitsch E*/ 3640e6b6b59SJacob Faibussowitsch typedef enum { 3650e6b6b59SJacob Faibussowitsch PETSC_DEVICE_COPY_HTOH, 3660e6b6b59SJacob Faibussowitsch PETSC_DEVICE_COPY_DTOH, 3670e6b6b59SJacob Faibussowitsch PETSC_DEVICE_COPY_HTOD, 3680e6b6b59SJacob Faibussowitsch PETSC_DEVICE_COPY_DTOD, 3690e6b6b59SJacob Faibussowitsch PETSC_DEVICE_COPY_AUTO, 3700e6b6b59SJacob Faibussowitsch } PetscDeviceCopyMode; 3710e6b6b59SJacob Faibussowitsch PETSC_EXTERN const char *const PetscDeviceCopyModes[]; 3720e6b6b59SJacob Faibussowitsch 373d71ae5a4SJacob Faibussowitsch PETSC_NODISCARD static inline PetscDeviceCopyMode PetscOffloadMaskToDeviceCopyMode(PetscOffloadMask dest, PetscOffloadMask src) 374d71ae5a4SJacob Faibussowitsch { 3750e6b6b59SJacob Faibussowitsch PetscDeviceCopyMode mode; 3760e6b6b59SJacob Faibussowitsch 3770e6b6b59SJacob Faibussowitsch PetscFunctionBegin; 3780e6b6b59SJacob Faibussowitsch PetscAssertAbort(dest != PETSC_OFFLOAD_UNALLOCATED, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Cannot copy to unallocated"); 3790e6b6b59SJacob Faibussowitsch PetscAssertAbort(src != PETSC_OFFLOAD_UNALLOCATED, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Cannot copy from unallocated"); 3800e6b6b59SJacob Faibussowitsch 3810e6b6b59SJacob Faibussowitsch if (PetscOffloadDevice(dest)) { 3820e6b6b59SJacob Faibussowitsch mode = PetscOffloadHost(src) ? PETSC_DEVICE_COPY_HTOD : PETSC_DEVICE_COPY_DTOD; 3830e6b6b59SJacob Faibussowitsch } else { 3840e6b6b59SJacob Faibussowitsch mode = PetscOffloadHost(src) ? PETSC_DEVICE_COPY_HTOH : PETSC_DEVICE_COPY_DTOH; 3850e6b6b59SJacob Faibussowitsch } 3860e6b6b59SJacob Faibussowitsch PetscFunctionReturn(mode); 3870e6b6b59SJacob Faibussowitsch } 3880e6b6b59SJacob Faibussowitsch 389d71ae5a4SJacob Faibussowitsch PETSC_NODISCARD static inline PETSC_CONSTEXPR_14 PetscDeviceCopyMode PetscMemTypeToDeviceCopyMode(PetscMemType dest, PetscMemType src) 390d71ae5a4SJacob Faibussowitsch { 3910e6b6b59SJacob Faibussowitsch if (PetscMemTypeHost(dest)) { 3920e6b6b59SJacob Faibussowitsch return PetscMemTypeHost(src) ? PETSC_DEVICE_COPY_HTOH : PETSC_DEVICE_COPY_DTOH; 3930e6b6b59SJacob Faibussowitsch } else { 3940e6b6b59SJacob Faibussowitsch return PetscMemTypeDevice(src) ? PETSC_DEVICE_COPY_DTOD : PETSC_DEVICE_COPY_HTOD; 3950e6b6b59SJacob Faibussowitsch } 3960e6b6b59SJacob Faibussowitsch } 3970e6b6b59SJacob Faibussowitsch 3980e6b6b59SJacob Faibussowitsch /*E 3990e6b6b59SJacob Faibussowitsch PetscMemoryAccessMode - Describes the intended usage of a memory region 4000e6b6b59SJacob Faibussowitsch 40116a05f60SBarry Smith Values: 40216a05f60SBarry Smith + `PETSC_MEMORY_ACCESS_READ` - Read only 40316a05f60SBarry Smith . `PETSC_MEMORY_ACCESS_WRITE` - Write only 40416a05f60SBarry Smith - `PETSC_MEMORY_ACCESS_READ_WRITE` - Read and write 40516a05f60SBarry Smith 40616a05f60SBarry Smith Level: beginner 4070e6b6b59SJacob Faibussowitsch 4080e6b6b59SJacob Faibussowitsch Notes: 4090e6b6b59SJacob Faibussowitsch This `enum` is a bitmask with the following encoding (assuming 2 bit)\: 4100e6b6b59SJacob Faibussowitsch 4110e6b6b59SJacob Faibussowitsch .vb 4120e6b6b59SJacob Faibussowitsch PETSC_MEMORY_ACCESS_READ = 0b01 4130e6b6b59SJacob Faibussowitsch PETSC_MEMORY_ACCESS_WRITE = 0b10 4140e6b6b59SJacob Faibussowitsch PETSC_MEMORY_ACCESS_READ_WRITE = 0b11 4150e6b6b59SJacob Faibussowitsch 4160e6b6b59SJacob Faibussowitsch // consequently 4170e6b6b59SJacob Faibussowitsch PETSC_MEMORY_ACCESS_READ | PETSC_MEMORY_ACCESS_WRITE = PETSC_MEMORY_ACCESS_READ_WRITE 4180e6b6b59SJacob Faibussowitsch .ve 4190e6b6b59SJacob Faibussowitsch 420aaa8cc7dSPierre Jolivet The following convenience macros are also provided\: 4210e6b6b59SJacob Faibussowitsch 42216a05f60SBarry Smith + `PetscMemoryAccessRead(mode)` - `true` if `mode` is any kind of read, `false` otherwise 42316a05f60SBarry Smith - `PetscMemoryAccessWrite(mode)` - `true` if `mode` is any kind of write, `false` otherwise 4240e6b6b59SJacob Faibussowitsch 4250e6b6b59SJacob Faibussowitsch Developer Notes: 4260e6b6b59SJacob Faibussowitsch This enum uses a function (`PetscMemoryAccessModeToString()`) to convert values to string 4270e6b6b59SJacob Faibussowitsch representation, so cannot be used in `PetscOptionsEnum()`. 4280e6b6b59SJacob Faibussowitsch 4290e6b6b59SJacob Faibussowitsch .seealso: `PetscMemoryAccessModeToString()`, `PetscDevice`, `PetscDeviceContext` 4300e6b6b59SJacob Faibussowitsch E*/ 4310e6b6b59SJacob Faibussowitsch typedef enum { 4320e6b6b59SJacob Faibussowitsch PETSC_MEMORY_ACCESS_READ = 0x1, // 01 4330e6b6b59SJacob Faibussowitsch PETSC_MEMORY_ACCESS_WRITE = 0x2, // 10 4340e6b6b59SJacob Faibussowitsch PETSC_MEMORY_ACCESS_READ_WRITE = 0x3, // 11 4350e6b6b59SJacob Faibussowitsch } PetscMemoryAccessMode; 4360e6b6b59SJacob Faibussowitsch 4370e6b6b59SJacob Faibussowitsch #define PetscMemoryAccessRead(m) (((m)&PETSC_MEMORY_ACCESS_READ) == PETSC_MEMORY_ACCESS_READ) 4380e6b6b59SJacob Faibussowitsch #define PetscMemoryAccessWrite(m) (((m)&PETSC_MEMORY_ACCESS_WRITE) == PETSC_MEMORY_ACCESS_WRITE) 4390e6b6b59SJacob Faibussowitsch 4400e6b6b59SJacob Faibussowitsch #if defined(__cplusplus) 4410e6b6b59SJacob Faibussowitsch #if PETSC_SHOULD_SILENCE_GCC_TAUTOLOGICAL_COMPARE_WARNING 4420e6b6b59SJacob Faibussowitsch #pragma GCC diagnostic push 4430e6b6b59SJacob Faibussowitsch #pragma GCC diagnostic ignored "-Wtautological-compare" 4440e6b6b59SJacob Faibussowitsch #endif 4450e6b6b59SJacob Faibussowitsch static_assert(PetscMemoryAccessRead(PETSC_MEMORY_ACCESS_READ), ""); 4460e6b6b59SJacob Faibussowitsch static_assert(PetscMemoryAccessRead(PETSC_MEMORY_ACCESS_READ_WRITE), ""); 4470e6b6b59SJacob Faibussowitsch static_assert(!PetscMemoryAccessRead(PETSC_MEMORY_ACCESS_WRITE), ""); 4480e6b6b59SJacob Faibussowitsch static_assert(PetscMemoryAccessWrite(PETSC_MEMORY_ACCESS_WRITE), ""); 4490e6b6b59SJacob Faibussowitsch static_assert(PetscMemoryAccessWrite(PETSC_MEMORY_ACCESS_READ_WRITE), ""); 4500e6b6b59SJacob Faibussowitsch static_assert(!PetscMemoryAccessWrite(PETSC_MEMORY_ACCESS_READ), ""); 4510e6b6b59SJacob Faibussowitsch static_assert((PETSC_MEMORY_ACCESS_READ | PETSC_MEMORY_ACCESS_WRITE) == PETSC_MEMORY_ACCESS_READ_WRITE, ""); 4520e6b6b59SJacob Faibussowitsch #if PETSC_SHOULD_SILENCE_GCC_TAUTOLOGICAL_COMPARE_WARNING 4530e6b6b59SJacob Faibussowitsch #pragma GCC diagnostic pop 4540e6b6b59SJacob Faibussowitsch #endif 4550e6b6b59SJacob Faibussowitsch #endif 4560e6b6b59SJacob Faibussowitsch 457d71ae5a4SJacob Faibussowitsch PETSC_NODISCARD static inline PETSC_CONSTEXPR_14 const char *PetscMemoryAccessModeToString(PetscMemoryAccessMode mode) 458d71ae5a4SJacob Faibussowitsch { 4590e6b6b59SJacob Faibussowitsch #define PETSC_CASE_RETURN(v) \ 460d71ae5a4SJacob Faibussowitsch case v: \ 461d71ae5a4SJacob Faibussowitsch return PetscStringize(v) 4620e6b6b59SJacob Faibussowitsch 4630e6b6b59SJacob Faibussowitsch switch (mode) { 4640e6b6b59SJacob Faibussowitsch PETSC_CASE_RETURN(PETSC_MEMORY_ACCESS_READ); 4650e6b6b59SJacob Faibussowitsch PETSC_CASE_RETURN(PETSC_MEMORY_ACCESS_WRITE); 4660e6b6b59SJacob Faibussowitsch PETSC_CASE_RETURN(PETSC_MEMORY_ACCESS_READ_WRITE); 4670e6b6b59SJacob Faibussowitsch } 4680e6b6b59SJacob Faibussowitsch PetscUnreachable(); 4690e6b6b59SJacob Faibussowitsch return "invalid"; 4700e6b6b59SJacob Faibussowitsch #undef PETSC_CASE_RETURN 4710e6b6b59SJacob Faibussowitsch } 4720e6b6b59SJacob Faibussowitsch 4730e6b6b59SJacob Faibussowitsch #undef PETSC_SHOULD_SILENCE_GCC_TAUTOLOGICAL_COMPARE_WARNING 474