ckpt
This commit is contained in:
parent
f700a2dfd8
commit
6525ef419f
1 changed files with 41 additions and 80 deletions
|
@ -16,6 +16,7 @@
|
|||
#define MAX(type, x, y) (type) GENERIC_MAX(ENSURE_##type(x), ENSURE_##type(y))
|
||||
#define MIN(type, x, y) (type) GENERIC_MIN(ENSURE_##type(x), ENSURE_##type(y))
|
||||
|
||||
void init_ctl(int *ctl, int len);
|
||||
void local_quicksort(int *arr, int lo, int hi);
|
||||
char *string_of_list(int *arr, int len);
|
||||
void recursive_quicksort(int *integers, int n, int root, MPI_Comm comm);
|
||||
|
@ -56,14 +57,15 @@ int main(int argc, char **argv) {
|
|||
// sendcount, MPI_INT, void *recvbuf,
|
||||
// int recvcount, MPI_INT, 0, MPI_COMM_WORLD);
|
||||
int recvbuf[n];
|
||||
MPI_Allgather(integers, n_over_p, MPI_INT, recvbuf, n_over_p, MPI_INT,
|
||||
MPI_COMM_WORLD);
|
||||
MPI_Gather(integers, n_over_p, MPI_INT, recvbuf, n_over_p, MPI_INT, 0,
|
||||
MPI_COMM_WORLD);
|
||||
|
||||
if (rank == 0) {
|
||||
FILE *f = fopen(argv[2], "w");
|
||||
// printf("integers: %s\n", string_of_list(recvbuf, n));
|
||||
printf("[%d] ==== FINAL ====\n", rank);
|
||||
for (int i = 0; i < p; i += 1) {
|
||||
printf("[%d] integers: %s\n", rank,
|
||||
printf("[%d] %s\n", rank,
|
||||
string_of_list(&recvbuf[i * n_over_p], n_over_p));
|
||||
}
|
||||
fclose(f);
|
||||
|
@ -217,19 +219,16 @@ void recursive_quicksort(int *integers, int n, int root, MPI_Comm comm) {
|
|||
int send_displs[p];
|
||||
int recv_counts[p];
|
||||
int recv_displs[p];
|
||||
|
||||
init_ctl(S_ctl, p);
|
||||
init_ctl(L_ctl, p);
|
||||
init_ctl(S_send_ctl, p);
|
||||
init_ctl(L_send_ctl, p);
|
||||
|
||||
for (int i = 0; i < p; ++i) {
|
||||
send_counts[i] = n_over_p;
|
||||
send_displs[i] = i * n_over_p;
|
||||
|
||||
S_ctl[i * CTL_SIZE] = 0;
|
||||
S_ctl[i * CTL_SIZE + 1] = -1;
|
||||
S_ctl[i * CTL_SIZE + 2] = -1;
|
||||
S_ctl[i * CTL_SIZE + 3] = -1;
|
||||
L_ctl[i * CTL_SIZE] = 0;
|
||||
L_ctl[i * CTL_SIZE + 1] = -1;
|
||||
L_ctl[i * CTL_SIZE + 2] = -1;
|
||||
L_ctl[i * CTL_SIZE + 3] = -1;
|
||||
|
||||
ctl_send_counts[i] = CTL_SIZE;
|
||||
ctl_send_displs[i] = i * CTL_SIZE;
|
||||
recv_counts[i] = CTL_SIZE;
|
||||
|
@ -238,13 +237,6 @@ void recursive_quicksort(int *integers, int n, int root, MPI_Comm comm) {
|
|||
|
||||
// Send S to the correct target
|
||||
{
|
||||
for (int i = 0; i < p; ++i) {
|
||||
S_send_ctl[i * CTL_SIZE] = 0;
|
||||
S_send_ctl[i * CTL_SIZE + 1] = -1;
|
||||
S_send_ctl[i * CTL_SIZE + 2] = -1;
|
||||
S_send_ctl[i * CTL_SIZE + 3] = -1;
|
||||
}
|
||||
|
||||
for (int i = S_lo, dest_pos = S_global_start,
|
||||
processor = S_starting_process;
|
||||
i < S_hi;) {
|
||||
|
@ -261,11 +253,11 @@ void recursive_quicksort(int *integers, int n, int root, MPI_Comm comm) {
|
|||
int to_local_start = to_global_start - processor * n_over_p,
|
||||
to_local_end = to_global_end - processor * n_over_p;
|
||||
|
||||
printf("[%d] S ->> (count=%d), from local [%d..%d] {%d..%d} -to-> "
|
||||
"p#%d [%d..%d] {%d..%d}\n",
|
||||
rank, count, from_local_start, from_local_end, from_global_start,
|
||||
from_global_end, processor, to_local_start, to_local_end,
|
||||
to_global_start, to_global_end);
|
||||
// printf("[%d] S ->> (count=%d), from local [%d..%d] {%d..%d} -to-> "
|
||||
// "p#%d [%d..%d] {%d..%d}\n",
|
||||
// rank, count, from_local_start, from_local_end,
|
||||
// from_global_start, from_global_end, processor, to_local_start,
|
||||
// to_local_end, to_global_start, to_global_end);
|
||||
S_send_ctl[processor * CTL_SIZE] = count;
|
||||
S_send_ctl[processor * CTL_SIZE + 1] = from_global_start;
|
||||
S_send_ctl[processor * CTL_SIZE + 2] = to_local_start;
|
||||
|
@ -282,13 +274,6 @@ void recursive_quicksort(int *integers, int n, int root, MPI_Comm comm) {
|
|||
|
||||
// Send L to the correct target
|
||||
{
|
||||
for (int i = 0; i < p; ++i) {
|
||||
L_send_ctl[i * CTL_SIZE] = 0;
|
||||
L_send_ctl[i * CTL_SIZE + 1] = -1;
|
||||
L_send_ctl[i * CTL_SIZE + 2] = -1;
|
||||
L_send_ctl[i * CTL_SIZE + 3] = -1;
|
||||
}
|
||||
|
||||
for (int i = L_lo, dest_pos = L_global_start,
|
||||
processor = L_starting_process;
|
||||
i < L_hi;) {
|
||||
|
@ -305,11 +290,11 @@ void recursive_quicksort(int *integers, int n, int root, MPI_Comm comm) {
|
|||
int to_local_start = to_global_start - processor * n_over_p,
|
||||
to_local_end = to_global_end - processor * n_over_p;
|
||||
|
||||
printf("[%d] L ->> (count=%d), from local [%d..%d] {%d..%d} -to-> "
|
||||
"p#%d [%d..%d] {%d..%d}\n",
|
||||
rank, count, from_local_start, from_local_end, from_global_start,
|
||||
from_global_end, processor, to_local_start, to_local_end,
|
||||
to_global_start, to_global_end);
|
||||
// printf("[%d] L ->> (count=%d), from local [%d..%d] {%d..%d} -to-> "
|
||||
// "p#%d [%d..%d] {%d..%d}\n",
|
||||
// rank, count, from_local_start, from_local_end,
|
||||
// from_global_start, from_global_end, processor, to_local_start,
|
||||
// to_local_end, to_global_start, to_global_end);
|
||||
L_send_ctl[processor * CTL_SIZE] = count;
|
||||
L_send_ctl[processor * CTL_SIZE + 1] = from_global_start;
|
||||
L_send_ctl[processor * CTL_SIZE + 2] = to_local_start;
|
||||
|
@ -364,8 +349,9 @@ void recursive_quicksort(int *integers, int n, int root, MPI_Comm comm) {
|
|||
continue;
|
||||
}
|
||||
|
||||
printf("[%d] - S inbound from host %d to [%d..%d] (%d)\n", rank,
|
||||
sender_p, to_local_start, to_local_start + S_count, S_count);
|
||||
// printf("[%d] - S inbound from host %d to [%d..%d] (%d)\n", rank,
|
||||
// sender_p, to_local_start, to_local_start + S_count,
|
||||
// S_count);
|
||||
MPI_Recv(&integers_recv_2[to_local_start], S_count, MPI_INT, sender_p,
|
||||
124, comm, MPI_STATUS_IGNORE);
|
||||
for (int k = 0; k < S_count; ++k) {
|
||||
|
@ -380,15 +366,15 @@ void recursive_quicksort(int *integers, int n, int root, MPI_Comm comm) {
|
|||
int S_count = S_send_ctl[dest_p * CTL_SIZE];
|
||||
if (S_count > 0 && dest_p == host_p) {
|
||||
int from_local_start = S_send_ctl[dest_p * CTL_SIZE + 3];
|
||||
printf("[%d] - S outbound to host %d from [%d..%d] (%d)\n", rank,
|
||||
dest_p, from_local_start, from_local_start + S_count, S_count);
|
||||
// printf("[%d] - S outbound to host %d from [%d..%d] (%d)\n", rank,
|
||||
// dest_p, from_local_start, from_local_start + S_count,
|
||||
// S_count);
|
||||
MPI_Send(&integers[from_local_start], S_count, MPI_INT, dest_p, 124,
|
||||
comm);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
printf("[%d] S done\n", rank);
|
||||
|
||||
for (int host_p = 0; host_p < p; ++host_p) {
|
||||
if (rank == host_p) {
|
||||
|
@ -408,8 +394,9 @@ void recursive_quicksort(int *integers, int n, int root, MPI_Comm comm) {
|
|||
continue;
|
||||
}
|
||||
|
||||
printf("[%d] - L inbound from host %d to [%d..%d] (%d)\n", rank,
|
||||
sender_p, to_local_start, to_local_start + L_count, L_count);
|
||||
// printf("[%d] - L inbound from host %d to [%d..%d] (%d)\n", rank,
|
||||
// sender_p, to_local_start, to_local_start + L_count,
|
||||
// L_count);
|
||||
MPI_Recv(&integers_recv_2[to_local_start], L_count, MPI_INT, sender_p,
|
||||
125, comm, MPI_STATUS_IGNORE);
|
||||
for (int k = 0; k < L_count; ++k) {
|
||||
|
@ -424,49 +411,15 @@ void recursive_quicksort(int *integers, int n, int root, MPI_Comm comm) {
|
|||
int L_count = L_send_ctl[dest_p * CTL_SIZE];
|
||||
if (L_count > 0 && dest_p == host_p) {
|
||||
int from_local_start = L_send_ctl[dest_p * CTL_SIZE + 3];
|
||||
printf("[%d] - L outbound to host %d from [%d..%d] (%d)\n", rank,
|
||||
dest_p, from_local_start, from_local_start + L_count, L_count);
|
||||
// printf("[%d] - L outbound to host %d from [%d..%d] (%d)\n", rank,
|
||||
// dest_p, from_local_start, from_local_start + L_count,
|
||||
// L_count);
|
||||
MPI_Send(&integers[from_local_start], L_count, MPI_INT, dest_p, 125,
|
||||
comm);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
printf("[%d] L done\n", rank);
|
||||
|
||||
// for (int i = 0; i < p; ++i) {
|
||||
// int count = S_ctl[i * CTL_SIZE];
|
||||
// int from_global_start = S_ctl[i * CTL_SIZE + 1];
|
||||
// int to_local_start = S_ctl[i * CTL_SIZE + 2];
|
||||
|
||||
// if (count > 0) {
|
||||
// printf(
|
||||
// "[%d] <<- S received (%d) from processor %d {%d..%d} to
|
||||
// [%d..%d]\n", rank, count, i, from_global_start, from_global_start +
|
||||
// count, to_local_start, to_local_start + count);
|
||||
// for (int j = 0; j < count; ++j) {
|
||||
// integers[to_local_start + j] = integers_recv_buf[from_global_start +
|
||||
// j];
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
|
||||
// for (int i = 0; i < p; ++i) {
|
||||
// int count = L_ctl[i * CTL_SIZE];
|
||||
// int from_global_start = L_ctl[i * CTL_SIZE + 1];
|
||||
// int to_local_start = L_ctl[i * CTL_SIZE + 2];
|
||||
|
||||
// if (count > 0) {
|
||||
// printf(
|
||||
// "[%d] <<- S received (%d) from processor %d {%d..%d} to
|
||||
// [%d..%d]\n", rank, count, i, from_global_start, from_global_start +
|
||||
// count, to_local_start, to_local_start + count);
|
||||
// for (int j = 0; j < count; ++j) {
|
||||
// integers[to_local_start + j] = integers_recv_buf[from_global_start +
|
||||
// j];
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
|
||||
printf("[%d] after: %s\n", rank, string_of_list(integers_recv_3, n_over_p));
|
||||
for (int i = 0; i < n_over_p; ++i) {
|
||||
|
@ -527,3 +480,11 @@ void recursive_quicksort(int *integers, int n, int root, MPI_Comm comm) {
|
|||
// printf("[%d] Done recursing.\n", rank);
|
||||
// MPI_Comm_free(&child);
|
||||
}
|
||||
|
||||
void init_ctl(int *ctl, int len) {
|
||||
for (int i = 0; i < len; ++i) {
|
||||
for (int j = 0; j < CTL_SIZE; ++j) {
|
||||
ctl[i * CTL_SIZE + j] = -1;
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in a new issue