# Multiplication matrix matrix MPI

hello guys, maybe a bit strange request, but could you help me write a matrix multiplication algorithm.
I’m quite new to parallel computing, but I have a task ahead of me with a very tight deadline.
So for now, all I can do is ask for help.
So far, all that I have been able to implement is the distribution of matrices across processes, but the multiplication logic itself cannot be done

``````
using MPI

function split_count(N::Integer, n::Integer)
q,r = divrem(N, n)
return [i <= r ? q+1 : q for i = 1:n]
end

MPI.Init()
comm = MPI.COMM_WORLD
rank = MPI.Comm_rank(comm)
comm_size = MPI.Comm_size(comm)

root = 0

if rank == root
N = 4

A = rand(Float64, N, N)
B = rand(Float64, N, N)
println("series = ", A*B)
result = similar(A)
M_counts = [N for i = 1:comm_size]
N_counts = split_count(N, comm_size)

sizes = vcat(M_counts', N_counts')
size_ubuf = UBuffer(sizes, 2)
counts = vec(prod(sizes, dims=1))

A_vbuf = VBuffer(A, counts)
B_vbuf = VBuffer(B, counts)
result_vbuf = VBuffer(result, counts)
else
size_ubuf = UBuffer(nothing)
result_vbuf = A_vbuf = VBuffer(nothing)
B_vbuf = VBuffer(nothing)
end

local_size = MPI.Scatter(size_ubuf, NTuple{2,Int}, root, comm)
local_A = MPI.Scatterv!(A_vbuf, zeros(Float64, local_size), root, comm)
local_B = MPI.Scatterv!(B_vbuf, zeros(Float64, local_size), root, comm)

####
#multiplication
####

println("parallel = ", comp)

MPI.Barrier(comm)
MPI.Gatherv!(comp, result_vbuf, root, comm)

if rank == root
println()
println("Final matrix")
println("================")
@show result
end
``````

Have you considered just using a library like GitHub - JuliaParallel/Elemental.jl: Julia interface to the Elemental linear algebra library.?

unfortunately I don’t consider such options, the task is to write a program specifically on MPI

Is this some sort of homework problem (a task with a tight deadline for which you aren’t allowed to use existing tools out there)?

2 Likes

you can say so