File: win.h

package info (click to toggle)
openmpi 5.0.7-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 202,312 kB
  • sloc: ansic: 612,441; makefile: 42,495; sh: 11,230; javascript: 9,244; f90: 7,052; java: 6,404; perl: 5,154; python: 1,856; lex: 740; fortran: 61; cpp: 20; tcl: 12
file content (180 lines) | stat: -rw-r--r-- 6,112 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil -*- */
/*
 * Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana
 *                         University Research and Technology
 *                         Corporation.  All rights reserved.
 * Copyright (c) 2004-2007 The University of Tennessee and The University
 *                         of Tennessee Research Foundation.  All rights
 *                         reserved.
 * Copyright (c) 2004-2005 High Performance Computing Center Stuttgart,
 *                         University of Stuttgart.  All rights reserved.
 * Copyright (c) 2004-2005 The Regents of the University of California.
 *                         All rights reserved.
 * Copyright (c) 2006-2017 Cisco Systems, Inc.  All rights reserved
 * Copyright (c) 2009      Sun Microsystems, Inc.  All rights reserved.
 * Copyright (c) 2013-2015 Los Alamos National Security, LLC.  All rights
 *                         reserved.
 * Copyright (c) 2016-2017 IBM Corporation. All rights reserved.
 * Copyright (c) 2018      Triad National Security, LLC. All rights
 *                         reserved.
 * $COPYRIGHT$
 *
 * Additional copyrights may follow
 *
 * $HEADER$
 */

#ifndef OMPI_WIN_H
#define OMPI_WIN_H

#include "ompi_config.h"
#include "mpi.h"

#include "opal/class/opal_object.h"
#include "opal/class/opal_hash_table.h"
#include "opal/util/info_subscriber.h"
#include "ompi/errhandler/errhandler.h"
#include "ompi/info/info.h"
#include "ompi/communicator/communicator.h"
#include "ompi/group/group.h"
#include "ompi/mca/osc/osc.h"

BEGIN_C_DECLS

/* flags */
#define OMPI_WIN_FREED        0x00000001
#define OMPI_WIN_INVALID      0x00000002
#define OMPI_WIN_NO_LOCKS     0x00000004
#define OMPI_WIN_SAME_DISP    0x00000008
#define OMPI_WIN_SAME_SIZE    0x00000010

enum ompi_win_accumulate_ops_t {
    OMPI_WIN_ACCUMULATE_OPS_SAME_OP_NO_OP,
    OMPI_WIN_ACCUMULATE_OPS_SAME_OP,
};
typedef enum ompi_win_accumulate_ops_t ompi_win_accumulate_ops_t;

/**
 * Accumulate ordering flags. The default accumulate ordering in
 * MPI-3.1 is rar,war,raw,waw.
 */
enum ompi_win_accumulate_order_flags_t {
    /** no accumulate ordering (may valid with any other flag) */
    OMPI_WIN_ACC_ORDER_NONE = 0x01,
    /** read-after-read ordering */
    OMPI_WIN_ACC_ORDER_RAR  = 0x02,
    /** write-after-read ordering */
    OMPI_WIN_ACC_ORDER_WAR  = 0x04,
    /** read-after-write ordering */
    OMPI_WIN_ACC_ORDER_RAW  = 0x08,
    /** write-after-write ordering */
    OMPI_WIN_ACC_ORDER_WAW  = 0x10,
};

OMPI_DECLSPEC extern mca_base_var_enum_t *ompi_win_accumulate_ops;
OMPI_DECLSPEC extern mca_base_var_enum_flag_t *ompi_win_accumulate_order;

OMPI_DECLSPEC extern opal_pointer_array_t ompi_mpi_windows;

struct ompi_win_t {
    opal_infosubscriber_t super;

    opal_mutex_t  w_lock;

    char w_name[MPI_MAX_OBJECT_NAME];
  
    /* Group associated with this window. */
    ompi_group_t *w_group;

    /* Information about the state of the window.  */
    uint16_t w_flags;

    /** Window flavor */
    uint16_t w_flavor;

    /** Accumulate ops */
    ompi_win_accumulate_ops_t w_acc_ops;

    /* Attributes */
    opal_hash_table_t *w_keyhash;

    /* index in Fortran <-> C translation array */
    int w_f_to_c_index;

    /* Error handling.  This field does not have the "w_" prefix so
       that the OMPI_ERRHDL_* macros can find it, regardless of
       whether it's a comm, window, or file. */
    ompi_errhandler_t                    *error_handler;
    ompi_errhandler_type_t               errhandler_type;

    /* one sided interface */
    ompi_osc_base_module_t *w_osc_module;

    /** Accumulate ordering (see ompi_win_accumulate_order_flags_t above) */
    int32_t w_acc_order;
};
typedef struct ompi_win_t ompi_win_t;
OMPI_DECLSPEC OBJ_CLASS_DECLARATION(ompi_win_t);

/**
 * Padded struct to maintain back compatibility.
 * See ompi/communicator/communicator.h comments with struct ompi_communicator_t
 * for full explanation why we chose the following padding construct for predefines.
 */
#define PREDEFINED_WIN_PAD 512

struct ompi_predefined_win_t {
    struct ompi_win_t win;
    char padding[PREDEFINED_WIN_PAD - sizeof(ompi_win_t)];
};
typedef struct ompi_predefined_win_t ompi_predefined_win_t;

OMPI_DECLSPEC extern ompi_predefined_win_t ompi_mpi_win_null;
OMPI_DECLSPEC extern ompi_predefined_win_t *ompi_mpi_win_null_addr;

int ompi_win_init(void);

int ompi_win_create(void *base, size_t size, int disp_unit,
                    ompi_communicator_t *comm, opal_info_t *info,
                    ompi_win_t **newwin);
int ompi_win_allocate(size_t size, int disp_unit, opal_info_t *info,
                      ompi_communicator_t *comm, void *baseptr, ompi_win_t **newwin);
int ompi_win_allocate_shared(size_t size, int disp_unit, opal_info_t *info,
                      ompi_communicator_t *comm, void *baseptr, ompi_win_t **newwin);
int ompi_win_create_dynamic(opal_info_t *info, ompi_communicator_t *comm, ompi_win_t **newwin);
int ompi_win_free(ompi_win_t *win);

OMPI_DECLSPEC int ompi_win_set_name(ompi_win_t *win, const char *win_name);
OMPI_DECLSPEC int ompi_win_get_name(ompi_win_t *win, char *win_name, int *length);

OMPI_DECLSPEC int ompi_win_group(ompi_win_t *win, ompi_group_t **group);

/* Note that the definition of an "invalid" window is closely related
   to the definition of an "invalid" communicator.  See a big comment
   in ompi/communicator/communicator.h about this. */
static inline int ompi_win_invalid(ompi_win_t *win) {
    if (NULL == win ||
        MPI_WIN_NULL == win ||
        (OMPI_WIN_INVALID & win->w_flags) ||
        (OMPI_WIN_FREED & win->w_flags)) {
        return true;
    } else {
        return false;
    }
}

static inline int ompi_win_peer_invalid(ompi_win_t *win, int peer) {
    if (win->w_group->grp_proc_count <= peer || peer < 0) return true;
    return false;
}

static inline int ompi_win_rank(ompi_win_t *win) {
    return win->w_group->grp_my_rank;
}

static inline bool ompi_win_allow_locks(ompi_win_t *win) {
    return (0 == (win->w_flags & OMPI_WIN_NO_LOCKS));
}

END_C_DECLS
#endif