# hw1-1 ```cpp= /* circuitSatifiability.c solves the ppppp * Problem using a brute-force sequential solution. * * The particular circuit being tested is "wired" into the * logic of function 'checkCircuit'. All combinations of * inputs that satisfy the circuit are printed. * * 16-bit version by Michael J. Quinn, Sept 2002. * Extended to 32 bits by Joel C. Adams, Sept 2013. */ #include <stdio.h> // printf() #include <limits.h> // UINT_MAX #include <mpi.h> int checkCircuit (int, int, int); int main (int argc, char *argv[]) { int i; /* loop variable (32 bits) */ int myid = 0; /* process myid */ int count = 0; /* number of solutions */ int size; /* number of process */ double startTime = 0.0, totalTime = 0.0; MPI_Init(&argc, &argv); MPI_Comm_size(MPI_COMM_WORLD, &size); MPI_Comm_rank(MPI_COMM_WORLD, &myid); /* for (i = 0; i <= USHRT_MAX; i++) { * count += checkCircuit (myid, i); * } */ for (i = myid; i <= USHRT_MAX; i+=size) { count += checkCircuit (myid, i, size); } startTime = MPI_Wtime(); /* start timer */ if(myid == 0){ int recv_count; /* buffer for recieve*/ MPI_Status status; for(i = 1; i < size; i++){ MPI_Recv(&recv_count, 1, MPI_INT, i, 1, MPI_COMM_WORLD, &status); count += recv_count; } printf("\nA total of %d solutions were found.\n\n", count); } else MPI_Send(&count, 1, MPI_INT, 0, 1, MPI_COMM_WORLD); totalTime = MPI_Wtime() - startTime; printf ("Process %d finished in time of %f secs.\n", myid, totalTime); MPI_Finalize(); return 0; } /* EXTRACT_BIT is a macro that extracts the ith bit of number n. * * parameters: n, a number; * i, the position of the bit we want to know. * * return: 1 if 'i'th bit of 'n' is 1; 0 otherwise */ #define EXTRACT_BIT(n,i) ( (n & (1<<i) ) ? 1 : 0) /* checkCircuit() checks the circuit for a given input. * parameters: id, the id of the process checking; * bits, the (long) rep. of the input being checked. * * output: the binary rep. of bits if the circuit outputs 1 * return: 1 if the circuit outputs 1; 0 otherwise. */ #define SIZE 16 int checkCircuit (int id, int bits, int size) { int v[SIZE]; /* Each element is a bit of bits */ int i; for (i = 0; i < SIZE; i++) v[i] = EXTRACT_BIT(bits,i); if ( (v[0] || v[1]) && (!v[1] || !v[3]) && (v[2] || v[3]) && (!v[3] || !v[4]) && (v[4] || !v[5]) && (v[5] || !v[6]) && (v[5] || v[6]) && (v[6] || !v[15]) && (v[7] || !v[8]) && (!v[7] || !v[13]) && (v[8] || v[9]) && (v[8] || !v[9]) && (!v[9] || !v[10]) && (v[9] || v[11]) && (v[10] || v[11]) && (v[12] || v[13]) && (v[13] || !v[14]) && (v[14] || v[15]) ) { printf ("[%d/%d] %d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d \n", id, size, v[15],v[14],v[13],v[12], v[11],v[10],v[9],v[8],v[7],v[6],v[5],v[4],v[3],v[2],v[1],v[0]); fflush (stdout); return 1; } else { return 0; } } ```