openfam::fam::fam_set
Atomically set a value in FAM.
Synopsis
void fam_set(Fam_Descriptor *descriptor, uint64_t offset, int32_t value);
void fam_set(Fam_Descriptor *descriptor, uint64_t offset, int64_t value);
void fam_set(Fam_Descriptor *descriptor, uint64_t offset, uint32_t value);
void fam_set(Fam_Descriptor *descriptor, uint64_t offset, uint64_t value);
void fam_set(Fam_Descriptor *descriptor, uint64_t offset, float value);
void fam_set(Fam_Descriptor *descriptor, uint64_t offset, double value);
void fam_set(Fam_Descriptor *descriptor, uint64_t offset, int128_t value);
Description
These methods atomically set a value in FAM.
Input Arguments
| Name | Description |
|---|---|
| Descriptor | Descriptor associated with the data item. |
| Offset | Offset within the data item in FAM where value is located. |
| Value | Value to be set at the given location. |
Return Values
None. Throws an exception on error.
Exceptions
| Exception | Description |
|---|---|
| Fam_InvalidOption_Exception | incorrect parameters are passed. |
| Fam_Datapath_Exception | error occurred during atomic operation over fabric. |
| FAM_ERR_NOPERM | Caller does not have access rights. |
| FAM_ERR_LIBFABRIC | libfabric error occurred. |
| FAM_ERR_NOTFOUND | Item not found in the region. |
| FAM_ERR_GRPC | if there is a communication error with memory server |
| FAM_ERR_RPC_CLIENT_NOTFOUND | Memory server initialization failure |
Notes
These methods atomically set a value in FAM. Note that the offset argument must point to the correct value for the data type. Availability of these methods is dependent on hardware support for the operations.
A subsequent successful completion of fam_quiet() call ensures the completion of this atomic operation.
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
// (an integer array with at least 10 elements)
Fam_Descriptor *descriptor = myFam->fam_lookup("myItem", "myRegion");
//Atomically set the value of first integer element in the array
myFam->fam_set(descriptor, 0, 10);
// ensure that the set operation is complete
myFam->fam_quiet();
// we now have the set the first integer in FAM to value of 10
} catch (Fam_Exception &e) {
printf("fam API failed: %d: %s\n", e.fam_error(), e.fam_error_msg());
}
// ... Finalization code follows
}