+ if (MPI_IN_PLACE != sbuf) {
+ dsize = sdtype->size();
+ } else {
+ dsize = rdtype->size();
+ }
+ total_dsize = dsize * (ptrdiff_t)scount;
+ int (*funcs[])(const void *, int, MPI_Datatype, void*, int, MPI_Datatype, MPI_Comm) = {
+ &alltoall__basic_linear,
+ &alltoall__pair,
+ &alltoall__bruck,
+ &alltoall__basic_linear,
+ &alltoall__basic_linear
+ };
+ /** Algorithms:
+ * {1, "linear"},
+ * {2, "pairwise"},
+ * {3, "modified_bruck"},
+ * {4, "linear_sync"},
+ * {5, "two_proc"},
+ */
+ if (communicator_size == 2) {
+ if (total_dsize < 2) {
+ alg = 2;
+ } else if (total_dsize < 4) {
+ alg = 5;
+ } else if (total_dsize < 16) {
+ alg = 2;
+ } else if (total_dsize < 64) {
+ alg = 5;
+ } else if (total_dsize < 256) {
+ alg = 2;
+ } else if (total_dsize < 4096) {
+ alg = 5;
+ } else if (total_dsize < 32768) {
+ alg = 2;
+ } else if (total_dsize < 262144) {
+ alg = 4;
+ } else if (total_dsize < 1048576) {
+ alg = 5;
+ } else {
+ alg = 2;
+ }
+ } else if (communicator_size < 8) {
+ if (total_dsize < 8192) {
+ alg = 4;
+ } else if (total_dsize < 16384) {
+ alg = 1;
+ } else if (total_dsize < 65536) {
+ alg = 4;
+ } else if (total_dsize < 524288) {
+ alg = 1;
+ } else if (total_dsize < 1048576) {
+ alg = 2;
+ } else {
+ alg = 1;
+ }
+ } else if (communicator_size < 16) {
+ if (total_dsize < 262144) {
+ alg = 4;
+ } else {
+ alg = 1;
+ }
+ } else if (communicator_size < 32) {
+ if (total_dsize < 4) {
+ alg = 4;
+ } else if (total_dsize < 512) {
+ alg = 3;
+ } else if (total_dsize < 8192) {
+ alg = 4;
+ } else if (total_dsize < 32768) {
+ alg = 1;
+ } else if (total_dsize < 262144) {
+ alg = 4;
+ } else if (total_dsize < 524288) {
+ alg = 1;
+ } else {
+ alg = 4;
+ }
+ } else if (communicator_size < 64) {
+ if (total_dsize < 512) {
+ alg = 3;
+ } else if (total_dsize < 524288) {
+ alg = 1;
+ } else {
+ alg = 4;
+ }
+ } else if (communicator_size < 128) {
+ if (total_dsize < 1024) {
+ alg = 3;
+ } else if (total_dsize < 2048) {
+ alg = 1;
+ } else if (total_dsize < 4096) {
+ alg = 4;
+ } else if (total_dsize < 262144) {
+ alg = 1;
+ } else {
+ alg = 2;
+ }
+ } else if (communicator_size < 256) {
+ if (total_dsize < 1024) {
+ alg = 3;
+ } else if (total_dsize < 2048) {
+ alg = 4;
+ } else if (total_dsize < 262144) {
+ alg = 1;
+ } else {
+ alg = 2;
+ }
+ } else if (communicator_size < 512) {
+ if (total_dsize < 1024) {
+ alg = 3;
+ } else if (total_dsize < 8192) {
+ alg = 4;
+ } else if (total_dsize < 32768) {
+ alg = 1;
+ } else {
+ alg = 2;
+ }
+ } else if (communicator_size < 1024) {
+ if (total_dsize < 512) {
+ alg = 3;
+ } else if (total_dsize < 8192) {
+ alg = 4;
+ } else if (total_dsize < 16384) {
+ alg = 1;
+ } else if (total_dsize < 131072) {
+ alg = 4;
+ } else if (total_dsize < 262144) {
+ alg = 1;
+ } else {
+ alg = 2;
+ }
+ } else if (communicator_size < 2048) {
+ if (total_dsize < 512) {
+ alg = 3;
+ } else if (total_dsize < 1024) {
+ alg = 4;
+ } else if (total_dsize < 2048) {
+ alg = 1;
+ } else if (total_dsize < 16384) {
+ alg = 4;
+ } else if (total_dsize < 262144) {
+ alg = 1;
+ } else {
+ alg = 4;
+ }
+ } else if (communicator_size < 4096) {
+ if (total_dsize < 1024) {
+ alg = 3;
+ } else if (total_dsize < 4096) {
+ alg = 4;
+ } else if (total_dsize < 8192) {
+ alg = 1;
+ } else if (total_dsize < 131072) {
+ alg = 4;
+ } else {
+ alg = 1;
+ }
+ } else {
+ if (total_dsize < 2048) {
+ alg = 3;
+ } else if (total_dsize < 8192) {
+ alg = 4;
+ } else if (total_dsize < 16384) {
+ alg = 1;
+ } else if (total_dsize < 32768) {
+ alg = 4;
+ } else if (total_dsize < 65536) {
+ alg = 1;
+ } else {
+ alg = 4;
+ }