diff --git a/docs/src/solutions_for_all_notebooks.md b/docs/src/solutions_for_all_notebooks.md index 1940fdf..5249aa0 100644 --- a/docs/src/solutions_for_all_notebooks.md +++ b/docs/src/solutions_for_all_notebooks.md @@ -395,5 +395,42 @@ function jacobi_mpi(n,niters,tol,comm) # new tol arg end ``` +## All pairs of shortest paths + +### Exercise 1 + +```julia +function floyd_iterations!(myC,comm) + L = size(myC,1) + N = size(myC,2) + rank = MPI.Comm_rank(comm) + P = MPI.Comm_size(comm) + lb = L*rank+1 + ub = L*(rank+1) + C_k = similar(myC,N) + for k in 1:N + if (lb<=k) && (k<=ub) + # If I have the row, fill in the buffer + myk = (k-lb)+1 + C_k[:] = view(myC,myk,:) + end + # We need to find out the owner of row k. + # Easy since N is a multiple of P + root = div(k-1,L) + MPI.Bcast!(C_k,comm;root) + # Now, we have the data dependencies and + # we can do the updates locally + for j in 1:N + for i in 1:L + myC[i,j] = min(myC[i,j],myC[i,k]+C_k[j]) + end + end + end + myC +end +``` + + + diff --git a/notebooks/asp.ipynb b/notebooks/asp.ipynb index 5c6a5e5..9188920 100644 --- a/notebooks/asp.ipynb +++ b/notebooks/asp.ipynb @@ -57,7 +57,7 @@ "function q1_answer(bool)\n", " bool || return\n", " msg = \"\"\"\n", - " The we can change the loop order over i and j without changing the result. Rememebr:\n", + " The we can change the loop order over i and j without changing the result. Rememeber:\n", " \n", " C[i,j] = min(C[i,j],C[i,k]+C[k,j])\n", " \n", @@ -858,7 +858,7 @@ " P = MPI.Comm_size(comm)\n", " lb = L*rank+1\n", " ub = L*(rank+1)\n", - " C_k = similar(C,N)\n", + " C_k = similar(myC,N)\n", " for k in 1:N\n", " if (lb<=k) && (k<=ub)\n", " # Send row k to other workers if I have it\n",