Implement an MPI program to perform matrixmatrix multiplicat
Implement an MPI program to perform matrix-matrix multiplication AB where A and B are both 128x128 random matrices with entries between 0 and 1. Run the code for 2, 4 and 8 processors.
Solution
Answer:
MIPS Assembly Language Code :
.zero 1
 .LC0:
 .string \"Enter rows and columns for first matrix: \"
 .LC1:
 .string \"Enter rows and columns for second matrix: \"
 .LC2:
 .string \"Error! column of first matrix not equal to row of second.\"
 .LC3:
 .string \"Enter elements of matrix 1:\"
 .LC4:
 .string \"Enter element a\"
 .LC5:
 .string \" : \"
 .LC6:
 .string \"Enter elements of matrix 2:\"
 .LC7:
 .string \"Enter element b\"
 .LC8:
 .string \"The Multiplication of matrix is: \"
 .LC9:
 .string \" \"
 main:
 push rbp
 mov rbp, rsp
 push r12
 push rbx
 sub rsp, 1232
 mov esi, OFFSET FLAT:.LC0
 mov edi, OFFSET FLAT:std::cout
 call std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)
 lea rax, [rbp-1236]
 mov rsi, rax
 mov edi, OFFSET FLAT:std::cin
 call std::basic_istream<char, std::char_traits<char> >::operator>>(int&)
 mov rdx, rax
 lea rax, [rbp-1240]
 mov rsi, rax
 mov rdi, rdx
 call std::basic_istream<char, std::char_traits<char> >::operator>>(int&)
 mov esi, OFFSET FLAT:.LC1
 mov edi, OFFSET FLAT:std::cout
 call std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)
 lea rax, [rbp-1244]
 mov rsi, rax
 mov edi, OFFSET FLAT:std::cin
 call std::basic_istream<char, std::char_traits<char> >::operator>>(int&)
 mov rdx, rax
 lea rax, [rbp-1248]
 mov rsi, rax
 mov rdi, rdx
 call std::basic_istream<char, std::char_traits<char> >::operator>>(int&)
 .L3:
 mov edx, DWORD PTR [rbp-1240]
 mov eax, DWORD PTR [rbp-1244]
 cmp edx, eax
 je .L2
 mov esi, OFFSET FLAT:.LC2
 mov edi, OFFSET FLAT:std::cout
 call std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)
 mov esi, OFFSET FLAT:.LC0
 mov edi, OFFSET FLAT:std::cout
 call std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)
 lea rax, [rbp-1236]
 mov rsi, rax
 mov edi, OFFSET FLAT:std::cin
 call std::basic_istream<char, std::char_traits<char> >::operator>>(int&)
 mov rdx, rax
 lea rax, [rbp-1240]
 mov rsi, rax
 mov rdi, rdx
 call std::basic_istream<char, std::char_traits<char> >::operator>>(int&)
 mov esi, OFFSET FLAT:.LC1
 mov edi, OFFSET FLAT:std::cout
 call std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)
 lea rax, [rbp-1244]
 mov rsi, rax
 mov edi, OFFSET FLAT:std::cin
 call std::basic_istream<char, std::char_traits<char> >::operator>>(int&)
 mov rdx, rax
 lea rax, [rbp-1248]
 mov rsi, rax
 mov rdi, rdx
 call std::basic_istream<char, std::char_traits<char> >::operator>>(int&)
 jmp .L3
 .L2:
 mov esi, OFFSET FLAT:std::basic_ostream<char, std::char_traits<char> >& std::endl<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&)
 mov edi, OFFSET FLAT:std::cout
 call std::basic_ostream<char, std::char_traits<char> >::operator<<(std::basic_ostream<char, std::char_traits<char> >& (*)(std::basic_ostream<char, std::char_traits<char> >&))
 mov esi, OFFSET FLAT:.LC3
 mov rdi, rax
 call std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)
 mov esi, OFFSET FLAT:std::basic_ostream<char, std::char_traits<char> >& std::endl<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&)
 mov rdi, rax
 call std::basic_ostream<char, std::char_traits<char> >::operator<<(std::basic_ostream<char, std::char_traits<char> >& (*)(std::basic_ostream<char, std::char_traits<char> >&))
 mov DWORD PTR [rbp-20], 0
 .L7:
 mov eax, DWORD PTR [rbp-1236]
 cmp DWORD PTR [rbp-20], eax
 jge .L4
 mov DWORD PTR [rbp-24], 0
 .L6:
 mov eax, DWORD PTR [rbp-1240]
 cmp DWORD PTR [rbp-24], eax
 jge .L5
 mov eax, DWORD PTR [rbp-24]
 lea ebx, [rax+1]
 mov eax, DWORD PTR [rbp-20]
 lea r12d, [rax+1]
 mov esi, OFFSET FLAT:.LC4
 mov edi, OFFSET FLAT:std::cout
 call std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)
 mov esi, r12d
 mov rdi, rax
 call std::basic_ostream<char, std::char_traits<char> >::operator<<(int)
 mov esi, ebx
 mov rdi, rax
 call std::basic_ostream<char, std::char_traits<char> >::operator<<(int)
 mov esi, OFFSET FLAT:.LC5
 mov rdi, rax
 call std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)
 lea rcx, [rbp-432]
 mov eax, DWORD PTR [rbp-24]
 movsx rsi, eax
 mov eax, DWORD PTR [rbp-20]
 movsx rdx, eax
 mov rax, rdx
 sal rax, 2
 add rax, rdx
 add rax, rax
 add rax, rsi
 sal rax, 2
 add rax, rcx
 mov rsi, rax
 mov edi, OFFSET FLAT:std::cin
 call std::basic_istream<char, std::char_traits<char> >::operator>>(int&)
 add DWORD PTR [rbp-24], 1
 jmp .L6
 .L5:
 add DWORD PTR [rbp-20], 1
 jmp .L7
 .L4:
 mov esi, OFFSET FLAT:std::basic_ostream<char, std::char_traits<char> >& std::endl<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&)
 mov edi, OFFSET FLAT:std::cout
 call std::basic_ostream<char, std::char_traits<char> >::operator<<(std::basic_ostream<char, std::char_traits<char> >& (*)(std::basic_ostream<char, std::char_traits<char> >&))
 mov esi, OFFSET FLAT:.LC6
 mov rdi, rax
 call std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)
 mov esi, OFFSET FLAT:std::basic_ostream<char, std::char_traits<char> >& std::endl<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&)
 mov rdi, rax
 call std::basic_ostream<char, std::char_traits<char> >::operator<<(std::basic_ostream<char, std::char_traits<char> >& (*)(std::basic_ostream<char, std::char_traits<char> >&))
 mov DWORD PTR [rbp-20], 0
 .L11:
 mov eax, DWORD PTR [rbp-1244]
 cmp DWORD PTR [rbp-20], eax
 jge .L8
 mov DWORD PTR [rbp-24], 0
 .L10:
 mov eax, DWORD PTR [rbp-1248]
 cmp DWORD PTR [rbp-24], eax
 jge .L9
 mov eax, DWORD PTR [rbp-24]
 lea ebx, [rax+1]
 mov eax, DWORD PTR [rbp-20]
 lea r12d, [rax+1]
 mov esi, OFFSET FLAT:.LC7
 mov edi, OFFSET FLAT:std::cout
 call std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)
 mov esi, r12d
 mov rdi, rax
 call std::basic_ostream<char, std::char_traits<char> >::operator<<(int)
 mov esi, ebx
 mov rdi, rax
 call std::basic_ostream<char, std::char_traits<char> >::operator<<(int)
 mov esi, OFFSET FLAT:.LC5
 mov rdi, rax
 call std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)
 lea rcx, [rbp-832]
 mov eax, DWORD PTR [rbp-24]
 movsx rsi, eax
 mov eax, DWORD PTR [rbp-20]
 movsx rdx, eax
 mov rax, rdx
 sal rax, 2
 add rax, rdx
 add rax, rax
 add rax, rsi
 sal rax, 2
 add rax, rcx
 mov rsi, rax
 mov edi, OFFSET FLAT:std::cin
 call std::basic_istream<char, std::char_traits<char> >::operator>>(int&)
 add DWORD PTR [rbp-24], 1
 jmp .L10
 .L9:
 add DWORD PTR [rbp-20], 1
 jmp .L11
 .L8:
 mov DWORD PTR [rbp-20], 0
 .L15:
 mov eax, DWORD PTR [rbp-1236]
 cmp DWORD PTR [rbp-20], eax
 jge .L12
 mov DWORD PTR [rbp-24], 0
 .L14:
 mov eax, DWORD PTR [rbp-1248]
 cmp DWORD PTR [rbp-24], eax
 jge .L13
 mov eax, DWORD PTR [rbp-24]
 movsx rcx, eax
 mov eax, DWORD PTR [rbp-20]
 movsx rdx, eax
 mov rax, rdx
 sal rax, 2
 add rax, rdx
 add rax, rax
 add rax, rcx
 mov DWORD PTR [rbp-1232+rax*4], 0
 add DWORD PTR [rbp-24], 1
 jmp .L14
 .L13:
 add DWORD PTR [rbp-20], 1
 jmp .L15
 .L12:
 mov DWORD PTR [rbp-20], 0
 .L21:
 mov eax, DWORD PTR [rbp-1236]
 cmp DWORD PTR [rbp-20], eax
 jge .L16
 mov DWORD PTR [rbp-24], 0
 .L20:
 mov eax, DWORD PTR [rbp-1248]
 cmp DWORD PTR [rbp-24], eax
 jge .L17
 mov DWORD PTR [rbp-28], 0
 .L19:
 mov eax, DWORD PTR [rbp-1240]
 cmp DWORD PTR [rbp-28], eax
 jge .L18
 mov eax, DWORD PTR [rbp-24]
 movsx rcx, eax
 mov eax, DWORD PTR [rbp-20]
 movsx rdx, eax
 mov rax, rdx
 sal rax, 2
 add rax, rdx
 add rax, rax
 add rax, rcx
 mov ecx, DWORD PTR [rbp-1232+rax*4]
 mov eax, DWORD PTR [rbp-28]
 movsx rsi, eax
 mov eax, DWORD PTR [rbp-20]
 movsx rdx, eax
 mov rax, rdx
 sal rax, 2
 add rax, rdx
 add rax, rax
 add rax, rsi
 mov esi, DWORD PTR [rbp-432+rax*4]
 mov eax, DWORD PTR [rbp-24]
 movsx rdi, eax
 mov eax, DWORD PTR [rbp-28]
 movsx rdx, eax
 mov rax, rdx
 sal rax, 2
 add rax, rdx
 add rax, rax
 add rax, rdi
 mov eax, DWORD PTR [rbp-832+rax*4]
 imul eax, esi
 add ecx, eax
 mov eax, DWORD PTR [rbp-24]
 movsx rsi, eax
 mov eax, DWORD PTR [rbp-20]
 movsx rdx, eax
 mov rax, rdx
 sal rax, 2
 add rax, rdx
 add rax, rax
 add rax, rsi
 mov DWORD PTR [rbp-1232+rax*4], ecx
 add DWORD PTR [rbp-28], 1
 jmp .L19
 .L18:
 add DWORD PTR [rbp-24], 1
 jmp .L20
 .L17:
 add DWORD PTR [rbp-20], 1
 jmp .L21
 .L16:
 mov esi, OFFSET FLAT:std::basic_ostream<char, std::char_traits<char> >& std::endl<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&)
 mov edi, OFFSET FLAT:std::cout
 call std::basic_ostream<char, std::char_traits<char> >::operator<<(std::basic_ostream<char, std::char_traits<char> >& (*)(std::basic_ostream<char, std::char_traits<char> >&))
 mov esi, OFFSET FLAT:.LC8
 mov rdi, rax
 call std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)
 mov esi, OFFSET FLAT:std::basic_ostream<char, std::char_traits<char> >& std::endl<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&)
 mov rdi, rax
 call std::basic_ostream<char, std::char_traits<char> >::operator<<(std::basic_ostream<char, std::char_traits<char> >& (*)(std::basic_ostream<char, std::char_traits<char> >&))
 mov DWORD PTR [rbp-20], 0
 .L26:
 mov eax, DWORD PTR [rbp-1236]
 cmp DWORD PTR [rbp-20], eax
 jge .L22
 mov DWORD PTR [rbp-24], 0
 .L25:
 mov eax, DWORD PTR [rbp-1248]
 cmp DWORD PTR [rbp-24], eax
 jge .L23
 mov eax, DWORD PTR [rbp-24]
 movsx rcx, eax
 mov eax, DWORD PTR [rbp-20]
 movsx rdx, eax
 mov rax, rdx
 sal rax, 2
 add rax, rdx
 add rax, rax
 add rax, rcx
 mov ebx, DWORD PTR [rbp-1232+rax*4]
 mov esi, OFFSET FLAT:.LC9
 mov edi, OFFSET FLAT:std::cout
 call std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)
 mov esi, ebx
 mov rdi, rax
 call std::basic_ostream<char, std::char_traits<char> >::operator<<(int)
 mov eax, DWORD PTR [rbp-1248]
 sub eax, 1
 cmp eax, DWORD PTR [rbp-24]
 jne .L24
 mov esi, OFFSET FLAT:std::basic_ostream<char, std::char_traits<char> >& std::endl<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&)
 mov edi, OFFSET FLAT:std::cout
 call std::basic_ostream<char, std::char_traits<char> >::operator<<(std::basic_ostream<char, std::char_traits<char> >& (*)(std::basic_ostream<char, std::char_traits<char> >&))
 .L24:
 add DWORD PTR [rbp-24], 1
 jmp .L25
 .L23:
 add DWORD PTR [rbp-20], 1
 jmp .L26
 .L22:
 mov eax, 0
 add rsp, 1232
 pop rbx
 pop r12
 pop rbp
 ret
 __static_initialization_and_destruction_0(int, int):
 push rbp
 mov rbp, rsp
 sub rsp, 16
 mov DWORD PTR [rbp-4], edi
 mov DWORD PTR [rbp-8], esi
 cmp DWORD PTR [rbp-4], 1
 jne .L30
 cmp DWORD PTR [rbp-8], 65535
 jne .L30
 mov edi, OFFSET FLAT:std::__ioinit
 call std::ios_base::Init::Init()
 mov edx, OFFSET FLAT:__dso_handle
 mov esi, OFFSET FLAT:std::__ioinit
 mov edi, OFFSET FLAT:std::ios_base::Init::~Init()
 call __cxa_atexit
 .L30:
 nop
 leave
 ret
 push rbp
 mov rbp, rsp
 mov esi, 65535
 mov edi, 1
 call __static_initialization_and_destruction_0(int, int)
 pop rbp
 ret







