xref: /petsc/src/sys/objects/device/tests/ex1.c (revision 5f80ce2ab25dff0f4601e710601cbbcecf323266)
1a4af0ceeSJacob Faibussowitsch static const char help[] = "Tests creation and destruction of PetscDevice.\n\n";
2a4af0ceeSJacob Faibussowitsch 
3a4af0ceeSJacob Faibussowitsch #include <petsc/private/deviceimpl.h>
4a4af0ceeSJacob Faibussowitsch #include "petscdevicetestcommon.h"
5a4af0ceeSJacob Faibussowitsch 
6a4af0ceeSJacob Faibussowitsch int main(int argc, char *argv[])
7a4af0ceeSJacob Faibussowitsch {
8a4af0ceeSJacob Faibussowitsch   const PetscInt n = 10;
9a4af0ceeSJacob Faibussowitsch   PetscDevice    device = NULL;
10a4af0ceeSJacob Faibussowitsch   PetscDevice    devices[n];
11a4af0ceeSJacob Faibussowitsch   PetscErrorCode ierr;
12a4af0ceeSJacob Faibussowitsch 
13a4af0ceeSJacob Faibussowitsch   ierr = PetscInitialize(&argc,&argv,NULL,help);if (ierr) return ierr;
14a4af0ceeSJacob Faibussowitsch 
15a4af0ceeSJacob Faibussowitsch   /* normal create and destroy */
16*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscDeviceCreate(PETSC_DEVICE_DEFAULT,PETSC_DECIDE,&device));
17*5f80ce2aSJacob Faibussowitsch   CHKERRQ(AssertDeviceExists(device));
18*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscDeviceDestroy(&device));
19*5f80ce2aSJacob Faibussowitsch   CHKERRQ(AssertDeviceDoesNotExist(device));
20a4af0ceeSJacob Faibussowitsch   /* should not destroy twice */
21*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscDeviceDestroy(&device));
22*5f80ce2aSJacob Faibussowitsch   CHKERRQ(AssertDeviceDoesNotExist(device));
23a4af0ceeSJacob Faibussowitsch 
24a4af0ceeSJacob Faibussowitsch   /* test reference counting */
25a4af0ceeSJacob Faibussowitsch   device = NULL;
26*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscArrayzero(devices,n));
27*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscDeviceCreate(PETSC_DEVICE_DEFAULT,PETSC_DECIDE,&device));
28*5f80ce2aSJacob Faibussowitsch   CHKERRQ(AssertDeviceExists(device));
29a4af0ceeSJacob Faibussowitsch   for (int i = 0; i < n; ++i) {
30*5f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscDeviceReference_Internal(device));
31a4af0ceeSJacob Faibussowitsch     devices[i] = device;
32a4af0ceeSJacob Faibussowitsch   }
33*5f80ce2aSJacob Faibussowitsch   CHKERRQ(AssertDeviceExists(device));
34a4af0ceeSJacob Faibussowitsch   for (int i = 0; i < n; ++i) {
35*5f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscDeviceDestroy(&devices[i]));
36*5f80ce2aSJacob Faibussowitsch     CHKERRQ(AssertDeviceExists(device));
37*5f80ce2aSJacob Faibussowitsch     CHKERRQ(AssertDeviceDoesNotExist(devices[i]));
38a4af0ceeSJacob Faibussowitsch   }
39*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscDeviceDestroy(&device));
40*5f80ce2aSJacob Faibussowitsch   CHKERRQ(AssertDeviceDoesNotExist(device));
41a4af0ceeSJacob Faibussowitsch 
42a4af0ceeSJacob Faibussowitsch   /* test the default devices exist */
43a4af0ceeSJacob Faibussowitsch   device = NULL;
44*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscArrayzero(devices,n));
45a4af0ceeSJacob Faibussowitsch   {
46a4af0ceeSJacob Faibussowitsch     PetscDeviceContext dctx;
47a4af0ceeSJacob Faibussowitsch     /* global context will have the default device */
48*5f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscDeviceContextGetCurrentContext(&dctx));
49*5f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscDeviceContextGetDevice(dctx,&device));
50a4af0ceeSJacob Faibussowitsch   }
51*5f80ce2aSJacob Faibussowitsch   CHKERRQ(AssertDeviceExists(device));
52a4af0ceeSJacob Faibussowitsch   /* test reference counting for default device */
53a4af0ceeSJacob Faibussowitsch   for (int i = 0; i < n; ++i) {
54*5f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscDeviceReference_Internal(device));
55a4af0ceeSJacob Faibussowitsch     devices[i] = device;
56a4af0ceeSJacob Faibussowitsch   }
57*5f80ce2aSJacob Faibussowitsch   CHKERRQ(AssertDeviceExists(device));
58a4af0ceeSJacob Faibussowitsch   for (int i = 0; i < n; ++i) {
59*5f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscDeviceDestroy(&devices[i]));
60*5f80ce2aSJacob Faibussowitsch     CHKERRQ(AssertDeviceExists(device));
61*5f80ce2aSJacob Faibussowitsch     CHKERRQ(AssertDeviceDoesNotExist(devices[i]));
62a4af0ceeSJacob Faibussowitsch   }
63a4af0ceeSJacob Faibussowitsch 
64*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscPrintf(PETSC_COMM_WORLD,"EXIT_SUCCESS\n"));
65a4af0ceeSJacob Faibussowitsch   ierr = PetscFinalize();
66a4af0ceeSJacob Faibussowitsch   return ierr;
67a4af0ceeSJacob Faibussowitsch }
68a4af0ceeSJacob Faibussowitsch 
69a4af0ceeSJacob Faibussowitsch /*TEST
70a4af0ceeSJacob Faibussowitsch 
71a4af0ceeSJacob Faibussowitsch  build:
72cb9b7bb0SJacob Faibussowitsch    requires: defined(PETSC_HAVE_CXX)
73a4af0ceeSJacob Faibussowitsch 
74a4af0ceeSJacob Faibussowitsch  testset:
756ab378d1SJacob Faibussowitsch    TODO: broken in ci
76a4af0ceeSJacob Faibussowitsch    requires: !device
77a4af0ceeSJacob Faibussowitsch    suffix: no_device
78a4af0ceeSJacob Faibussowitsch    filter: Error: grep -E -o -e ".*No support for this operation for this object type" -e ".*PETSc is not configured with device support.*" -e "^\[0\]PETSC ERROR:.*[0-9]{1} [A-z]+\(\)"
79a4af0ceeSJacob Faibussowitsch    test:
80a4af0ceeSJacob Faibussowitsch      requires: debug
81a4af0ceeSJacob Faibussowitsch      suffix:   debug
82a4af0ceeSJacob Faibussowitsch    test:
83a4af0ceeSJacob Faibussowitsch      requires: !debug
84a4af0ceeSJacob Faibussowitsch      suffix:   opt
85a4af0ceeSJacob Faibussowitsch 
86a4af0ceeSJacob Faibussowitsch  testset:
87a4af0ceeSJacob Faibussowitsch    output_file: ./output/ExitSuccess.out
88a4af0ceeSJacob Faibussowitsch    nsize: {{1 2 5}}
89a4af0ceeSJacob Faibussowitsch    test:
90a4af0ceeSJacob Faibussowitsch      requires: cuda
91a4af0ceeSJacob Faibussowitsch      suffix: cuda
92a4af0ceeSJacob Faibussowitsch    test:
93a4af0ceeSJacob Faibussowitsch      requires: hip
94a4af0ceeSJacob Faibussowitsch      suffix: hip
95a2158755SJunchao Zhang    test:
96a2158755SJunchao Zhang      requires: sycl
97a2158755SJunchao Zhang      suffix: sycl
98a4af0ceeSJacob Faibussowitsch 
99a4af0ceeSJacob Faibussowitsch TEST*/
100