summaryrefslogtreecommitdiffstats
path: root/src/H5FDsubfile_private.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/H5FDsubfile_private.h')
-rw-r--r--src/H5FDsubfile_private.h183
1 files changed, 183 insertions, 0 deletions
diff --git a/src/H5FDsubfile_private.h b/src/H5FDsubfile_private.h
new file mode 100644
index 0000000..cacfdb9
--- /dev/null
+++ b/src/H5FDsubfile_private.h
@@ -0,0 +1,183 @@
+/********************/
+/* Standard Headers */
+/********************/
+
+#include <assert.h>
+#include <stdatomic.h>
+#include <stdio.h>
+#include <stdbool.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+/**************/
+/* H5 Headers */
+/**************/
+#include "H5private.h" /* Generic Functions */
+#include "H5CXprivate.h" /* API Contexts */
+#include "H5Dprivate.h" /* Datasets */
+#include "H5Eprivate.h" /* Error handling */
+#include "H5Ipublic.h"
+#include "H5Iprivate.h" /* IDs */
+#include "H5MMprivate.h" /* Memory management */
+#include "H5Pprivate.h" /* Property lists */
+
+
+#include "mpi.h"
+
+#ifndef _H5FDsubfile_private_H
+#define _H5FDsubfile_private_H
+
+typedef int (*file_close_cb)(int,MPI_Comm);
+
+typedef struct {
+ int64_t sf_stripe_size;
+ int64_t sf_blocksize_per_stripe;
+ MPI_Comm sf_msg_comm;
+ MPI_Comm sf_data_comm;
+ MPI_Comm sf_group_comm;
+ MPI_Comm sf_intercomm;
+ int sf_group_size;
+ int sf_group_rank;
+ int sf_intercomm_root;
+ char *subfile_prefix;
+} subfiling_context_t;
+
+typedef struct {
+ /* {Datasize, Offset} */
+ int64_t header[2];
+ int tag;
+ int source;
+ int subfile_rank;
+} sf_work_request_t;
+
+
+
+typedef struct {
+ long rank;
+ long hostid;
+} layout_t;
+
+typedef struct {
+ long hostid;
+ layout_t *topology;
+ int *node_ranks;
+ int node_count;
+ int node_index;
+ int local_peers;
+ int subfile_rank;
+ int world_rank;
+ int world_size;
+ bool rank_is_ioc;
+} sf_topology_t;
+
+#define K(n) ((n)*1024)
+#define DEFAULT_STRIPE_SIZE K(4) /* (1024*1024) */
+#define MAX_DEPTH 256
+
+typedef enum io_ops {
+ READ_OP = 1,
+ WRITE_OP = 2,
+ OPEN_OP = 3,
+ CLOSE_OP = 4,
+ INCR_OP = 8,
+ DECR_OP = 16,
+} io_op_t;
+
+typedef enum {
+ SF_BADID = (-1),
+ SF_TOPOLOGY = 1,
+ SF_CONTEXT,
+ SF_NTYPES /* number of subfiling object types, MUST BE LAST */
+} SF_OBJ_TYPE;
+
+
+
+/* MPI Tags are 32 bits, we treat them as unsigned
+ * to allow the use of the available bits for RPC
+ * selections:
+ * 0000
+ * 0001 READ_OP (Independent)
+ * 0010 WRITE_OP (Independent)
+ * 0011 /////////
+ * 0100 CLOSE_OP (Independent)
+ * -----
+ * 1000
+ * 1001 COLLECTIVE_READ
+ * 1010 COLLECTIVE_WRITE
+ * 1011 /////////
+ * 1100 COLLECTIVE_CLOSE
+ *
+ * 31 28 24 20 16 12 8 4 0|
+ * +-------+-------+-------+-------+-------+-------+-------+-------+
+ * | | | ACKS | OP |
+ * +-------+-------+-------+-------+-------+-------+-------+-------+
+ *
+ */
+
+/* Bit 3 SET indicates collectives */
+#define COLL_FUNC (0x1 << 3)
+
+#define ACK_PART (0x0acc << 8)
+#define DATA_PART (0xd8da << 8)
+#define COMPLETED (0xfed1 << 8)
+
+#define READ_INDEP (READ_OP)
+#define READ_COLL (COLL_FUNC | READ_OP)
+#define WRITE_INDEP (WRITE_OP)
+#define WRITE_COLL (COLL_FUNC | WRITE_OP)
+
+#define WRITE_INDEP_ACK (ACK_PART | WRITE_OP)
+#define WRITE_INDEP_DATA (DATA_PART | WRITE_OP)
+
+#define READ_INDEP_DATA (DATA_PART | READ_OP)
+
+#define INT32_MASK 0x07FFFFFFFFFFFFFFF
+
+extern int sf_verbose_flag;
+extern int sf_shutdown_flag;
+
+extern atomic_int sf_workinprogress;
+extern atomic_int sf_work_pending;
+extern atomic_int sf_file_close_count;
+extern atomic_int sf_file_refcount;
+
+/*
+-------------
+Messages IN
+-------------
+*/
+extern MPI_Comm sf_msg_comm;
+
+/*
+-------------
+Messages OUT
+-------------
+*/
+extern MPI_Comm sf_data_comm;
+
+
+
+H5_DLL int H5FD__determine_ioc_count(int world_size, int world_rank, sf_topology_t **thisapp);
+H5_DLL int H5FD__init_subfile_context(subfiling_context_t **newContext, int n_iocs, int world_size, int world_rank, bool rank_is_ioc);
+H5_DLL void * get_subfiling_object(int64_t object_id);
+H5_DLL hid_t get_subfiling_context(void);
+H5_DLL int initialize_ioc_threads(subfiling_context_t *sf_context);
+H5_DLL int tpool_add_work(sf_work_request_t *);
+H5_DLL int ioc_main(subfiling_context_t *context);
+H5_DLL int queue_write_coll(sf_work_request_t *msg, int subfile_rank, int source, MPI_Comm comm);
+H5_DLL int queue_read_coll(sf_work_request_t *msg, int subfile_rank, int source, MPI_Comm comm);
+H5_DLL int queue_write_indep(sf_work_request_t *msg, int subfile_rank, int source, MPI_Comm comm);
+H5_DLL int queue_read_indep(sf_work_request_t *msg, int subfile_rank, int source, MPI_Comm comm);
+H5_DLL int subfiling_close_file(int subfile_rank, MPI_Comm comm);
+H5_DLL int subfiling_open_file(const char *prefix, int subfile_rank, MPI_Comm comm);
+H5_DLL int queue_file_open(sf_work_request_t *msg, int subfile_rank, int source, MPI_Comm comm);
+H5_DLL int decrement_file_ref_counts( int subfile_rank, int source, MPI_Comm comm, file_close_cb callback_ftn);
+H5_DLL int sf_open_subfiles(hid_t context_id, char *prefix, int flags);
+H5_DLL int sf_close_subfiles(hid_t context_id);
+H5_DLL int sf_write_data(int fd, int64_t file_offset, void *data_buffer, int64_t data_size, int subfile_rank);
+H5_DLL int sf_read_data(int fd, int64_t file_offset, void *data_buffer, int64_t data_size, int subfile_rank);
+H5_DLL void delete_subfiling_context(hid_t context_id);
+
+#endif