code changes to support sm.
This commit was SVN r3534.
Этот коммит содержится в:
родитель
4cc5d00c2f
Коммит
2e6eaf6d5f
@ -415,4 +415,309 @@ static inline int ompi_cb_fifo_size(ompi_cb_fifo_t *fifo) {
|
||||
return fifo->size;
|
||||
}
|
||||
|
||||
/**
|
||||
* Initialize a fifo
|
||||
*
|
||||
* @param size_of_fifo Length of fifo array (IN)
|
||||
*
|
||||
* @param fifo_memory_locality_index Locality index to apply to
|
||||
* the fifo array. Not currently
|
||||
* in use (IN)
|
||||
*
|
||||
* @param tail_memory_locality_index Locality index to apply to the
|
||||
* head control structure. Not
|
||||
* currently in use (IN)
|
||||
*
|
||||
* @param tail_memory_locality_index Locality index to apply to the
|
||||
* tail control structure. Not
|
||||
* currently in use (IN)
|
||||
*
|
||||
* @param fifo Pointer to data structure defining this fifo (IN)
|
||||
*
|
||||
* @param memory_allocator Pointer to the memory allocator to use
|
||||
* to allocate memory for this fifo. (IN)
|
||||
*
|
||||
* @returncode Error code
|
||||
*
|
||||
*/
|
||||
static inline int ompi_cb_fifo_init_same_base_addr(int size_of_fifo,
|
||||
int lazy_free_freq, int fifo_memory_locality_index,
|
||||
int head_memory_locality_index, int tail_memory_locality_index,
|
||||
ompi_cb_fifo_t *fifo, mca_mpool_base_module_t *memory_allocator)
|
||||
{
|
||||
|
||||
int errorCode = OMPI_SUCCESS,i;
|
||||
size_t len_to_allocate;
|
||||
|
||||
/* verify that size is power of 2, and greatter that 0 - if not,
|
||||
* round up */
|
||||
if ( 0 >= size_of_fifo) {
|
||||
return OMPI_ERROR;
|
||||
}
|
||||
|
||||
/* set fifo size */
|
||||
fifo->size = ompi_round_up_to_nearest_pow2(size_of_fifo);
|
||||
|
||||
/* set lazy free frequence */
|
||||
if( ( 0 >= lazy_free_freq ) ||
|
||||
( lazy_free_freq > fifo->size) ) {
|
||||
return OMPI_ERROR;
|
||||
}
|
||||
fifo->lazy_free_frequency=lazy_free_freq;
|
||||
|
||||
/* this will be used to mask off the higher order bits,
|
||||
* and use the & operator for the wrap-around */
|
||||
fifo->mask = (fifo->size - 1);
|
||||
|
||||
/* allocate fifo array */
|
||||
len_to_allocate = sizeof(void *) * fifo->size;
|
||||
fifo->queue=memory_allocator->mpool_alloc(len_to_allocate,CACHE_LINE_SIZE);
|
||||
if ( NULL == fifo->queue) {
|
||||
return OMPI_ERR_OUT_OF_RESOURCE;
|
||||
}
|
||||
|
||||
/* initialize the queue entries */
|
||||
for (i = 0; i < fifo->size; i++) {
|
||||
fifo->queue[i] = OMPI_CB_FREE;
|
||||
}
|
||||
|
||||
/* allocate head control structure */
|
||||
len_to_allocate = sizeof(ompi_cb_fifo_ctl_t);
|
||||
fifo->head=memory_allocator->mpool_alloc(len_to_allocate,CACHE_LINE_SIZE);
|
||||
if ( NULL == fifo->head) {
|
||||
return OMPI_ERR_OUT_OF_RESOURCE;
|
||||
}
|
||||
|
||||
/* initialize the head structure */
|
||||
ompi_atomic_unlock(&(fifo->head->lock));
|
||||
fifo->head->fifo_index=0;
|
||||
fifo->head->num_to_clear=0;
|
||||
|
||||
/* allocate tail control structure */
|
||||
len_to_allocate = sizeof(ompi_cb_fifo_ctl_t);
|
||||
fifo->tail=memory_allocator->mpool_alloc(len_to_allocate,CACHE_LINE_SIZE);
|
||||
if ( NULL == fifo->tail) {
|
||||
return OMPI_ERR_OUT_OF_RESOURCE;
|
||||
}
|
||||
|
||||
/* initialize the head structure */
|
||||
ompi_atomic_unlock(&(fifo->tail->lock));
|
||||
fifo->tail->fifo_index=0;
|
||||
fifo->tail->num_to_clear=0;
|
||||
|
||||
/* set memory locality indecies */
|
||||
fifo->fifo_memory_locality_index=fifo_memory_locality_index;
|
||||
fifo->head_memory_locality_index=head_memory_locality_index;
|
||||
fifo->tail_memory_locality_index=tail_memory_locality_index;
|
||||
|
||||
/* return */
|
||||
return errorCode;
|
||||
}
|
||||
|
||||
/**
|
||||
* function to cleanup the fifo
|
||||
*
|
||||
* @param fifo Pointer to data structure defining this fifo (IN)
|
||||
*
|
||||
* @param memory_allocator Pointer to the memory allocator to use
|
||||
* to allocate memory for this fifo. (IN)
|
||||
*
|
||||
*/
|
||||
static inline int ompi_cb_fifo_free_same_base_addr( ompi_cb_fifo_t *fifo,
|
||||
mca_mpool_base_module_t *memory_allocator)
|
||||
{
|
||||
|
||||
int errorCode = OMPI_SUCCESS;
|
||||
char *ptr;
|
||||
|
||||
/* make sure null fifo is not passed in */
|
||||
if ( NULL == fifo) {
|
||||
return OMPI_ERROR;
|
||||
}
|
||||
|
||||
/* free fifo array */
|
||||
if( OMPI_CB_NULL != ptr ){
|
||||
ptr=(char *)(fifo->queue);
|
||||
memory_allocator->mpool_free(ptr);
|
||||
fifo->queue=OMPI_CB_NULL;
|
||||
}
|
||||
|
||||
/* free head control structure */
|
||||
if( OMPI_CB_NULL != fifo->head) {
|
||||
ptr=(char *)(fifo->head);
|
||||
memory_allocator->mpool_free(ptr);
|
||||
fifo->head=OMPI_CB_NULL;
|
||||
|
||||
}
|
||||
|
||||
/* free tail control structure */
|
||||
if( OMPI_CB_NULL != fifo->tail) {
|
||||
ptr=(char *)(fifo->tail);
|
||||
memory_allocator->mpool_free(ptr);
|
||||
fifo->tail=OMPI_CB_NULL;
|
||||
}
|
||||
|
||||
/* return */
|
||||
return errorCode;
|
||||
}
|
||||
/**
|
||||
* Write pointer to the specified slot
|
||||
*
|
||||
* @param slot Slot index (IN)
|
||||
*
|
||||
* @param data Pointer value to write in specified slot (IN)
|
||||
*
|
||||
* @param fifo Pointer to data structure defining this fifo (IN)
|
||||
*
|
||||
* @returncode Slot index to which data is written
|
||||
*
|
||||
*/
|
||||
static inline int ompi_cb_fifo_write_to_slot_same_base_addr(int slot, void* data,
|
||||
ompi_cb_fifo_t *fifo)
|
||||
{
|
||||
volatile void **ptr;
|
||||
int wrote_to_slot = OMPI_CB_ERROR;
|
||||
/* make sure that this slot is already reserved */
|
||||
ptr=fifo->queue;
|
||||
if (ptr[slot] == OMPI_CB_RESERVED ) {
|
||||
ptr[slot] = data;
|
||||
return slot;
|
||||
} else {
|
||||
return wrote_to_slot;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Try to write pointer to the head of the queue
|
||||
*
|
||||
* @param data Pointer value to write in specified slot (IN)
|
||||
*
|
||||
* @param fifo Pointer to data structure defining this fifo (IN)
|
||||
*
|
||||
* @returncode Slot index to which data is written
|
||||
*
|
||||
*/
|
||||
static inline int ompi_cb_fifo_write_to_head_same_base_addr(void *data, ompi_cb_fifo_t *fifo)
|
||||
{
|
||||
volatile void **ptr;
|
||||
ompi_cb_fifo_ctl_t *h_ptr;
|
||||
int slot = OMPI_CB_ERROR, index;
|
||||
|
||||
h_ptr=fifo->head;
|
||||
index = h_ptr->fifo_index;
|
||||
/* make sure the head is pointing at a free element */
|
||||
ptr=fifo->queue;
|
||||
if (ptr[index] == OMPI_CB_FREE) {
|
||||
slot = index;
|
||||
ptr[slot] = data;
|
||||
(h_ptr->fifo_index)++;
|
||||
/* wrap around */
|
||||
(h_ptr->fifo_index) &= fifo->mask;
|
||||
}
|
||||
|
||||
/* return */
|
||||
return slot;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Reserve slot in the fifo array
|
||||
*
|
||||
* @param fifo Pointer to data structure defining this fifo (IN)
|
||||
*
|
||||
* @returncode Slot index to which data is written
|
||||
*
|
||||
* @returncode OMPI_CB_ERROR failed to allocate index
|
||||
*
|
||||
*/
|
||||
static inline int ompi_cb_fifo_get_slot_same_base_addr(ompi_cb_fifo_t *fifo)
|
||||
{
|
||||
volatile void **ptr;
|
||||
ompi_cb_fifo_ctl_t *h_ptr;
|
||||
int return_value = OMPI_CB_ERROR,index;
|
||||
|
||||
h_ptr=fifo->head;
|
||||
ptr=fifo->queue;
|
||||
index = h_ptr->fifo_index;
|
||||
/* try and reserve slot */
|
||||
if ( OMPI_CB_FREE == ptr[index] ) {
|
||||
ptr[index] = OMPI_CB_RESERVED;
|
||||
return_value = index;
|
||||
(h_ptr->fifo_index)++;
|
||||
(h_ptr->fifo_index) &= fifo->mask;
|
||||
}
|
||||
|
||||
/* return */
|
||||
return return_value;
|
||||
}
|
||||
|
||||
/**
|
||||
* Try to read pointer from the tail of the queue
|
||||
*
|
||||
* @param data Pointer to where data was be written (OUT)
|
||||
*
|
||||
* @param fifo Pointer to data structure defining this fifo (IN)
|
||||
*
|
||||
* @param flush_entries_read force the lazy free to happen (IN)
|
||||
*
|
||||
* @param queue_empty checks to see if the fifo is empty, but only if
|
||||
* flush_entries_read is set (OUT)
|
||||
*
|
||||
* @returncode Slot index to which data is written
|
||||
*
|
||||
*/
|
||||
static inline void *ompi_cb_fifo_read_from_tail_same_base_addr(
|
||||
ompi_cb_fifo_t *fifo,
|
||||
bool flush_entries_read, bool *queue_empty)
|
||||
{
|
||||
int index = 0,clearIndex, i;
|
||||
volatile void **q_ptr;
|
||||
ompi_cb_fifo_ctl_t *h_ptr, *t_ptr;
|
||||
void *read_from_tail = (void *)OMPI_CB_ERROR;
|
||||
|
||||
*queue_empty=false;
|
||||
|
||||
h_ptr=fifo->head;
|
||||
t_ptr=fifo->tail;
|
||||
q_ptr=fifo->queue;
|
||||
|
||||
/* check to see that the data is valid */
|
||||
if ((q_ptr[t_ptr->fifo_index] == OMPI_CB_FREE) ||
|
||||
(q_ptr[t_ptr->fifo_index] == OMPI_CB_RESERVED))
|
||||
{
|
||||
return (void *)OMPI_CB_FREE;
|
||||
}
|
||||
|
||||
/* set return data */
|
||||
index = t_ptr->fifo_index;
|
||||
read_from_tail = (void *)q_ptr[index];
|
||||
t_ptr->num_to_clear++;
|
||||
|
||||
/* increment counter for later lazy free */
|
||||
(t_ptr->fifo_index)++;
|
||||
(t_ptr->fifo_index) &= fifo->mask;
|
||||
|
||||
/* check to see if time to do a lazy free of queue slots */
|
||||
if ( (t_ptr->num_to_clear == fifo->lazy_free_frequency) ||
|
||||
flush_entries_read ) {
|
||||
clearIndex = index - t_ptr->num_to_clear + 1;
|
||||
clearIndex &= fifo->mask;
|
||||
|
||||
for (i = 0; i < t_ptr->num_to_clear; i++) {
|
||||
q_ptr[clearIndex] = OMPI_CB_FREE;
|
||||
clearIndex++;
|
||||
clearIndex &= fifo->mask;
|
||||
}
|
||||
t_ptr->num_to_clear = 0;
|
||||
|
||||
/* check to see if queue is empty */
|
||||
if( flush_entries_read &&
|
||||
(t_ptr->fifo_index == h_ptr->fifo_index) ) {
|
||||
*queue_empty=true;
|
||||
}
|
||||
}
|
||||
|
||||
/* return */
|
||||
return read_from_tail;
|
||||
}
|
||||
#endif /* !_OMPI_CIRCULAR_BUFFER_FIFO */
|
||||
|
@ -401,5 +401,287 @@ static inline void *ompi_fifo_read_from_tail(ompi_fifo_t *fifo, size_t
|
||||
/* return */
|
||||
return return_value;
|
||||
}
|
||||
/**
|
||||
* Initialize a fifo
|
||||
*
|
||||
* @param size_of_cb_fifo Length of fifo array (IN)
|
||||
*
|
||||
* @param fifo_memory_locality_index Locality index to apply to
|
||||
* the fifo array. Not currently
|
||||
* in use (IN)
|
||||
*
|
||||
* @param tail_memory_locality_index Locality index to apply to the
|
||||
* head control structure. Not
|
||||
* currently in use (IN)
|
||||
*
|
||||
* @param tail_memory_locality_index Locality index to apply to the
|
||||
* tail control structure. Not
|
||||
* currently in use (IN)
|
||||
*
|
||||
* @param fifo Pointer to data structure defining this fifo (IN)
|
||||
*
|
||||
* @param memory_allocator Pointer to the memory allocator to use
|
||||
* to allocate memory for this fifo. (IN)
|
||||
*
|
||||
* @returncode Error code
|
||||
*
|
||||
*/
|
||||
static inline int ompi_fifo_init_same_base_addr(int size_of_cb_fifo,
|
||||
int lazy_free_freq, int fifo_memory_locality_index,
|
||||
int head_memory_locality_index, int tail_memory_locality_index,
|
||||
ompi_fifo_t *fifo, mca_mpool_base_module_t *memory_allocator)
|
||||
{
|
||||
int error_code=OMPI_SUCCESS;
|
||||
size_t len_to_allocate;
|
||||
|
||||
/* allocate head ompi_cb_fifo_t structure */
|
||||
len_to_allocate=sizeof(ompi_cb_fifo_wrapper_t);
|
||||
fifo->head=memory_allocator->mpool_alloc(len_to_allocate,CACHE_LINE_SIZE);
|
||||
if ( NULL == fifo->head) {
|
||||
return OMPI_ERR_OUT_OF_RESOURCE;
|
||||
}
|
||||
|
||||
/* initialize the circular buffer fifo head structure */
|
||||
error_code=ompi_cb_fifo_init_same_base_addr(size_of_cb_fifo,
|
||||
lazy_free_freq, fifo_memory_locality_index,
|
||||
head_memory_locality_index, tail_memory_locality_index,
|
||||
(ompi_cb_fifo_t *)&(fifo->head->cb_fifo),
|
||||
memory_allocator);
|
||||
if ( OMPI_SUCCESS != error_code ) {
|
||||
return error_code;
|
||||
}
|
||||
|
||||
/* finish head initialization */
|
||||
fifo->head->next_fifo_wrapper=
|
||||
(volatile struct ompi_cb_fifo_wrapper_t *)fifo->head; /* only one element
|
||||
in the link list */
|
||||
fifo->head->cb_overflow=false; /* no attempt to overflow the queue */
|
||||
ompi_atomic_unlock(&(fifo->head_lock));
|
||||
ompi_atomic_unlock(&(fifo->tail_lock));
|
||||
|
||||
/* set the tail */
|
||||
fifo->tail=fifo->head;
|
||||
|
||||
/* return */
|
||||
return error_code;
|
||||
}
|
||||
|
||||
/**
|
||||
* Write pointer to the specified slot
|
||||
*
|
||||
* @param slot Slot addressing (IN)
|
||||
*
|
||||
* @param data Pointer value to write in specified slot (IN)
|
||||
*
|
||||
* @param offset Offset relative to base of the memory segement (IN)
|
||||
*
|
||||
* @returncode Slot index data written to
|
||||
*
|
||||
*/
|
||||
static inline int ompi_fifo_write_to_slot_same_base_addr(cb_slot_t *slot,
|
||||
void* data, size_t offset)
|
||||
{
|
||||
return ompi_cb_fifo_write_to_slot_same_base_addr(slot->index,data,
|
||||
slot->cb);
|
||||
}
|
||||
|
||||
/**
|
||||
* Try to write pointer to the head of the queue
|
||||
*
|
||||
* @param data Pointer value to write in specified slot (IN)
|
||||
*
|
||||
* @param fifo Pointer to data structure defining this fifo (IN)
|
||||
*
|
||||
* @returncode Slot index to which data is written
|
||||
*
|
||||
*/
|
||||
static inline int ompi_fifo_write_to_head_same_base_addr(void *data,
|
||||
ompi_fifo_t *fifo, mca_mpool_base_module_t *fifo_allocator)
|
||||
{
|
||||
int error_code=OMPI_SUCCESS;
|
||||
size_t len_to_allocate;
|
||||
ompi_cb_fifo_wrapper_t *next_ff;
|
||||
bool available;
|
||||
|
||||
/* attempt to write data to head ompi_fifo_cb_fifo_t */
|
||||
error_code=ompi_cb_fifo_write_to_head_same_base_addr(data,
|
||||
(ompi_cb_fifo_t *)&(fifo->head->cb_fifo));
|
||||
if( OMPI_CB_ERROR == error_code ) {
|
||||
/*
|
||||
* queue is full
|
||||
*/
|
||||
|
||||
/* mark queue as overflown */
|
||||
fifo->head->cb_overflow=true;
|
||||
|
||||
/* see if next queue is available - while the next queue
|
||||
* has not been emptied, it will be marked as overflowen*/
|
||||
next_ff=(ompi_cb_fifo_wrapper_t *)fifo->head->next_fifo_wrapper;
|
||||
available=!(next_ff->cb_overflow);
|
||||
|
||||
/* if next queue not available, allocate new queue */
|
||||
if( !available ) {
|
||||
|
||||
/* allocate head ompi_cb_fifo_t structure */
|
||||
len_to_allocate=sizeof(ompi_cb_fifo_wrapper_t);
|
||||
next_ff=fifo_allocator->mpool_alloc
|
||||
(len_to_allocate,CACHE_LINE_SIZE);
|
||||
if ( NULL == next_ff) {
|
||||
return OMPI_ERR_OUT_OF_RESOURCE;
|
||||
}
|
||||
|
||||
/* initialize the circular buffer fifo head structure */
|
||||
error_code=ompi_cb_fifo_init_same_base_addr(
|
||||
fifo->head->cb_fifo.size,
|
||||
fifo->head->cb_fifo.lazy_free_frequency,
|
||||
fifo->head->cb_fifo.fifo_memory_locality_index,
|
||||
fifo->head->cb_fifo.head_memory_locality_index,
|
||||
fifo->head->cb_fifo.tail_memory_locality_index,
|
||||
&(next_ff->cb_fifo),
|
||||
fifo_allocator);
|
||||
if ( OMPI_SUCCESS != error_code ) {
|
||||
return error_code;
|
||||
}
|
||||
|
||||
|
||||
/* finish new element initialization */
|
||||
next_ff->next_fifo_wrapper=fifo->head->next_fifo_wrapper; /* only one
|
||||
element in the
|
||||
link list */
|
||||
next_ff->cb_overflow=false; /* no attempt to overflow the queue */
|
||||
}
|
||||
|
||||
/* reset head pointer */
|
||||
fifo->head->next_fifo_wrapper=next_ff;
|
||||
fifo->head=next_ff;
|
||||
|
||||
/* write data to new head structure */
|
||||
error_code=ompi_cb_fifo_write_to_head_same_base_addr(data,
|
||||
(ompi_cb_fifo_t *)&(fifo->head->cb_fifo));
|
||||
if( OMPI_CB_ERROR == error_code ) {
|
||||
return error_code;
|
||||
}
|
||||
}
|
||||
|
||||
/* return */
|
||||
return error_code;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Reserve slot in the fifo array
|
||||
*
|
||||
* @param fifo Pointer to data structure defining this fifo (IN)
|
||||
*
|
||||
* @returncode Slot index to which data is written
|
||||
*
|
||||
* @returncode OMPI_CB_ERROR failed to allocate index
|
||||
*
|
||||
*/
|
||||
static inline cb_slot_t ompi_fifo_get_slot_same_base_addr(ompi_fifo_t *fifo,
|
||||
mca_mpool_base_module_t *fifo_allocator)
|
||||
{
|
||||
size_t len_to_allocate;
|
||||
volatile ompi_cb_fifo_wrapper_t *next_ff;
|
||||
bool available;
|
||||
cb_slot_t return_params;
|
||||
|
||||
/* attempt to write data to head ompi_fifo_cb_fifo_t */
|
||||
return_params.index=ompi_cb_fifo_get_slot_same_base_addr(
|
||||
(ompi_cb_fifo_t *)&(fifo->head->cb_fifo));
|
||||
if( OMPI_CB_ERROR == return_params.index ) {
|
||||
/*
|
||||
* queue is full
|
||||
*/
|
||||
|
||||
/* mark queue as overflown */
|
||||
fifo->head->cb_overflow=true;
|
||||
|
||||
/* see if next queue is available - while the next queue
|
||||
* has not been emptied, it will be marked as overflowen*/
|
||||
next_ff=fifo->head->next_fifo_wrapper;
|
||||
available=!(next_ff->cb_overflow);
|
||||
|
||||
/* if next queue not available, allocate new queue */
|
||||
if( !available ) {
|
||||
|
||||
/* allocate head ompi_cb_fifo_t structure */
|
||||
len_to_allocate=sizeof(ompi_cb_fifo_wrapper_t);
|
||||
next_ff=fifo_allocator->mpool_alloc
|
||||
(len_to_allocate,CACHE_LINE_SIZE);
|
||||
if ( NULL == next_ff) {
|
||||
return_params.index=OMPI_ERR_OUT_OF_RESOURCE;
|
||||
return return_params;
|
||||
}
|
||||
|
||||
/* initialize the circular buffer fifo head structure */
|
||||
return_params.index=ompi_cb_fifo_init_same_base_addr(
|
||||
fifo->head->cb_fifo.size,
|
||||
fifo->head->cb_fifo.lazy_free_frequency,
|
||||
fifo->head->cb_fifo.fifo_memory_locality_index,
|
||||
fifo->head->cb_fifo.head_memory_locality_index,
|
||||
fifo->head->cb_fifo.tail_memory_locality_index,
|
||||
(ompi_cb_fifo_t *)&(next_ff->cb_fifo),
|
||||
fifo_allocator);
|
||||
if ( OMPI_SUCCESS != return_params.index ) {
|
||||
return return_params;
|
||||
}
|
||||
|
||||
|
||||
/* finish new element initialization */
|
||||
next_ff->next_fifo_wrapper=fifo->head->next_fifo_wrapper; /* only one element in
|
||||
the link list */
|
||||
next_ff->cb_overflow=false; /* no attempt to overflow the queue */
|
||||
}
|
||||
|
||||
/* reset head pointer */
|
||||
fifo->head->next_fifo_wrapper=next_ff;
|
||||
fifo->head=next_ff;
|
||||
|
||||
/* write data to new head structure */
|
||||
return_params.index=ompi_cb_fifo_get_slot_same_base_addr(
|
||||
(ompi_cb_fifo_t *)&(fifo->head->cb_fifo));
|
||||
if( OMPI_CB_ERROR == return_params.index ) {
|
||||
return return_params;
|
||||
}
|
||||
}
|
||||
|
||||
/* return */
|
||||
return_params.cb=(ompi_cb_fifo_t *)&(fifo->head->cb_fifo);
|
||||
return return_params;
|
||||
}
|
||||
|
||||
/**
|
||||
* Try to read pointer from the tail of the queue
|
||||
*
|
||||
* @param fifo Pointer to data structure defining this fifo (IN)
|
||||
*
|
||||
* @param offset Offset relative to base of the memory segement (IN)
|
||||
*
|
||||
* @returncode Pointer - OMPI_CB_FREE indicates no data to read
|
||||
*
|
||||
*/
|
||||
static inline void *ompi_fifo_read_from_tail_same_base_addr(
|
||||
ompi_fifo_t *fifo)
|
||||
{
|
||||
/* local parameters */
|
||||
void *return_value;
|
||||
bool queue_empty;
|
||||
|
||||
/* get next element */
|
||||
return_value=ompi_cb_fifo_read_from_tail_same_base_addr(
|
||||
(ompi_cb_fifo_t *)&(fifo->tail->cb_fifo),
|
||||
fifo->tail->cb_overflow,&queue_empty);
|
||||
|
||||
/* check to see if need to move on to next cb_fifo in the link list */
|
||||
if( queue_empty ) {
|
||||
/* queue_emptied - move on to next element in fifo */
|
||||
fifo->tail->cb_overflow=false;
|
||||
fifo->tail=fifo->tail->next_fifo_wrapper;
|
||||
}
|
||||
|
||||
/* return */
|
||||
return return_value;
|
||||
}
|
||||
|
||||
#endif /* !_OMPI_FIFO */
|
||||
|
@ -8,14 +8,24 @@
|
||||
extern "C" {
|
||||
#endif
|
||||
struct mca_common_sm_file_header_t {
|
||||
|
||||
/* lock to control atomic access */
|
||||
ompi_lock_t seg_lock;
|
||||
/* is the segment ready for use */
|
||||
|
||||
volatile bool seg_inited;
|
||||
/* Offset to next available memory location available for allocation */
|
||||
size_t seg_offset;
|
||||
|
||||
/* total size of the segment */
|
||||
size_t seg_size;
|
||||
|
||||
/* array of pointers to the base of the shared memory address - one per
|
||||
* local process */
|
||||
volatile char **base_shared_mem_segment;
|
||||
|
||||
/* array of flags indicating base_shared_mem_segment is set */
|
||||
volatile int *base_shared_mem_flags;
|
||||
};
|
||||
typedef struct mca_common_sm_file_header_t mca_common_sm_file_header_t;
|
||||
|
||||
|
@ -40,6 +40,10 @@ int MPI_Init(int *argc, char ***argv)
|
||||
/* JMS show_help */
|
||||
return OMPI_ERRHANDLER_INVOKE(MPI_COMM_WORLD, MPI_ERR_OTHER, FUNC_NAME);
|
||||
}
|
||||
/* debug */
|
||||
fprintf(stderr," mpi_init called \n");
|
||||
fflush(stderr);
|
||||
/* end debug */
|
||||
|
||||
/* check for environment overrides for required thread level. If
|
||||
there is, check to see that it is a valid/supported thread level.
|
||||
|
Загрузка…
Ссылка в новой задаче
Block a user