Note that there are some explanatory texts on larger screens.

plurals
  1. POOpenMPI matrix multiplication
    primarykey
    data
    text
    <p>Hey guys I'm trying to learn OpenMPI in C. I'm having a bit of trouble doing matrix multiplication with this program when I do it, the results are wrong. The program compiles , but I feel that my matrix multiplication algorithm is wrong somewhere. </p> <p>My approach to solving this problem is to use MPI_Scatter to scatter matrix A then transpose matrix B. Then MPI_Scatter matrix B. Once they are scattered I do the calculation for matrix multiplication and Gather the result back to the root process. I'm not sure if I'm missing something, but I don't fully understand Scatter and Gather yet. I know with Send you can send to individual processes and Recv from different processes, but how does this work with Scatter and Gather. Let me know if I made a mistake somewhere in this code. Thanks.</p> <p>My source code:</p> <pre><code>#define N 512 #include &lt;stdio.h&gt; #include &lt;math.h&gt; #include &lt;mpi.h&gt; #include &lt;sys/time.h&gt; print_results(char *prompt, float a[N][N]); int main(int argc, char *argv[]) { int size, rank, blksz, i, j, k; float a[N][N], b[N][N], c[N][N]; char *usage = "Usage: %s file\n"; float row[N][N], col[N][N]; FILE *fd; int portion, lowerbound, upperbound; double elapsed_time, start_time, end_time; struct timeval tv1, tv2; MPI_Init(&amp;argc, &amp;argv); MPI_Comm_rank(MPI_COMM_WORLD, &amp;rank); MPI_Comm_size(MPI_COMM_WORLD, &amp;size); blksz = (int) ceil((double) N / size); /* if (argc &lt; 2) { fprintf (stderr, usage, argv[0]); return -1; } if ((fd = fopen(argv[1], "r")) == NULL) { fprintf(stderr, "%s: Cannot open file %s for reading.\n", argv[0],argv[1]); fprintf(stderr, usage, argv[0]); return -1; } */ //Read input from file for matrices a and b. //The I/O is not timed because this I/O needs //to be done regardless of whether this program //is run sequentially on one processor or in //parallel on many processors. Therefore, it is //irrelevant when considering speedup. if (rank == 0) { for (i = 0; i &lt; N; i++) for (j = 0; j &lt; N; j++) a[i][j] = i + j; for (i = 0; i &lt; N; i++) for (j = 0; j &lt; N; j++) b[i][j] = i + j; /* for (i = 0; i &lt; N; i++) { for (j = i + 1; j &lt; N; j++) { int temp = b[i][j]; b[i][j] = b[j][i]; b[j][i] = temp; } } */ } //TODO: Add a barrier prior to the time stamp. MPI_Barrier(MPI_COMM_WORLD); // Take a time stamp gettimeofday(&amp;tv1, NULL); //TODO: Scatter the input matrices a and b. MPI_Scatter(a, blksz * N, MPI_FLOAT, row, blksz * N, MPI_FLOAT, 0, MPI_COMM_WORLD); MPI_Scatter(b, blksz * N, MPI_FLOAT, col, blksz * N, MPI_FLOAT, 0, MPI_COMM_WORLD); //TODO: Add code to implement matrix multiplication (C=AxB) in parallel. for (i = 0; i &lt; blksz &amp;&amp; rank * blksz + i &lt; N; i++) { for (j = 0; j &lt; N; j++) { c[i][j] = 0.0; for (k = 0; k &lt; N; k++) { c[i][j] += row[i][j] * col[j][k]; } } } //TODO: Gather partial result back to the master process. MPI_Gather(c, blksz * N, MPI_FLOAT, c, blksz * N, MPI_FLOAT, 0, MPI_COMM_WORLD); // Take a time stamp. This won't happen until after the master // process has gathered all the input from the other processes. gettimeofday(&amp;tv2, NULL); elapsed_time = (tv2.tv_sec - tv1.tv_sec) + ((tv2.tv_usec - tv1.tv_usec) / 1000000.0); printf("elapsed_time=\t%lf (seconds)\n", elapsed_time); // print results MPI_Barrier(MPI_COMM_WORLD); print_results("C = ", c); MPI_Finalize(); } print_results(char *prompt, float a[N][N]) { int i, j; printf("\n\n%s\n", prompt); for (i = 0; i &lt; N; i++) { for (j = 0; j &lt; N; j++) { printf(" %.2f", a[i][j]); } printf("\n"); } printf("\n\n"); } </code></pre>
    singulars
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload