Test more
parent
ffa731dfa8
commit
08d5a84f10
171
dn7/server.c
171
dn7/server.c
|
@ -13,55 +13,55 @@
|
||||||
#define DEBUG 0
|
#define DEBUG 0
|
||||||
|
|
||||||
void segfault_handler(int sig) {
|
void segfault_handler(int sig) {
|
||||||
void *array[10];
|
void *array[10];
|
||||||
size_t size;
|
size_t size;
|
||||||
|
|
||||||
size = backtrace(array, 10);
|
size = backtrace(array, 10);
|
||||||
|
|
||||||
fprintf(stderr, "[-] Error: signal %d:\n", sig);
|
fprintf(stderr, "[-] Error: signal %d:\n", sig);
|
||||||
backtrace_symbols_fd(array, size, STDERR_FILENO);
|
backtrace_symbols_fd(array, size, STDERR_FILENO);
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
int* setup_send_array(int size) {
|
int* setup_send_array(int size) {
|
||||||
int *arr = (int *)malloc(size * sizeof(int));
|
int *arr = (int *)malloc(size * sizeof(int));
|
||||||
|
|
||||||
if(arr == NULL) {
|
if(arr == NULL) {
|
||||||
printf("[-] Error: malloc failed!\n");
|
printf("[-] Error: malloc failed!\n");
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int i = 0; i < size; i++) {
|
for (int i = 0; i < size; i++) {
|
||||||
if (i % 2 == 0 ){
|
if (i % 2 == 0 ){
|
||||||
arr[i] = 1;
|
arr[i] = 1;
|
||||||
} else {
|
} else {
|
||||||
arr[i] = 0;
|
arr[i] = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Set random bit to two
|
// Set random bit to two
|
||||||
arr[rand() % size] = 2;
|
arr[rand() % size] = 2;
|
||||||
return arr;
|
return arr;
|
||||||
}
|
}
|
||||||
|
|
||||||
int* setup_recv_array(int n_elements) {
|
int* setup_recv_array(int n_elements) {
|
||||||
int *recv_arr = (int *)malloc(n_elements * sizeof(int));
|
int *recv_arr = (int *)malloc(n_elements * sizeof(int));
|
||||||
|
|
||||||
if(recv_arr == NULL) {
|
if(recv_arr == NULL) {
|
||||||
printf("[-] Error: malloc failed!\n");
|
printf("[-] Error: malloc failed!\n");
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int i = 0; i < n_elements; i++) {
|
for (int i = 0; i < n_elements; i++) {
|
||||||
recv_arr[i] = 0;
|
recv_arr[i] = 0;
|
||||||
}
|
}
|
||||||
return recv_arr;
|
return recv_arr;
|
||||||
}
|
}
|
||||||
|
|
||||||
void setup_displacements_and_counts(int *displacements, int *counts, int ntasks) {
|
void setup_displacements_and_counts(int *displacements, int *counts, int ntasks) {
|
||||||
for(int i = 0; i < ntasks; i++) {
|
for(int i = 0; i < ntasks; i++) {
|
||||||
displacements[i] = (int) (ARRAY_SIZE / ntasks * i); // my_start
|
displacements[i] = (int) (ARRAY_SIZE / ntasks * i); // my_start
|
||||||
counts[i] = (int) (ARRAY_SIZE / ntasks * (i + 1)) - displacements[i]; // my_end - my_start
|
counts[i] = (int) (ARRAY_SIZE / ntasks * (i + 1)) - displacements[i]; // my_end - my_start
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void throw_err(int line, int err_code) {
|
void throw_err(int line, int err_code) {
|
||||||
|
@ -74,17 +74,17 @@ void throw_err(int line, int err_code) {
|
||||||
|
|
||||||
int main(int argc, char* argv[])
|
int main(int argc, char* argv[])
|
||||||
{
|
{
|
||||||
int taskid, ntasks;
|
int taskid, ntasks;
|
||||||
int *send_arr, *recv_arr;
|
int *send_arr, *recv_arr;
|
||||||
int *displacements, *counts;
|
int *displacements, *counts;
|
||||||
|
|
||||||
double start_time = MPI_Wtime();
|
double start_time = MPI_Wtime();
|
||||||
|
|
||||||
MPI_Init(&argc, &argv);
|
MPI_Init(&argc, &argv);
|
||||||
signal(SIGSEGV, segfault_handler);
|
signal(SIGSEGV, segfault_handler);
|
||||||
|
|
||||||
MPI_Comm_rank(MPI_COMM_WORLD, &taskid);
|
MPI_Comm_rank(MPI_COMM_WORLD, &taskid);
|
||||||
MPI_Comm_size(MPI_COMM_WORLD, &ntasks);
|
MPI_Comm_size(MPI_COMM_WORLD, &ntasks);
|
||||||
MPI_Request request;
|
MPI_Request request;
|
||||||
MPI_Status status;
|
MPI_Status status;
|
||||||
int flag = 0;
|
int flag = 0;
|
||||||
|
@ -92,56 +92,58 @@ int main(int argc, char* argv[])
|
||||||
int message_len = strlen(message) + 1;
|
int message_len = strlen(message) + 1;
|
||||||
char recv_message[message_len];
|
char recv_message[message_len];
|
||||||
|
|
||||||
if(DEBUG) {
|
if(DEBUG) {
|
||||||
printf("[+] Task %d has started...\n", taskid);
|
printf("[+] Task %d has started...\n", taskid);
|
||||||
fflush(stdout);
|
fflush(stdout);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (taskid == 0) {
|
if (taskid == 0) {
|
||||||
//Setup array that we need to sort
|
//Setup array that we need to sort
|
||||||
send_arr = setup_send_array(ARRAY_SIZE);
|
send_arr = setup_send_array(ARRAY_SIZE);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Allocate memory for send_displacements and send_counts
|
// Allocate memory for send_displacements and send_counts
|
||||||
displacements = (int *)malloc(ntasks * sizeof(int));
|
displacements = (int *)malloc(ntasks * sizeof(int));
|
||||||
counts = (int *)malloc(ntasks * sizeof(int));
|
counts = (int *)malloc(ntasks * sizeof(int));
|
||||||
|
|
||||||
if(displacements == NULL || counts == NULL) {
|
if(displacements == NULL || counts == NULL) {
|
||||||
printf("[-] Error: malloc failed!\n");
|
printf("[-] Error: malloc failed!\n");
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Setup displacements and counts
|
// Setup displacements and counts
|
||||||
setup_displacements_and_counts(displacements, counts, ntasks);
|
setup_displacements_and_counts(displacements, counts, ntasks);
|
||||||
|
|
||||||
if(DEBUG) {
|
if(DEBUG) {
|
||||||
printf("[+] Setup displacements and counts done!\n");
|
printf("[+] Setup displacements and counts done!\n");
|
||||||
fflush(stdout);
|
fflush(stdout);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Setup recv array
|
// Setup recv array
|
||||||
recv_arr = setup_recv_array(counts[taskid]);
|
recv_arr = setup_recv_array(counts[taskid]);
|
||||||
|
|
||||||
if(DEBUG) {
|
if(DEBUG) {
|
||||||
printf("[+] Setup done!\n");
|
printf("[+] Setup done!\n");
|
||||||
fflush(stdout);
|
fflush(stdout);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(MPI_Barrier(MPI_COMM_WORLD) != MPI_SUCCESS)
|
if(MPI_Barrier(MPI_COMM_WORLD) != MPI_SUCCESS)
|
||||||
throw_err(__LINE__, errno);
|
throw_err(__LINE__, errno);
|
||||||
|
|
||||||
// Scatterv array to all processes
|
// Scatterv array to all processes
|
||||||
if(MPI_Scatterv(send_arr, counts, displacements , MPI_INT, recv_arr, ARRAY_SIZE, MPI_INT, 0, MPI_COMM_WORLD) != MPI_SUCCESS)
|
if(MPI_Scatterv(send_arr, counts, displacements , MPI_INT, recv_arr, ARRAY_SIZE, MPI_INT, 0, MPI_COMM_WORLD) != MPI_SUCCESS)
|
||||||
throw_err(__LINE__, errno);
|
throw_err(__LINE__, errno);
|
||||||
|
|
||||||
MPI_Irecv(recv_message, message_len, MPI_CHAR, 0, 0, MPI_COMM_WORLD, &request);
|
if(MPI_Irecv(recv_message, message_len, MPI_CHAR, 0, 0, MPI_COMM_WORLD, &request))
|
||||||
|
throw_err(__LINE__, errno);
|
||||||
|
|
||||||
|
|
||||||
for(int i =0; i < counts[taskid]; i++) {
|
for(int i =0; i < counts[taskid]; i++) {
|
||||||
if(DEBUG)
|
if(DEBUG)
|
||||||
printf("%d ", recv_arr[i]);
|
printf("%d ", recv_arr[i]);
|
||||||
if(i % 20 == 0) {
|
if(i % 20 == 0) {
|
||||||
MPI_Test(&request, &flag, &status);
|
if(MPI_Test(&request, &flag, &status))
|
||||||
|
throw_err(__LINE__, errno);
|
||||||
if(flag) {
|
if(flag) {
|
||||||
printf("[+] Recieved stop signal!\n");
|
printf("[+] Recieved stop signal!\n");
|
||||||
break;
|
break;
|
||||||
|
@ -149,30 +151,31 @@ int main(int argc, char* argv[])
|
||||||
}
|
}
|
||||||
if(recv_arr[i] == 2) {
|
if(recv_arr[i] == 2) {
|
||||||
printf("[+] Found 2 at index %d! --> taskid: %d\n", displacements[taskid] + i, taskid);
|
printf("[+] Found 2 at index %d! --> taskid: %d\n", displacements[taskid] + i, taskid);
|
||||||
MPI_Isend(message, message_len, MPI_CHAR, 0, 0, MPI_COMM_WORLD, &request);
|
if(MPI_Isend(message, message_len, MPI_CHAR, 0, 0, MPI_COMM_WORLD, &request))
|
||||||
|
throw_err(__LINE__, errno);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Gather the array
|
// Gather the array
|
||||||
if(MPI_Gatherv(recv_arr, counts[taskid], MPI_INT, send_arr, counts, displacements, MPI_INT, 0, MPI_COMM_WORLD))
|
if(MPI_Gatherv(recv_arr, counts[taskid], MPI_INT, send_arr, counts, displacements, MPI_INT, 0, MPI_COMM_WORLD))
|
||||||
throw_err(__LINE__, errno);
|
throw_err(__LINE__, errno);
|
||||||
|
|
||||||
|
|
||||||
if (taskid == 0) {
|
if (taskid == 0) {
|
||||||
if(DEBUG) {
|
if(DEBUG) {
|
||||||
for(int i = 0; i < ARRAY_SIZE; i++) {
|
for(int i = 0; i < ARRAY_SIZE; i++) {
|
||||||
printf("%d ", send_arr[i]);
|
printf("%d ", send_arr[i]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
double total_time = MPI_Wtime() - start_time;
|
double total_time = MPI_Wtime() - start_time;
|
||||||
|
|
||||||
printf("\nTotal time: %f\n", total_time);
|
printf("\nTotal time: %f\n", total_time);
|
||||||
}
|
}
|
||||||
|
|
||||||
MPI_Finalize();
|
MPI_Finalize();
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
// 1: 0.616473
|
// 1: 0.616473
|
||||||
// 2: 0.742917
|
// 2: 0.742917
|
||||||
|
|
Loading…
Reference in New Issue