xref: /petsc/src/sys/utils/memc.c (revision 6dd63270497ad23dcf16ae500a87ff2b2a0b7474)
1 /*
2     We define the memory operations here. The reason we just do not use
3   the standard memory routines in the PETSc code is that on some machines
4   they are broken.
5 
6 */
7 #include <petsc/private/petscimpl.h> /*I  "petscsys.h"   I*/
8 #include <petscviewer.h>
9 #include <../src/sys/utils/ftn-kernels/fcopy.h>
10 
11 /*@
12   PetscMemcmp - Compares two byte streams in memory.
13 
14   Not Collective
15 
16   Input Parameters:
17 + str1 - Pointer to the first byte stream
18 . str2 - Pointer to the second byte stream
19 - len  - The length of the byte stream
20          (both str1 and str2 are assumed to be of length len)
21 
22   Output Parameter:
23 . e - `PETSC_TRUE` if equal else `PETSC_FALSE`.
24 
25   Level: intermediate
26 
27   Notes:
28   `PetscArraycmp()` is preferred
29 
30   This routine is analogous to `memcmp()` with additional error checking
31 
32 .seealso: `PetscMemcpy()`, `PetscArrayzero()`, `PetscMemzero()`, `PetscArraycmp()`, `PetscArraycpy()`, `PetscStrallocpy()`,
33           `PetscArraymove()`
34 @*/
35 PetscErrorCode PetscMemcmp(const void *str1, const void *str2, size_t len, PetscBool *e)
36 {
37   if (!len) {
38     // if e is a bad ptr I guess we just die here then?
39     *e = PETSC_TRUE;
40     return PETSC_SUCCESS;
41   }
42 
43   PetscFunctionBegin;
44   PetscAssertPointer(str1, 1);
45   PetscAssertPointer(str2, 2);
46   PetscAssertPointer(e, 4);
47   *e = memcmp((char *)str1, (char *)str2, len) ? PETSC_FALSE : PETSC_TRUE;
48   PetscFunctionReturn(PETSC_SUCCESS);
49 }
50 
51 #if defined(PETSC_HAVE_HWLOC)
52   #include <petsc/private/petscimpl.h>
53   #include <hwloc.h>
54 #endif
55 
56 /*@
57   PetscProcessPlacementView - display the MPI rank placement by core
58 
59   Input Parameter:
60 . viewer - `PETSCVIEWERASCII` to display the results on
61 
62   Level: intermediate
63 
64   Note:
65   Requires that PETSc be installed with hwloc, for example using `--download-hwloc`
66 
67 .seealso: `PetscInitialize()`
68 @*/
69 PetscErrorCode PetscProcessPlacementView(PetscViewer viewer)
70 {
71 #if defined(PETSC_HAVE_HWLOC)
72   PetscBool        isascii;
73   PetscMPIInt      rank;
74   hwloc_bitmap_t   set;
75   hwloc_topology_t topology;
76 
77   PetscFunctionBegin;
78   PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1);
79   PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERASCII, &isascii));
80   PetscCheck(isascii, PetscObjectComm((PetscObject)viewer), PETSC_ERR_SUP, "Only ASCII viewer is supported");
81 
82   PetscCallMPI(MPI_Comm_rank(MPI_COMM_WORLD, &rank));
83   hwloc_topology_init(&topology);
84   hwloc_topology_load(topology);
85   set = hwloc_bitmap_alloc();
86 
87   PetscCallExternal(hwloc_get_proc_cpubind, topology, getpid(), set, HWLOC_CPUBIND_PROCESS);
88   PetscCall(PetscViewerASCIIPushSynchronized(viewer));
89   PetscCall(PetscViewerASCIISynchronizedPrintf(viewer, "MPI rank %d Process id: %d coreid %d\n", rank, getpid(), hwloc_bitmap_first(set)));
90   PetscCall(PetscViewerFlush(viewer));
91   hwloc_bitmap_free(set);
92   hwloc_topology_destroy(topology);
93 #else
94   PetscFunctionBegin;
95   SETERRQ(PetscObjectComm((PetscObject)viewer), PETSC_ERR_SUP, "Requires PETSc be configured with --with-hwloc or --download-hwloc");
96 #endif
97   PetscFunctionReturn(PETSC_SUCCESS);
98 }
99