openfam::fam::fam_fence
Ensures that FAM operations issued by the calling PE thread before the fence are completed before FAM operations issued after the fence are dispatched.
Synopsis
void fam_fence(void);
Description
This method orders FAM operations (put,
scatter, atomics, copy) issued by the calling PE thread before the
fence to be performed before FAM operations issued by the calling PE
thread after the fence. This method is non-blocking.
Input Arguments
None.
Return Values
None. Throws Fam_Exception on error.
Fam Error Numbers
| Error | Description |
|---|---|
| FAM_ERR_LIBFABRIC | Libfabric error occurred. |
| FAM_ERR_NOPERM | Caller does not have access rights |
Notes
Note that this method does NOT order
fam_map()-enabled load/store accesses by the processor to FAM.
Example
#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
int local[] = {0,1,2,3,4};
uint64_t indexes[] = {0, 7, 3, 5, 6};
// scatter local data in myItem[0,7,3,5,6] respectively
myFam->fam_scatter_nonblocking(local, descriptor, 5, indexes, sizeof(int));
// ensure that the scatter is performed before subsequent FAM updates
myFam->fam_fence();
// now update later elements of the array in FAM
int newLocal[] = {0,1,2,3,4,5,6,7,8,9};
// update elements 11 - 20 in FAM using values in local memory
myFam->fam_put_nonblocking(newLocal, descriptor, 10*sizeof(int), sizeof(local));
// ... subsequent code here
} catch (Fam_Exception &e) {
printf("fam API failed: %d: %s\n", e.fam_error(), e.fam_error_msg());
}
// ... Finalization code follows
}