-
Notifications
You must be signed in to change notification settings - Fork 4
/
fam_context_open.html
211 lines (199 loc) · 8.45 KB
/
fam_context_open.html
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
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
<!DOCTYPE html>
<html lang="en">
<head>
<link rel="stylesheet" type="text/css" href="styles/style.css">
<title>OpenFAM: A library for programming Fabric-Attached Memory</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
</head>
<body>
<header>
<h1>OpenFAM Reference Implementation</h1>
</header>
<section>
<nav>
<ul>
<li><a href="index.html">Home</a></li>
<li><a href="release_notes.html">Release Notes</a></li>
<li><a href="limitations.html">Design Choices</a></li>
<li><a href="errors.html">Exceptions and Error Codes</a></li>
<li><a href="services.html">Services</a></li>
<li><a href="config_files.html">Configuration Files</a></li>
</ul>
<hr>
Initialization and Finalization
<ul>
<li><a href="fam_initialize.html">fam_initialize</a></li>
<li><a href="fam_finalize.html">fam_finalize</a></li>
<li><a href="fam_abort.html">fam_abort</a></li>
</ul>
<hr>
Options & Query
<ul>
<li><a href="fam_list_options.html">fam_list_options</a></li>
<li><a href="fam_get_option.html">fam_get_option</a></li>
<li><a href="fam_lookup.html">fam_lookup</a></li>
<li><a href="fam_stat.html">fam_stat</a></li>
</ul>
<hr>
Memory Allocation
<ul>
<li><a href="fam_create_region.html">fam_create_region</a></li>
<li><a href="fam_destroy_region.html">fam_destroy_region</a></li>
<li><a href="fam_resize_region.html">fam_resize_region</a></li>
<li><a href="fam_allocate.html">fam_allocate</a></li>
<li><a href="fam_deallocate.html">fam_deallocate</a></li>
<li><a href="fam_change_permissions.html">fam_change_permissions</a></li>
<li><a href="fam_close.html">fam_close</a></li>
</ul>
<hr>
Memory Map
<ul>
<li><a href="fam_map.html">fam_map</a></li>
<li><a href="fam_unmap.html">fam_unmap</a></li>
</ul>
<hr>
Data Path Operations
<ul>
<li><a href="fam_get.html">fam_get</a></li>
<li><a href="fam_put.html">fam_put</a></li>
<li><a href="fam_gather.html">fam_gather</a></li>
<li><a href="fam_scatter.html">fam_scatter</a></li>
<li><a href="fam_copy.html">fam_copy</a></li>
<li><a href="fam_copy_wait.html">fam_copy_wait</a></li>
<li><a href="fam_backup.html">fam_backup</a></li>
<li><a href="fam_backup_wait.html">fam_backup_wait</a></li>
<li><a href="fam_restore.html">fam_restore</a></li>
<li><a href="fam_restore_wait.html">fam_restore_wait</a></li>
<li><a href="fam_delete_backup.html">fam_delete_backup</a></li>
<li><a href="fam_delete_backup_wait.html">fam_delete_backup_wait</a></li>
</ul>
<hr>
Atomics
<ul>
<li><a href="fam_set.html">fam_set</a></li>
<li><a href="fam_add.html">fam_add</a></li>
<li><a href="fam_subtract.html">fam_subtract</a></li>
<li><a href="fam_min.html">fam_min</a></li>
<li><a href="fam_max.html">fam_max</a></li>
<li><a href="fam_and.html">fam_and</a></li>
<li><a href="fam_or.html">fam_or</a></li>
<li><a href="fam_xor.html">fam_xor</a></li>
<li><a href="fam_fetch_TYPE.html">fam_fetch_TYPE</a></li>
<li><a href="fam_swap.html">fam_swap</a></li>
<li><a href="fam_compare_swap.html">fam_compare_swap</a></li>
<li><a href="fam_fetch_add.html">fam_fetch_add</a></li>
<li><a href="fam_fetch_subtract.html">fam_fetch_subtract</a></li>
<li><a href="fam_fetch_min.html">fam_fetch_min</a></li>
<li><a href="fam_fetch_and.html">fam_fetch_and</a></li>
<li><a href="fam_fetch_max.html">fam_fetch_max</a></li>
<li><a href="fam_fetch_or.html">fam_fetch_or</a></li>
<li><a href="fam_fetch_xor.html">fam_fetch_xor</a></li>
</ul>
<hr>
Ordering
<ul>
<li><a href="fam_barrier_all.html">fam_barrier_all</a></li>
<li><a href="fam_fence.html">fam_fence</a></li>
<li><a href="fam_quiet.html">fam_quiet</a></li>
<li><a href="fam_progress.html">fam_progress</a></li>
<li><a href="fam_context_open.html">fam_context_open</a></li>
<li><a href="fam_context_close.html">fam_context_close</a></li>
</ul>
<hr>
</nav>
<article>
<h1 class="code">openfam::fam::fam_context_open</h1>
<p>Returns a user specific fam_context object. </p>
<h2>Synopsis</h2>
<p class="code">fam_ctx * fam_context_open(void);</p>
<h2>Description</h2>
<p>This method call returns a user specific fam_ctx object.
Non-blocking calls from the context are grouped together for completion, and a fam_quiet invoked from it
only enforces completion of all operations invoked from that context.
Applications can use both fam_ctx object and fam objects;
However, OpenFAM APIs invoked from these objects are tracked separately,
and unlike the fam object, context objects only support the data path, atomic and few ordering APIs in OpenFAM.</p>
<h2>Input Arguments</h2>
<p>None.</p>
<h2>Return Values</h2>
<p>fam_ctx* returns a user specific fam_ctx object.Throws <code>Fam_Exception</code> on error.</p>
<h2>Fam Error Numbers</h2>
<table>
<tbody>
<tr><th>Error</th><th>Description</th></tr>
<tr><td class="code">FAM_ERR_NOPERM</td><td>Caller does not have access rights</td></tr>
<tr><td class="code">FAM_ERR_LIBFABRIC</td><td>Libfabric error occurred.</td></tr>
<tr><td class="code">FAM_ERR_RPC</td><td>Communication error from grpc layer.</td></tr>
<tr><td class="code">FAM_ERR_RPC_CLIENT_NOTFOUND</td><td>RPC service not available.</td></tr>
<tr><td class="code">FAM_ERR_TIMEOUT</td><td>Number of libfabric retry count reached.</td></tr>
</tbody>
</table>
<h2>Notes</h2>
<p>An application can invoke data path, atomic and few ordering APIs using the fam_ctx object returned by fam_context_open API.</p>
<p>List of APIs supported by context objects are as follows:</p>
<ul>
<li><b>DataPath Operations</b>
<ul>
<li>fam_put/fam_get (blocking and non-blocking calls).</li>
<li>fam_scatter/fam_gather (blocking and non-blocking calls).</li>
<li>fam_copy/fam_backup/restore operations.</li>
</li></br>
</ul>
<li><b>Atomic Operations</b>
<ul>
<li> Fetch based operations like fam_fetch_and, fam_fetch_or, fam_fetch_xor, fam_fetch_add, fam_fetch_subtract, fam_fetch_min, fam_fetch_max, fam_compare_swap, fam_fetch_TYPE where TYPE may be int32_t/uint32_t/int64_t/uint64_t/float/double/int128_t. </li>
<li> Non-fetch based operations like fam_set, fam_and, fam_or, fam_xor, fam_add, fam_subtract, fam_min, fam_max, fam_swap</li>
</li></br>
</ul>
<li><b>Ordering Operations</b>
<ul>
<li>fam_barrier_all</li>
<li>fam_fence</li>
<li>fam_quiet</li>
<li>fam_progress</li>
<li>fam_context_open</li>
<li>fam_context_close</li>
</ul>
<h2>Example</h2>
<pre>
#include <string.h>
#include <fam/fam.h>
#include <fam/fam_exception.h>
using namespace std;
using namespace openfam;
int main(void) {
fam *myFam = new fam();
// ... Initialization code here
try {
// look up the descriptor to a previously allocated data item
// (a 50-element integer array)
Fam_Descriptor *descriptor = myFam->fam_lookup("myItem", "myRegion");
// local data
uint64_t *local;
uint64_t *local2;
// look up the descriptor to a previously allocated completion flag
Fam_Descriptor *descriptor = myFam->fam_lookup("fam_context", "myRegion");
// Create a fam_context to enable separate tracking of completion for non-blocking calls.
fam_context *myFamCtx = myFam->fam_context_open();
myFamCtx->fam_get_nonblocking(local, descriptor, 6*sizeof(int),10*sizeof(int));
myFamCtx->fam_get_nonblocking(local2, descriptor, 26*sizeof(int),10*sizeof(int));
// The quiet call on myFamCtx only waits for completion of calls from that context,
// but not others made using the myFam object.
myFamCtx->fam_quiet();
// Close fam_context now to free resources underneath.
myFam->fam_context_close(myFamCtx);
// ... subsequent code here
} catch (Fam_Exception &e) {
printf("fam API failed: %d: %s\n", e.fam_error(), e.fam_error_msg());
}
// ... Finalization code follows
}
</pre>
</article>
</section>
<footer>
<p>Copyright 2022-23, Hewlett Packard Enterprise Development Co, LLP</p>
</footer>
</body>
</html>