Skip to content

Commit

Permalink
remove associates and use variable payload size
Browse files Browse the repository at this point in the history
  • Loading branch information
everythingfunctional committed Jul 26, 2023
1 parent 3278863 commit d48f6ba
Show file tree
Hide file tree
Showing 3 changed files with 76 additions and 98 deletions.
112 changes: 55 additions & 57 deletions example/lu_decomp/lu_decom_app_m.f90
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ function generate_application() result(dag)

real(wp), allocatable :: matrix(:,:)

integer :: matrix_size, step, row, num_tasks
integer :: matrix_size, step, row, num_tasks, latest_matrix, task_base, reconstruction_step
integer :: arg_len, fu, i
character(len=:), allocatable :: arg

Expand Down Expand Up @@ -92,23 +92,20 @@ function generate_application() result(dag)
vertices(2) = vertex_t([1], print_matrix_t(0))
do step = 1, matrix_size-1
do row = step+1, matrix_size
associate( &
latest_matrix => 1 + sum([(3*(matrix_size-i), i = 1, step-1)]) + 2*(step-1), & ! reconstructed matrix from last step
task_base => sum([(3*(matrix_size-i), i = 1, step-1)]) + 2*(step-1) + 3*(row-(step+1)))
vertices(3+task_base) = vertex_t([latest_matrix], calc_factor_t(row=row, step=step))
vertices(4+task_base) = vertex_t([latest_matrix, 3+task_base], row_multiply_t(step=step))
vertices(5+task_base) = vertex_t([latest_matrix, 4+task_base], row_subtract_t(row=row))
end associate
latest_matrix = 1 + sum([(3*(matrix_size-i), i = 1, step-1)]) + 2*(step-1) ! reconstructed matrix from last step
task_base = sum([(3*(matrix_size-i), i = 1, step-1)]) + 2*(step-1) + 3*(row-(step+1))
vertices(3+task_base) = vertex_t([latest_matrix], calc_factor_t(row=row, step=step))
vertices(4+task_base) = vertex_t([latest_matrix, 3+task_base], row_multiply_t(step=step))
vertices(5+task_base) = vertex_t([latest_matrix, 4+task_base], row_subtract_t(row=row))
end do
associate(reconstruction_step => 3 + sum([(3*(matrix_size-i), i = 1, step)]) + 2*(step-1))
vertices(reconstruction_step) = vertex_t( &
[ 1 + sum([(3*(matrix_size-i), i = 1, step-1)]) + 2*(step-1) &
, [(5 + sum([(3*(matrix_size-i), i = 1, step-1)]) + 2*(step-1) + 3*(row-(step+1)) &
, row=step+1, matrix_size)] &
], &
reconstruct_t(step=step)) ! depends on previous reconstructed matrix and just subtracted rows
vertices(reconstruction_step+1) = vertex_t([reconstruction_step], print_matrix_t(step)) ! print the just reconstructed matrix
end associate
reconstruction_step = 3 + sum([(3*(matrix_size-i), i = 1, step)]) + 2*(step-1)
vertices(reconstruction_step) = vertex_t( &
[ 1 + sum([(3*(matrix_size-i), i = 1, step-1)]) + 2*(step-1) &
, [(5 + sum([(3*(matrix_size-i), i = 1, step-1)]) + 2*(step-1) + 3*(row-(step+1)) &
, row=step+1, matrix_size)] &
], &
reconstruct_t(step=step)) ! depends on previous reconstructed matrix and just subtracted rows
vertices(reconstruction_step+1) = vertex_t([reconstruction_step], print_matrix_t(step)) ! print the just reconstructed matrix
end do
vertices(num_tasks-1) = vertex_t( &
[([(3 + sum([(3*(matrix_size-i), i = 1, step-1)]) + 2*(step-1) + 3*(row-(step+1)) &
Expand Down Expand Up @@ -147,35 +144,37 @@ function calc_factor_execute(self, arguments) result(output)
type(payload_t), intent(in) :: arguments(:)
type(payload_t) :: output

integer, allocatable :: matrix_data(:)
integer :: n_row, n_col
real(wp), allocatable :: matrix(:,:)
real(wp) :: factor

associate(matrix_data => arguments(1)%raw_payload())
associate(n_row => matrix_data(1), n_col => matrix_data(2))
matrix = reshape(transfer(matrix_data(3:), matrix, n_row*n_col), [n_row, n_col])
end associate
end associate
matrix_data = arguments(1)%raw_payload()
n_row = matrix_data(1)
n_col = matrix_data(2)
matrix = reshape(transfer(matrix_data(3:), matrix, n_row*n_col), [n_row, n_col])

factor = matrix(self%row, self%step) / matrix(self%step, self%step)
output = payload_t(transfer(factor, output%raw_payload()))
output = payload_t(transfer(factor, [integer::]))
end function

function row_multiply_execute(self, arguments) result(output)
class(row_multiply_t), intent(in) :: self
type(payload_t), intent(in) :: arguments(:)
type(payload_t) :: output

integer, allocatable :: matrix_data(:)
integer :: n_row, n_col
real(wp), allocatable :: matrix(:,:)
real(wp) :: factor
real(wp), allocatable :: new_row(:)
integer, allocatable :: data(:)
integer :: data_size

associate(matrix_data => arguments(1)%raw_payload())
associate(n_row => matrix_data(1), n_col => matrix_data(2))
matrix = reshape(transfer(matrix_data(3:), matrix, n_row*n_col), [n_row, n_col])
end associate
end associate
matrix_data = arguments(1)%raw_payload()
n_row = matrix_data(1)
n_col = matrix_data(2)
matrix = reshape(transfer(matrix_data(3:), matrix, n_row*n_col), [n_row, n_col])
factor = transfer(arguments(2)%raw_payload(), factor)
new_row = factor * matrix(self%step, :)

Expand All @@ -195,22 +194,21 @@ function row_subtract_execute(self, arguments) result(output)
type(payload_t), intent(in) :: arguments(:)
type(payload_t) :: output

integer, allocatable :: matrix_data(:), row_data(:)
integer :: n_row, n_col
real(wp), allocatable :: matrix(:,:)
real(wp), allocatable :: row(:)
real(wp), allocatable :: new_row(:)
integer, allocatable :: data(:)
integer :: data_size

associate(matrix_data => arguments(1)%raw_payload())
associate(n_row => matrix_data(1), n_col => matrix_data(2))
matrix = reshape(transfer(matrix_data(3:), matrix, n_row*n_col), [n_row, n_col])
end associate
end associate
associate(row_data => arguments(2)%raw_payload())
associate(n_cols => row_data(1))
row = transfer(row_data(2:), row, n_cols)
end associate
end associate
matrix_data = arguments(1)%raw_payload()
n_row = matrix_data(1)
n_col = matrix_data(2)
matrix = reshape(transfer(matrix_data(3:), matrix, n_row*n_col), [n_row, n_col])
row_data = arguments(2)%raw_payload()
n_col = row_data(1)
row = transfer(row_data(2:), row, n_col)

new_row = matrix(self%row, :) - row

Expand All @@ -230,27 +228,26 @@ function reconstruct_execute(self, arguments) result(output)
type(payload_t), intent(in) :: arguments(:)
type(payload_t) :: output

integer, allocatable :: matrix_data(:), row_data(:)
integer :: n_row, n_col
real(wp), allocatable :: original_matrix(:, :)
real(wp), allocatable :: new_matrix(:, :)
integer :: i
integer, allocatable :: data(:)
integer :: data_size

associate(matrix_data => arguments(1)%raw_payload())
associate(n_row => matrix_data(1), n_col => matrix_data(2))
original_matrix = reshape(transfer(matrix_data(3:), original_matrix, n_row*n_col), [n_row, n_col])
end associate
end associate
matrix_data = arguments(1)%raw_payload()
n_row = matrix_data(1)
n_col = matrix_data(2)
original_matrix = reshape(transfer(matrix_data(3:), original_matrix, n_row*n_col), [n_row, n_col])
allocate(new_matrix, mold=original_matrix)
do i = 1, self%step
new_matrix(i, :) = original_matrix(i, :)
end do
do i = self%step+1, size(original_matrix, dim=1)
associate(row_data => arguments(i - self%step + 1)%raw_payload())
associate(n_cols => row_data(1))
new_matrix(i, :) = transfer(row_data(2:), new_matrix, n_cols)
end associate
end associate
row_data = arguments(i - self%step + 1)%raw_payload()
n_col = row_data(1)
new_matrix(i, :) = transfer(row_data(2:), new_matrix, n_col)
end do

data_size = &
Expand Down Expand Up @@ -305,20 +302,21 @@ function print_matrix_execute(self, arguments) result(output)
type(payload_t), intent(in) :: arguments(:)
type(payload_t) :: output

integer, allocatable :: matrix_data(:)
integer :: n_row, n_col
real(wp), allocatable :: matrix(:,:)
integer :: i

critical
print *, ""
associate(matrix_data => arguments(1)%raw_payload())
associate(n_row => matrix_data(1), n_col => matrix_data(2))
matrix = reshape(transfer(matrix_data(3:), matrix, n_row*n_col), [n_row, n_col])
print *, "Step: ", self%step
do i = 1, n_row
print *, matrix(i, :)
end do
end associate
end associate
matrix_data = arguments(1)%raw_payload()
n_row = matrix_data(1)
n_col = matrix_data(2)
matrix = reshape(transfer(matrix_data(3:), matrix, n_row*n_col), [n_row, n_col])
print *, "Step: ", self%step
do i = 1, n_row
print *, matrix(i, :)
end do
print *, ""
end critical
end function
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -100,7 +100,7 @@ function a_execute(self, arguments) result(output)
type(payload_t) :: output

print *, "a = ", self%a
output = payload_t(transfer(self%a, output%raw_payload()))
output = payload_t(transfer(self%a, [integer::]))
end function

function b_execute(self, arguments) result(output)
Expand All @@ -109,7 +109,7 @@ function b_execute(self, arguments) result(output)
type(payload_t) :: output

print *, "b = ", self%b
output = payload_t(transfer(self%b, output%raw_payload()))
output = payload_t(transfer(self%b, [integer::]))
end function

function c_execute(self, arguments) result(output)
Expand All @@ -118,7 +118,7 @@ function c_execute(self, arguments) result(output)
type(payload_t) :: output

print *, "c = ", self%c
output = payload_t(transfer(self%c, output%raw_payload()))
output = payload_t(transfer(self%c, [integer::]))
end function

function b_squared_execute(self, arguments) result(output)
Expand All @@ -131,7 +131,7 @@ function b_squared_execute(self, arguments) result(output)
b = transfer(arguments(1)%raw_payload(), b)
b_squared = square(b)
print *, "b**2 = ", b_squared
output = payload_t(transfer(b_squared, output%raw_payload()))
output = payload_t(transfer(b_squared, [integer::]))
end function

function four_ac_execute(self, arguments) result(output)
Expand All @@ -145,24 +145,23 @@ function four_ac_execute(self, arguments) result(output)
c = transfer(arguments(2)%raw_payload(), c)
four_a_c = 4*a*c
print *, "4*a*c = ", four_a_c
output = payload_t(transfer(four_a_c, output%raw_payload()))
output = payload_t(transfer(four_a_c, [integer::]))
end function

function square_root_execute(self, arguments) result(output)
class(square_root_t), intent(in) :: self
type(payload_t), intent(in) :: arguments(:)
type(payload_t) :: output

real :: b_squared, four_a_c, square_roots(2)
real :: b_squared, four_a_c, square_roots(2), square

b_squared = transfer(arguments(1)%raw_payload(), b_squared)
four_a_c = transfer(arguments(2)%raw_payload(), four_a_c)

associate(discriminant => b_squared - four_a_c)
square_roots = [sqrt(discriminant), -sqrt(discriminant)]
print *, "sqrt(b**2 - 4*a*c) = ", square_roots
output = payload_t(transfer(square_roots, output%raw_payload()))
end associate
square = b_squared - four_a_c
square_roots = [sqrt(square), -sqrt(square)]
print *, "sqrt(b**2 - 4*a*c) = ", square_roots
output = payload_t(transfer(square_roots, [integer::]))
end function

function minus_b_pm_square_root_execute(self, arguments) result(output)
Expand All @@ -176,7 +175,7 @@ function minus_b_pm_square_root_execute(self, arguments) result(output)
square_root = transfer(arguments(2)%raw_payload(), square_root)
minus_b_pm_roots = -b + square_root
print *, "-b +- sqrt(b**2 - 4*a*c) = ", minus_b_pm_roots
output = payload_t(transfer(minus_b_pm_roots, output%raw_payload()))
output = payload_t(transfer(minus_b_pm_roots, [integer::]))
end function

function two_a_execute(self, arguments) result(output)
Expand All @@ -189,7 +188,7 @@ function two_a_execute(self, arguments) result(output)
a = transfer(arguments(1)%raw_payload(), a)
two_a = 2*a
print *, "2*a = ", two_a
output = payload_t(transfer(two_a, output%raw_payload()))
output = payload_t(transfer(two_a, [integer::]))
end function

function division_execute(self, arguments) result(output)
Expand All @@ -203,7 +202,7 @@ function division_execute(self, arguments) result(output)
b_pm_square_root = transfer(arguments(2)%raw_payload(), b_pm_square_root)
quotients = b_pm_square_root / two_a
print *, "(-b +- sqrt(b**2 - 4*a*c)) / (2*a) = ", quotients
output = payload_t(transfer(quotients, output%raw_payload()))
output = payload_t(transfer(quotients, [integer::]))
end function

function printer_execute(self, arguments) result(output)
Expand Down
35 changes: 8 additions & 27 deletions src/payload_m.f90
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,6 @@ module payload_m
private
public :: payload_t, empty_payload

integer, parameter :: MAX_PAYLOAD_SIZE = 20

type :: payload_t
!! A raw buffer to facilitate data transfer between images
!!
Expand All @@ -13,8 +11,7 @@ module payload_m
!! * produce a string representation of the data, and then parse that string to recover the original data
!! * use the `transfer` function to copy the raw bytes of the data
private
integer, public :: payload_(MAX_PAYLOAD_SIZE)
integer :: payload_size = 0
integer, public, allocatable :: payload_(:)
contains
private
procedure, public :: raw_payload
Expand All @@ -32,58 +29,42 @@ pure function from_raw(payload) result(new_payload)
integer, intent(in) :: payload(:)
type(payload_t) :: new_payload

integer :: incoming_payload_size

incoming_payload_size = size(payload)
if (incoming_payload_size > MAX_PAYLOAD_SIZE) then
new_payload%payload_size = MAX_PAYLOAD_SIZE
new_payload%payload_ = payload(1:MAX_PAYLOAD_SIZE)
else
new_payload%payload_size = incoming_payload_size
new_payload%payload_(1:incoming_payload_size) = payload
end if
allocate(new_payload%payload_, source = payload)
end function

pure function from_string(payload) result(new_payload)
implicit none
character(len=*), intent(in) :: payload
type(payload_t) :: new_payload

new_payload%payload_(1) = len(payload)
associate(string_as_integers => transfer(payload, new_payload%payload_))
if (size(string_as_integers) > MAX_PAYLOAD_SIZE-1) then
new_payload%payload_size = MAX_PAYLOAD_SIZE
new_payload%payload_(2:MAX_PAYLOAD_SIZE) = string_as_integers(1:MAX_PAYLOAD_SIZE-1)
else
new_payload%payload_size = size(string_as_integers) + 1
new_payload%payload_(2:new_payload%payload_size) = string_as_integers
end if
end associate
new_payload = payload_t([len(payload), transfer(payload, new_payload%payload_)])
end function

pure function empty_payload()
implicit none
type(payload_t) :: empty_payload

allocate(empty_payload%payload_(0))
end function

pure function raw_payload(self)
implicit none
class(payload_t), intent(in) :: self
integer, allocatable :: raw_payload(:)

raw_payload = self%payload_(1:self%payload_size)
raw_payload = self%payload_
end function

pure function string_payload(self)
implicit none
class(payload_t), intent(in) :: self
character(len=:), allocatable :: string_payload

if (self%payload_size > 0) then
if (size(self%payload_) > 0) then
allocate(character(len=self%payload_(1)) :: string_payload)
if (self%payload_(1) > 0) &
string_payload = transfer( &
self%payload_(2:self%payload_size), string_payload)
self%payload_(2:), string_payload)
else
allocate(character(len=0) :: string_payload)
end if
Expand Down

0 comments on commit d48f6ba

Please sign in to comment.