OpenFAM Reference Implementation

openfam::fam::fam_copy

Create a second copy of a data item in FAM.

Synopsis

void *fam_copy(Fam_Descriptor *src, uint64_t srcOffset, Fam_Descriptor **dest, uint64_t destOffset, uint64_t nbytes);

Description

Creates a second copy of some data item in FAM and returns a pointer to the wait object associated with this copy operation.

Input Arguments

Name Description
Src Descriptor associated with the source data item in FAM.
srcOffset Offset within the source descriptor where copy starts.
Dest Descriptor associated with the destination data item in FAM.
destOffset Offset within the destination descriptor where the copy starts.
Nbytes Number of bytes to copy.

Return Values

Returns a pointer to the wait object for the copy operation. This object is used wait for the completion of the copy operation. Throws an exception on error.

Exceptions

ExceptionDescription
Fam_InvalidOption_Exceptionincorrect parameters are passed.
FAM_ERR_NOPERMCaller does not have access rights
FAM_ERR_GRPCthere is a communication error with memory server
FAM_ERR_RPC_CLIENT_NOTFOUNDMemory server initialization failure

Notes

Note that the method is non-blocking: it returns after the copy has been initiated, and does not wait for completion of the transfer. Also note that fam_copy() performs an inconsistent copy, in that the copied data may reflect updates that are performed concurrently with the copy operation, rather than a point-in-time snapshot of the source data item that is consistent as of the beginning of copy operation. If the application desires a consistent copy, it is responsible for coordinating PE activity during the copy.

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
		Fam_Descriptor *descriptor = myFam->fam_lookup("myItem", "myRegion");
		
		// descriptor to new copy myItem in FAM
		Fam_Descriptor *newCopy;
	
		// create a new copy and returns a waitObject to copy operation.
		void *waitObj = myFam->fam_copy(descriptor, 0, &newCopy, 0, 10*sizeof(int));
	
		// Wait for copy operation to complete.
		myFam->fam_copy_wait(waitObj);
		printf("Copy to new location in FAM successful\n");
	 } catch (Fam_Exception &e) {
		printf("fam API failed: %d: %s\n", e.fam_error(), e.fam_error_msg());
	 }
	
	 // ... subsequent code here
}