//---------------------------------------------------------------------------// int recv(Node &node, int src, int tag, MPI_Comm comm) { int intArray[2]; MPI_Status status; int mpi_error = MPI_Recv(intArray, 2, MPI_INT, src, tag, comm, &status); CONDUIT_CHECK_MPI_ERROR(mpi_error); int schema_len = intArray[0]; int data_len = intArray[1]; char schema[schema_len + 1]; char data[data_len + 1]; mpi_error = MPI_Recv(schema, schema_len, MPI_CHAR, src, tag, comm, &status); CONDUIT_CHECK_MPI_ERROR(mpi_error); mpi_error = MPI_Recv(data, data_len, MPI_CHAR, src, tag, comm, &status); CONDUIT_CHECK_MPI_ERROR(mpi_error); Generator node_gen(schema, data); /// gen copy node_gen.walk(node); return mpi_error; }
//---------------------------------------------------------------------------// int recv(Node &node, int src, int tag, MPI_Comm comm) { int rcv_counts[2]; MPI_Status status; int mpi_error = MPI_Recv(rcv_counts, 2, MPI_INT, src, tag, comm, &status); CONDUIT_CHECK_MPI_ERROR(mpi_error); int schema_len = rcv_counts[0]; int data_len = rcv_counts[1]; Node recv_buffers; recv_buffers["schema"].set(DataType::c_char(schema_len+1)); recv_buffers["data"].set(DataType::c_char(data_len+1)); char *schema_ptr = recv_buffers["schema"].value(); char *data_ptr = recv_buffers["data"].value(); mpi_error = MPI_Recv(schema_ptr, schema_len, MPI_CHAR, src, tag, comm, &status); CONDUIT_CHECK_MPI_ERROR(mpi_error); mpi_error = MPI_Recv(data_ptr, data_len, MPI_CHAR, src, tag, comm, &status); CONDUIT_CHECK_MPI_ERROR(mpi_error); Generator node_gen(schema_ptr, "conduit_json", data_ptr); /// gen copy node_gen.walk(node); return mpi_error; }
//---------------------------------------------------------------------------// int reduce(Node &send_node, Node& recv_node, MPI_Datatype mpi_datatype, MPI_Op mpi_op, int root, MPI_Comm mpi_comm) { int rank; MPI_Comm_rank(MPI_COMM_WORLD, &rank); Schema schema_c; send_node.schema().compact_to(schema_c); std::string schema = schema_c.to_json(); std::vector<uint8> data; send_node.serialize(data); int data_len = data.size(); int datasize = 0; MPI_Type_size(mpi_datatype, &datasize); char recvdata[data_len+1]; int mpi_error = MPI_Reduce(&data[0], recvdata, (data_len / datasize) + 1, mpi_datatype, mpi_op, root, mpi_comm); CONDUIT_CHECK_MPI_ERROR(mpi_error); if (rank == root) { Generator node_gen(schema, recvdata); node_gen.walk(recv_node); } return mpi_error; }
//--------------------------------------------------------------------------// int all_reduce(Node &send_node, Node &recv_node, MPI_Datatype mpi_datatype, MPI_Op mpi_op, MPI_Comm mpi_comm) { Schema schema_c; send_node.schema().compact_to(schema_c); std::string schema = schema_c.to_json(); std::vector<uint8> data; send_node.serialize(data); int data_len = data.size(); int data_size = 0; MPI_Type_size(mpi_datatype, &data_size); Node recv_buffer; recv_buffer.set(DataType::c_char(data_len+1)); char *recv_ptr = recv_buffer.value(); int mpi_error = MPI_Allreduce(&data[0], recv_ptr, (data_len / data_size) + 1, mpi_datatype, mpi_op, mpi_comm); CONDUIT_CHECK_MPI_ERROR(mpi_error); Generator node_gen(schema, "conduit_json", recv_ptr); node_gen.walk(recv_node); return mpi_error; }
//--------------------------------------------------------------------------// int all_reduce(Node &send_node, Node &recv_node, MPI_Datatype mpi_datatype, MPI_Op mpi_op, MPI_Comm mpi_comm) { Schema schema_c; send_node.schema().compact_to(schema_c); std::string schema = schema_c.to_json(); std::vector<uint8> data; send_node.serialize(data); int data_len = data.size(); int datasize = 0; MPI_Type_size(mpi_datatype, &datasize); char recvdata[data_len+1]; int mpi_error = MPI_Allreduce(&data[0], recvdata, (data_len / datasize) + 1, mpi_datatype, mpi_op, mpi_comm); CONDUIT_CHECK_MPI_ERROR(mpi_error); Generator node_gen(schema, recvdata); node_gen.walk(recv_node); return mpi_error; }