blob: 137220c3e9d2f53a535af73d2cfce8b7190f7969 [file] [log] [blame]
#ifndef COLLECTIVE_SUBROUTINE_HDR
#define COLLECTIVE_SUBROUTINE_HDR
#include "shared_memory.h"
typedef struct collsub_iface_shared
{
size_t curr_size;
shared_mem_ptr collsub_buf;
counter_barrier barrier;
pthread_mutex_t mutex;
} collsub_iface_shared;
typedef struct collsub_iface
{
collsub_iface_shared *s;
allocator *a;
shared_memory *sm;
} collsub_iface;
void collsub_broadcast_scalar (collsub_iface *, void *, index_type, int);
internal_proto (collsub_broadcast_scalar);
void collsub_broadcast_array (collsub_iface *, gfc_array_char *, int);
internal_proto (collsub_broadcast_array);
void collsub_reduce_array (collsub_iface *, gfc_array_char *, int *,
void (*) (void *, void *));
internal_proto (collsub_reduce_array);
void collsub_reduce_scalar (collsub_iface *, void *, index_type, int *,
void (*) (void *, void *));
internal_proto (collsub_reduce_scalar);
void collsub_sync (collsub_iface *);
internal_proto (collsub_sync);
void collsub_iface_init (collsub_iface *, alloc_iface *, shared_memory *);
internal_proto (collsub_iface_init);
void * get_collsub_buf (collsub_iface *ci, size_t size);
internal_proto (get_collsub_buf);
/* Needed to prevent one image starting the next collective subroutine before
* everyone has finished the current one. At the moment, this is just an alias
* for collsub_sync, but there might be more work to do later. */
static inline void
finish_collective_subroutine(collsub_iface *ci) {
collsub_sync(ci);
}
#endif