00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #include "bsp_exptable.h"
00029 #include "bsp_alloc.h"
00030 #include "bsp_abort.h"
00046 void
00047 expandableTable_comm (const ExpandableTable * restrict send,
00048 ExpandableTable *restrict recv, MPI_Comm communicator)
00049 {
00050 int total_bytes_and_counts_to_send[2 * send->nprocs];
00051 int total_bytes_and_counts_to_recv[2 * send->nprocs];
00052 int recv_offset[send->nprocs], send_offset[send->nprocs];
00053 int recv_bytes[send->nprocs], send_bytes[send->nprocs];
00054 int max_slots_used, i;
00055
00056
00057
00058
00059 for (i = 0; i < send->nprocs; i++)
00060 {
00061 total_bytes_and_counts_to_send[2 * i] = send->used_slot_count[i];
00062 total_bytes_and_counts_to_send[2 * i + 1] = send->count[i];
00063 }
00064
00065
00066 MPI_Alltoall (total_bytes_and_counts_to_send, 2, MPI_INT,
00067 total_bytes_and_counts_to_recv, 2, MPI_INT, communicator);
00068
00069 for (i = 0; i < send->nprocs; i++)
00070 {
00071 recv->used_slot_count[i] = total_bytes_and_counts_to_recv[2 * i] ;
00072 recv->count[i] = total_bytes_and_counts_to_recv[2 * i + 1];
00073 }
00074
00075
00076 max_slots_used = 0;
00077
00078 for (i = 0; i < send->nprocs; i++)
00079 max_slots_used = MAX (max_slots_used, recv->used_slot_count[i]);
00080
00081 if (max_slots_used > recv->rows)
00082 {
00083
00084 bsp_free (recv->data);
00085 recv->data =
00086 bsp_malloc (recv->nprocs * max_slots_used *2, recv->slot_size);
00087 recv->rows = max_slots_used * 2;
00088 }
00089
00090
00091
00092 for (i = 0; i < recv->nprocs; i++)
00093 {
00094 recv_offset[i] = i * recv->rows * recv->slot_size;
00095 send_offset[i] = i * send->rows * send->slot_size;
00096 send_bytes[i] = send->used_slot_count[i] * send->slot_size;
00097 recv_bytes[i] = recv->used_slot_count[i] * recv->slot_size;
00098 }
00099
00100
00101
00102 MPI_Alltoallv (send->data, send_bytes, send_offset, MPI_BYTE,
00103 recv->data, recv_bytes, recv_offset, MPI_BYTE, communicator);
00104 }
00105
00106