From: Robert Edwards To: Richard Brower Subject: parsmp_rts.h /* $Id: parsmp_rts.h,v 12.11 2001/02/15 21:45:58 edwards Exp $ ($Date: 2001/02/15 21:45:58 $) */ /* Data structures used to parallel SMP boxes running MPI */ #ifndef _PARSMP_RTS_ #define _PARSMP_RTS_ #define ND 4 typedef struct PARSMP_geometry { /* Dimension of problem geometry */ unsigned dimension; /* Dimension of geometry used for PAR */ unsigned PAR_dim; /* My logical (rotated) coordinates */ unsigned coord[ND]; /* My logical (rotated) lexicographic node id */ unsigned nodeid; /* Number of virtual processors to physical processors */ unsigned subgrid_vol; /* Virtual lattice size */ unsigned length[ND]; /* Index mapping virtual lattice axes to physical axes */ unsigned ordering[ND]; /* Logical size of the machine */ unsigned machine_size[ND]; /* Subgrid length each logical (rotated) direction */ unsigned subgrid_length[ND]; /* Total number of words on face for each direction */ unsigned count[ND]; /* Number of blocks on face for each direction */ unsigned numblk[ND]; /* Block size on each face for each direction */ unsigned blksize[ND]; } *PARSMP_geometry_t; /* Some prototypes */ /* Main initialization */ void PARSMP_machine_init(int *argc, char ***argv); /* initialize machine state */ void PARSMP_machine_init_child(); /* initialize child state */ void PARSMP_machine_close(void); /* shutdown machine */ void PARSMP_create_physical_geometry(int *length, unsigned rank); /* Virtual lattice */ PARSMP_geometry_t PARSMP_create_geometry(int *length, unsigned rank); PARSMP_geometry_t PARSMP_create_detailed_geometry(int *length, unsigned rank, unsigned *ordering); void PARSMP_grid_coord(PARSMP_geometry_t geom, int *length); void PARSMP_machine_size(PARSMP_geometry_t geom, int *length); void PARSMP_free_geometry(PARSMP_geometry_t geom); /* Physical lattice */ int PARSMP_physical_dimension(); /* dimension of machine - 0 if not inited */ void PARSMP_physical_coord(int coord[]); /* coordinates in machine */ void PARSMP_physical_size(int size[]); /* machine size */ int PARSMP_physical_num_nodes(); /* number of nodes in system */ int PARSMP_primary_nodeP(); /* is this the primary node ? */ int PARSMP_physical_nodeid(); /* lexicographic node id in machine. x is fast */ int PARSMP_physical_neigh(int isign, int dir); /* Return the neighbor id in the isign and dir direction */ /* Shifting */ int PARSMP_shift(PARSMP_geometry_t geom, int site, unsigned char *data, int prim_size, int sn); /* Basic communication operations */ void PARSMP_sendrecv_wait(void *send_buf, void *recv_buf, int count, int sign, int dir); void PARSMP_sendrecv(void *send_buf, void *recv_buf, int count, int sign, int dir); void PARSMP_wait(int dir); void PARSMP_waitall(void); void PARSMP_barrier(void); void PARSMP_broadcast(void *data, int count); /* Global sums */ void PARSMP_d_reduce(double *src, double *dest, int count); void PARSMP_f_reduce(float *src, float *dest, int count); void PARSMP_s_reduce(int *src, int *dest, int count); void PARSMP_u_reduce(unsigned int *src, unsigned int *dest, int count); #endif