openfam::fam::fam_allocate
Allocate a data item in a region of FAM.
Synopsis
Fam_Descriptor *fam_allocate(char *name, uint64_t nbytes, mode_t
accessPermissions, Fam_Region_Descriptor *region);
Fam_Descriptor *fam_allocate(uint64_t nbytes, mode_t
accessPermissions, Fam_Region_Descriptor *region);
Description
These methods allocate space for a data item in some region of FAM.
Input Arguments
Name | Description |
---|---|
name | Name of the data item for subsequent references. |
nbytes | Requested size of the data item in bytes. |
accessPermissions | Access permissions for this data item. |
region | Descriptor for the region where the data item is being created. |
Return Values
Descriptor to the allocated data item. Throws Fam_Exception
on error.
Fam Error numbers
Error | Description |
---|---|
FAM_ERR_NOPERM | Caller does not have access rights. |
FAM_ERR_ALREADYEXIST | Data item name is already present in FAM. |
FAM_ERR_NAME_TOO_LONG | Data item name too long. |
FAM_ERR_RPC | Communication error from grpc layer. |
FAM_ERR_RPC_CLIENT_NOTFOUND | RPC service not available. |
FAM_ERR_METADATA | Metadata service error. |
FAM_ERR_MEMORY | Memory service error. |
FAM_ERR_RESOURCE | Resource not available. |
Notes
Note that these methods may allocate space greater than the
requested size to maintain an implementation dependent byte alignment.
The allocated space is zeroed out during allocation. If a name is
provided during allocation, it can be used within subsequent calls to
fam_lookup()
to retrieve the associated descriptor. If a name is not
provided during allocation, then the program itself is responsible for
saving and tracking the descriptor if required later, since the data
in FAM will be unreachable without the descriptor. Also note that at present maximum data item name
length supported is 40 characters.
Fam_Descriptor
provides a method to retrieve an opaque read-only data structure called
Fam_Global_Descriptor
which represents both the region and data item in FAM. Fam_Global_Descriptor
can be freely copied, and shared across processing nodes by the program, and is portable
across operating system and program instances.
// Fam_Global_Descriptor Fam_Descriptor::get_global_descriptor(); Fam_Global_Descriptor gDescriptor = famDescriptor->get_global_descriptor();
Fam_Descriptor
can be instantiated from Fam_Global_Descriptor
using the following constructor.
// Fam_Descriptor::Fam_Descriptor(Fam_Global_Descriptor gDescriptor); Fam_Descriptor *dataItem = new Fam_Descriptor(gDescriptor);
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 { Fam_Region_Descriptor *region = myFam->fam_lookup_region("myRegion"); // create 50 element unnamed integer array in FAM with 0600 // (read/write by owner) permissions in myRegion Fam_Descriptor *descriptor = myFam->fam_allocate((uint64_t)(50 * sizeof(int)), 0600, region); printf("Successfully allocated 50 unnamed integer elements\n"); // free allocated space in FAM myFam->fam_deallocate(descriptor); printf("Successfully de-allocated 50 unnamed integer elements\n"); } catch (Fam_Exception &e) { printf("fam API failed: %d: %s\n", e.fam_error(), e.fam_error_msg()); } // ... Finalization code here }