Test more

main
Gasper Spagnolo 2022-12-17 03:44:31 -05:00
parent ffa731dfa8
commit 08d5a84f10
1 changed files with 87 additions and 84 deletions

View File

@ -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