Be smart about parsing the communicators list. Based on the values of
lowest_free and number_free detect if the communicator list has changed. If not, there is no reason to rebuild it, just use the old one. This commit was SVN r15895.
Этот коммит содержится в:
родитель
1030ddcd58
Коммит
7efffdb1da
@ -100,11 +100,11 @@
|
||||
* The internal debugging interface.
|
||||
*/
|
||||
#define VERBOSE_GENERAL 1
|
||||
#define VERBOSE_COMM 5
|
||||
#define VERBOSE_COMM 50
|
||||
#define VERBOSE_LISTS 10
|
||||
#define VERBOSE_REQ 20
|
||||
|
||||
#define VERBOSE 0
|
||||
#define VERBOSE 49
|
||||
#if VERBOSE
|
||||
#define DEBUG(LEVEL, WHAT) if( (LEVEL) > VERBOSE ) { printf WHAT; }
|
||||
#else
|
||||
@ -687,10 +687,12 @@ int mqs_setup_process (mqs_process *process, const mqs_process_callbacks *pcb)
|
||||
image = mqs_get_image (process);
|
||||
i_info = (mpi_image_info *)mqs_get_image_info (image);
|
||||
|
||||
/* Library starts at zero, so this ensures we go look to start with */
|
||||
p_info->communicator_sequence = -1;
|
||||
/* We have no communicators yet */
|
||||
p_info->communicator_list = NULL;
|
||||
/* Enforce the generation of the communicators list */
|
||||
p_info->comm_lowest_free = 0;
|
||||
p_info->comm_number_free = 0;
|
||||
|
||||
mqs_get_type_sizes (process, &p_info->sizes);
|
||||
/**
|
||||
* Before going any further make sure we know exactly how the Open MPI
|
||||
@ -729,12 +731,13 @@ int mqs_setup_process (mqs_process *process, const mqs_process_callbacks *pcb)
|
||||
p_info->sizes.size_t_size = fetch_int( process, /* sizeof (size_t) */
|
||||
typedefs_sizeof,
|
||||
p_info );
|
||||
printf( "sizes short = %d int = %d long = %d long long = %d "
|
||||
DEBUG( VERBOSE_GENERAL,
|
||||
("sizes short = %d int = %d long = %d long long = %d "
|
||||
"void* = %d bool = %d size_t = %d\n",
|
||||
p_info->sizes.short_size, p_info->sizes.int_size,
|
||||
p_info->sizes.long_size, p_info->sizes.long_long_size,
|
||||
p_info->sizes.pointer_size, p_info->sizes.bool_size,
|
||||
p_info->sizes.size_t_size );
|
||||
p_info->sizes.size_t_size) );
|
||||
}
|
||||
|
||||
mqs_put_process_info (process, (mqs_process_info *)p_info);
|
||||
@ -770,26 +773,32 @@ int mqs_process_has_queues (mqs_process *proc, char **msg)
|
||||
|
||||
/***********************************************************************
|
||||
* Check if the communicators have changed by looking at the
|
||||
* sequence number.
|
||||
* pointer array values for lowest_free and number_free.
|
||||
*/
|
||||
static int communicators_changed (mqs_process *proc)
|
||||
{
|
||||
#if 0 /* TODO: how do we figure out which communicators have changed ? */
|
||||
mpi_process_info *p_info = (mpi_process_info *)mqs_get_process_info (proc);
|
||||
mqs_image * image = mqs_get_image (proc);
|
||||
mpi_image_info *i_info = (mpi_image_info *)mqs_get_image_info (image);
|
||||
mqs_tword_t new_seq = fetch_int (proc,
|
||||
p_info->commlist_base+i_info->sequence_number_offs,
|
||||
mqs_tword_t number_free; /* the number of available positions in
|
||||
* the communicator array. */
|
||||
mqs_tword_t lowest_free; /* the lowest free communicator */
|
||||
|
||||
lowest_free = fetch_int( proc,
|
||||
p_info->commlist_base + i_info->ompi_pointer_array_t.offset.lowest_free,
|
||||
p_info );
|
||||
int res = (new_seq != p_info->communicator_sequence);
|
||||
|
||||
/* Save the sequence number for next time */
|
||||
p_info->communicator_sequence = new_seq;
|
||||
|
||||
return res;
|
||||
#endif
|
||||
DEBUG(VERBOSE_COMM,("communicators_changed called (return 1)\n"));
|
||||
number_free = fetch_int( proc,
|
||||
p_info->commlist_base + i_info->ompi_pointer_array_t.offset.number_free,
|
||||
p_info );
|
||||
if( (lowest_free != p_info->comm_lowest_free) ||
|
||||
(number_free != p_info->comm_number_free) ) {
|
||||
p_info->comm_lowest_free = lowest_free;
|
||||
p_info->comm_number_free = number_free;
|
||||
DEBUG(VERBOSE_COMM, ("Recreate the communicator list\n") );
|
||||
return 1;
|
||||
}
|
||||
DEBUG(VERBOSE_COMM, ("Communicator list not modified\n") );
|
||||
return 0;
|
||||
} /* mqs_communicators_changed */
|
||||
|
||||
/***********************************************************************
|
||||
@ -956,7 +965,6 @@ static int rebuild_communicator_list (mqs_process *proc)
|
||||
*/
|
||||
int mqs_update_communicator_list (mqs_process *proc)
|
||||
{
|
||||
DEBUG(VERBOSE_COMM,("mqs_update_communicator_list called\n"));
|
||||
if (communicators_changed (proc))
|
||||
return rebuild_communicator_list (proc);
|
||||
return mqs_ok;
|
||||
|
@ -277,9 +277,10 @@ typedef struct
|
||||
mqs_taddr_t recv_queue_base; /* Where to find the recv message queues */
|
||||
mqs_taddr_t sendq_base; /* Where to find the send queue */
|
||||
mqs_taddr_t commlist_base; /* Where to find the list of communicators */
|
||||
|
||||
/* Other info we need to remember about it */
|
||||
mqs_tword_t communicator_sequence;
|
||||
mqs_tword_t comm_number_free; /* the number of available positions in
|
||||
* the communicator array. */
|
||||
mqs_tword_t comm_lowest_free; /* the lowest free communicator */
|
||||
|
||||
/* State for the iterators */
|
||||
struct communicator_t *current_communicator; /* Easy, we're walking a simple list */
|
||||
|
Загрузка…
x
Ссылка в новой задаче
Block a user