GCC Code Coverage Report


Directory: src/athena/
File: src/athena/athena_diffstruc_extd_sub_pad.f90
Date: 2026-04-15 16:08:59
Exec Total Coverage
Lines: 661 789 83.8%
Functions: 0 0 -%
Branches: 2491 5125 48.6%

Line Branch Exec Source
1 submodule (athena__diffstruc_extd) athena__diffstruc_extd_submodule_pad
2 !! Submodule containing implementations for extended diffstruc array operations
3
4 contains
5
6 !###############################################################################
7 3 subroutine fill_edge_region_1d(input, output)
8 !! Fill edge region for 1D padding
9 implicit none
10
11 ! Arguments
12 type(array_type), intent(in) :: input
13 type(array_type), intent(inout) :: output
14
15 ! Local variables
16 integer :: i, m, s, f
17 integer :: step, idx_in, idx_out
18 integer :: input_size, output_size, pad_size
19
20
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 3 times.
3 input_size = input%shape(1)
21
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 3 times.
3 output_size = output%shape(1)
22
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 3 times.
3 pad_size = output%indices(2)
23
24
4/6
✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 3 times.
✓ Branch 6 taken 6 times.
✓ Branch 7 taken 3 times.
9 do f = 1, output%indices(3)
25
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 6 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 6 times.
9 do concurrent( s = 1:size(output%val, dim=2), m = 1:output%shape(2) )
26
6/8
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 6 times.
✓ Branch 3 taken 6 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 6 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 6 times.
18 select case(output%indices(1))
27 case(3, 4) ! circular or reflection
28
4/6
✗ Branch 0 not taken.
✓ Branch 1 taken 4 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 4 times.
✓ Branch 6 taken 2 times.
✓ Branch 7 taken 2 times.
4 step = merge(1, -1, output%indices(1) .eq. 3)
29
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 4 times.
16 do i = 1, pad_size
30 idx_in = output%adj_ja(1,(f-1)*2 + 1) + step * (i - 1) + &
31
4/8
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 8 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 8 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 8 times.
8 (m-1)*input_size
32 idx_out = output%adj_ja(2,(f-1)*2 + 1) + i - 1 + &
33
4/8
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 8 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 8 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 8 times.
8 (m-1)*output_size
34
8/16
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 8 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 8 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 8 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 8 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 8 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 8 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 8 times.
12 output%val(idx_out, s) = input%val(idx_in, s)
35 end do
36 case(5) ! replication
37
4/8
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 2 times.
2 idx_in = output%adj_ja(1,(f-1)*2 + 1) + (m-1)*input_size
38
4/5
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 4 times.
✓ Branch 4 taken 2 times.
12 do i = 1, pad_size
39 idx_out = output%adj_ja(2,(f-1)*2 + 1) + i - 1 + &
40
4/8
✗ Branch 0 not taken.
✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 4 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 4 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 4 times.
4 (m-1)*output_size
41
8/16
✗ Branch 0 not taken.
✓ Branch 1 taken 4 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 4 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 4 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 4 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 4 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 4 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 4 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 4 times.
6 output%val(idx_out, s) = input%val(idx_in, s)
42 end do
43 end select
44 end do
45 end do
46
47 3 end subroutine fill_edge_region_1d
48 !-------------------------------------------------------------------------------
49
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 pure subroutine accumulate_edge_gradients_1d_val(upstream_grad, output, &
50
3/6
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 3 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 3 times.
✗ Branch 5 not taken.
3 input_shape, indices, adj_ja)
51 !! Accumulate edge gradients for 1D padding - raw array version
52 implicit none
53
54 ! Arguments
55 real(real32), dimension(:,:), intent(in) :: upstream_grad
56 real(real32), dimension(:,:), intent(inout) :: output
57 integer, dimension(3), intent(in) :: input_shape
58 integer, dimension(:), intent(in) :: indices
59 integer, dimension(:,:), intent(in) :: adj_ja
60
61 ! Local variables
62 integer :: i, m, s, f
63 integer :: idx_in, idx_out
64 integer :: input_size, output_size
65 integer :: num_facets
66 real(real32) :: grad_sum
67
68 3 input_size = input_shape(1)
69
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
3 output_size = input_size + 2 * indices(2)
70
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
3 num_facets = indices(3)
71
72
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
3 if(num_facets .eq. 0) return
73
74
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
3 select case(indices(1))
75 case(3, 4) ! circular or reflection
76
2/2
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 2 times.
8 do f = 1, num_facets
77
2/2
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 4 times.
10 do s = 1, input_shape(3)
78
2/2
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 4 times.
12 do m = 1, input_shape(2)
79
8/14
✗ Branch 0 not taken.
✓ Branch 1 taken 4 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 4 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 4 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 4 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 4 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 4 times.
✓ Branch 18 taken 8 times.
✓ Branch 19 taken 4 times.
16 do i = adj_ja(2,(f-1)*2 + 1), adj_ja(2,(f-1)*2 + 2)
80 8 idx_out = i + (m-1) * output_size
81
3/4
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
✓ Branch 3 taken 4 times.
✓ Branch 4 taken 4 times.
8 if(indices(1) .eq. 3)then ! circular
82
2/4
✗ Branch 1 not taken.
✓ Branch 2 taken 4 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 4 times.
4 idx_in = adj_ja(1,(f-1)*2 + 1) + &
83
4/8
✗ Branch 0 not taken.
✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 4 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 4 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 4 times.
8 (i - adj_ja(2,(f-1)*2 + 1)) + (m-1) * input_size
84 else ! reflection
85
2/4
✗ Branch 1 not taken.
✓ Branch 2 taken 4 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 4 times.
4 idx_in = adj_ja(1,(f-1)*2 + 1) - &
86
4/8
✗ Branch 0 not taken.
✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 4 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 4 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 4 times.
8 (i - adj_ja(2,(f-1)*2 + 1)) + (m-1) * input_size
87 end if
88
4/8
✗ Branch 1 not taken.
✓ Branch 2 taken 8 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 8 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 8 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 8 times.
32 output(idx_in, s) = output(idx_in, s) + &
89
8/16
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 8 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 8 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 8 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 8 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 8 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 8 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 8 times.
44 upstream_grad(idx_out, s)
90 end do
91 end do
92 end do
93 end do
94 case(5) ! replication
95
4/5
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 1 times.
5 do f = 1, num_facets
96
2/2
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 2 times.
5 do s = 1, input_shape(3)
97
2/2
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 2 times.
6 do m = 1, input_shape(2)
98 2 grad_sum = 0._real32
99
8/14
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 2 times.
✓ Branch 18 taken 4 times.
✓ Branch 19 taken 2 times.
6 do i = adj_ja(2,(f-1)*2 + 1), adj_ja(2,(f-1)*2 + 2)
100 4 idx_out = i + (m-1) * output_size
101
4/8
✗ Branch 0 not taken.
✓ Branch 1 taken 4 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 4 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 4 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 4 times.
6 grad_sum = grad_sum + upstream_grad(idx_out, s)
102 end do
103
3/6
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
2 idx_in = adj_ja(1,(f-1)*2 + 1) + (m-1) * input_size
104
8/16
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 2 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 2 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 2 times.
4 output(idx_in, s) = output(idx_in, s) + grad_sum
105 end do
106 end do
107 end do
108 end select
109
110 end subroutine accumulate_edge_gradients_1d_val
111 !###############################################################################
112
113
114 !###############################################################################
115 3 subroutine fill_corner_region_2d(input, output)
116 !! Fill corner region for 2D padding
117 implicit none
118
119 ! Arguments
120 type(array_type), intent(in) :: input
121 type(array_type), intent(inout) :: output
122
123 ! Local variables
124 integer :: i, j, m, s, f
125 integer :: step, idx_in, idx_out, idx_shift
126 integer :: input_h, input_w, output_h, output_w
127 integer :: pad_h, pad_w
128 integer, dimension(2,2) :: orig, dest
129
130
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 3 times.
3 input_h = input%shape(1)
131
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 3 times.
3 input_w = input%shape(2)
132
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 3 times.
3 output_h = output%shape(1)
133
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 3 times.
3 output_w = output%shape(2)
134
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 3 times.
3 pad_h = output%indices(2)
135
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 3 times.
3 pad_w = output%indices(3)
136
137
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 3 times.
3 idx_shift = output%indices(4) * 4
138
4/6
✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 3 times.
✓ Branch 6 taken 12 times.
✓ Branch 7 taken 3 times.
15 do f = 1, output%indices(5)
139
9/16
✗ Branch 0 not taken.
✓ Branch 1 taken 12 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 12 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 12 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 12 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 12 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 12 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 12 times.
✓ Branch 21 taken 24 times.
✓ Branch 22 taken 12 times.
36 orig(1:2,1) = output%adj_ja(1,(f-1)*4 + 1 + idx_shift:(f-1)*4 + 2 + idx_shift)
140
9/16
✗ Branch 0 not taken.
✓ Branch 1 taken 12 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 12 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 12 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 12 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 12 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 12 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 12 times.
✓ Branch 21 taken 24 times.
✓ Branch 22 taken 12 times.
36 orig(1:2,2) = output%adj_ja(1,(f-1)*4 + 3 + idx_shift:(f-1)*4 + 4 + idx_shift)
141
9/16
✗ Branch 0 not taken.
✓ Branch 1 taken 12 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 12 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 12 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 12 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 12 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 12 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 12 times.
✓ Branch 21 taken 24 times.
✓ Branch 22 taken 12 times.
36 dest(1:2,1) = output%adj_ja(2,(f-1)*4 + 1 + idx_shift:(f-1)*4 + 2 + idx_shift)
142
9/16
✗ Branch 0 not taken.
✓ Branch 1 taken 12 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 12 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 12 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 12 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 12 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 12 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 12 times.
✓ Branch 21 taken 24 times.
✓ Branch 22 taken 12 times.
36 dest(1:2,2) = output%adj_ja(2,(f-1)*4 + 3 + idx_shift:(f-1)*4 + 4 + idx_shift)
143
144
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 12 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 12 times.
15 do concurrent( s = 1:size(output%val, dim=2), m = 1:output%shape(3) )
145
6/8
✓ Branch 0 taken 12 times.
✓ Branch 1 taken 12 times.
✓ Branch 2 taken 12 times.
✓ Branch 3 taken 12 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 12 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 12 times.
36 select case(output%indices(1))
146 case(3, 4) ! circular or reflection
147
4/6
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 8 times.
✓ Branch 6 taken 4 times.
✓ Branch 7 taken 4 times.
8 step = merge(1, -1, output%indices(1) .eq. 3)
148
2/2
✓ Branch 0 taken 16 times.
✓ Branch 1 taken 8 times.
32 do j = dest(1,2), dest(2,2)
149
2/2
✓ Branch 0 taken 32 times.
✓ Branch 1 taken 16 times.
56 do i = dest(1,1), dest(2,1)
150 32 idx_out = i + (j-1) * output_h + (m - 1) * output_h * output_w
151 idx_in = orig(1,1) + step * (i - dest(1,1)) + &
152 (orig(1,2) + step * (j - dest(1,2)) - 1) * input_h + &
153 32 (m - 1) * input_h * input_w
154
8/16
✗ Branch 0 not taken.
✓ Branch 1 taken 32 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 32 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 32 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 32 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 32 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 32 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 32 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 32 times.
48 output%val(idx_out, s) = input%val(idx_in, s)
155 end do
156 end do
157 case(5) ! replication
158 idx_in = orig(1,1) + (orig(1,2) - 1) * input_h + &
159 4 (m - 1) * input_h * input_w
160
4/5
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 4 times.
20 do j = dest(1,2), dest(2,2)
161
2/2
✓ Branch 0 taken 16 times.
✓ Branch 1 taken 8 times.
28 do i = dest(1,1), dest(2,1)
162 16 idx_out = i + (j-1) * output_h + (m - 1) * output_h * output_w
163
8/16
✗ Branch 0 not taken.
✓ Branch 1 taken 16 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 16 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 16 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 16 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 16 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 16 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 16 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 16 times.
24 output%val(idx_out, s) = input%val(idx_in, s)
164 end do
165 end do
166 end select
167 end do
168 end do
169
170 3 end subroutine fill_corner_region_2d
171 !-------------------------------------------------------------------------------
172 3 subroutine fill_edge_region_2d(input, output)
173 !! Fill edge region for 2D padding
174 implicit none
175
176 ! Arguments
177 type(array_type), intent(in) :: input
178 type(array_type), intent(inout) :: output
179
180 ! Local variables
181 integer :: i, j, m, s, f, idim
182 integer :: step1, step2, idx_in, idx_out
183 integer :: input_h, input_w, output_h, output_w
184 integer :: pad_h, pad_w
185 integer, dimension(2,2) :: orig, dest
186
187
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 3 times.
3 input_h = input%shape(1)
188
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 3 times.
3 input_w = input%shape(2)
189
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 3 times.
3 output_h = output%shape(1)
190
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 3 times.
3 output_w = output%shape(2)
191
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 3 times.
3 pad_h = output%indices(2)
192
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 3 times.
3 pad_w = output%indices(3)
193
194
4/6
✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 3 times.
✓ Branch 6 taken 12 times.
✓ Branch 7 taken 3 times.
15 do f = 1, output%indices(4)
195
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 12 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 12 times.
12 idim = output%indices(5 + f)
196
9/16
✗ Branch 0 not taken.
✓ Branch 1 taken 12 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 12 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 12 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 12 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 12 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 12 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 12 times.
✓ Branch 21 taken 24 times.
✓ Branch 22 taken 12 times.
36 orig(1:2,1) = output%adj_ja(1,(f-1)*4 + 1:(f-1)*4 + 2)
197
9/16
✗ Branch 0 not taken.
✓ Branch 1 taken 12 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 12 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 12 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 12 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 12 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 12 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 12 times.
✓ Branch 21 taken 24 times.
✓ Branch 22 taken 12 times.
36 orig(1:2,2) = output%adj_ja(1,(f-1)*4 + 3:(f-1)*4 + 4)
198
9/16
✗ Branch 0 not taken.
✓ Branch 1 taken 12 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 12 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 12 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 12 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 12 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 12 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 12 times.
✓ Branch 21 taken 24 times.
✓ Branch 22 taken 12 times.
36 dest(1:2,1) = output%adj_ja(2,(f-1)*4 + 1:(f-1)*4 + 2)
199
9/16
✗ Branch 0 not taken.
✓ Branch 1 taken 12 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 12 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 12 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 12 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 12 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 12 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 12 times.
✓ Branch 21 taken 24 times.
✓ Branch 22 taken 12 times.
36 dest(1:2,2) = output%adj_ja(2,(f-1)*4 + 3:(f-1)*4 + 4)
200
201
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 12 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 12 times.
15 do concurrent( s = 1:size(output%val, dim=2), m = 1:output%shape(3) )
202
6/8
✓ Branch 0 taken 12 times.
✓ Branch 1 taken 12 times.
✓ Branch 2 taken 12 times.
✓ Branch 3 taken 12 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 12 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 12 times.
36 select case(output%indices(1))
203 case(3, 4) ! circular or reflection
204
4/6
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 8 times.
✓ Branch 6 taken 2 times.
✓ Branch 7 taken 6 times.
8 step1 = merge(-1, 1, output%indices(1) .eq. 4 .and. idim .eq. 1)
205
4/6
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 8 times.
✓ Branch 6 taken 2 times.
✓ Branch 7 taken 6 times.
8 step2 = merge(-1, 1, output%indices(1) .eq. 4 .and. idim .eq. 2)
206
2/2
✓ Branch 0 taken 24 times.
✓ Branch 1 taken 8 times.
40 do j = dest(1,2), dest(2,2)
207
2/2
✓ Branch 0 taken 64 times.
✓ Branch 1 taken 24 times.
96 do i = dest(1,1), dest(2,1)
208 64 idx_out = i + (j-1) * output_h + (m - 1) * output_h * output_w
209 idx_in = orig(1,1) + step1 * (i - dest(1,1)) + &
210 (orig(1,2) + step2 * (j - dest(1,2)) - 1) * input_h + &
211 64 (m - 1) * input_h * input_w
212
8/16
✗ Branch 0 not taken.
✓ Branch 1 taken 64 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 64 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 64 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 64 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 64 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 64 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 64 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 64 times.
88 output%val(idx_out, s) = input%val(idx_in, s)
213 end do
214 end do
215 case(5) ! replication
216
2/3
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
12 select case(idim)
217 case(1)
218
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 2 times.
12 do j = dest(1,2), dest(2,2)
219 idx_in = orig(1,1) + (j - dest(1,2)) * input_h + &
220 8 (m - 1) * input_h * input_w
221
2/2
✓ Branch 0 taken 16 times.
✓ Branch 1 taken 8 times.
26 do i = dest(1,1), dest(2,1)
222 16 idx_out = i + (j-1) * output_h + (m - 1) * output_h * output_w
223
8/16
✗ Branch 0 not taken.
✓ Branch 1 taken 16 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 16 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 16 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 16 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 16 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 16 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 16 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 16 times.
24 output%val(idx_out, s) = input%val(idx_in, s)
224 end do
225 end do
226 case(2)
227 2 idx_in = (orig(1,2) - 1) * input_h + (m - 1) * input_h * input_w
228
4/5
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 4 times.
✓ Branch 4 taken 2 times.
8 do j = dest(1,2), dest(2,2)
229
2/2
✓ Branch 0 taken 16 times.
✓ Branch 1 taken 4 times.
22 do i = dest(1,1), dest(2,1)
230 16 idx_out = i + (j-1) * output_h + (m - 1) * output_h * output_w
231 output%val(idx_out, s) = &
232
8/16
✗ Branch 0 not taken.
✓ Branch 1 taken 16 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 16 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 16 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 16 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 16 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 16 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 16 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 16 times.
20 input%val(idx_in + i - dest(1,1) + 1, s)
233 end do
234 end do
235 end select
236 end select
237 end do
238 end do
239
240 3 end subroutine fill_edge_region_2d
241 !-------------------------------------------------------------------------------
242
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 pure subroutine accumulate_corner_gradients_2d_val(upstream_grad, output, &
243
3/6
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 3 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 3 times.
✗ Branch 5 not taken.
3 input_shape, indices, adj_ja)
244 !! Accumulate corner gradients for 2D padding - raw array version
245 implicit none
246
247 ! Arguments
248 real(real32), dimension(:,:), intent(in) :: upstream_grad
249 real(real32), dimension(:,:), intent(inout) :: output
250 integer, dimension(4), intent(in) :: input_shape
251 integer, dimension(:), intent(in) :: indices
252 integer, dimension(:,:), intent(in) :: adj_ja
253
254 ! Local variables
255 integer :: i, j, m, s, f
256 integer :: idx_in, idx_out
257 integer :: input_size_h, input_size_w
258 integer :: output_size_h, output_size_w
259 integer :: num_edge_facets, num_corner_facets
260 integer :: adj_ja_offset
261 real(real32) :: grad_sum
262
263 3 input_size_h = input_shape(1)
264 3 input_size_w = input_shape(2)
265
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
3 output_size_h = input_size_h + 2 * indices(2)
266
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
3 output_size_w = input_size_w + 2 * indices(3)
267
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
3 num_edge_facets = indices(4)
268
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
3 num_corner_facets = indices(5)
269 3 adj_ja_offset = num_edge_facets * 4
270
271
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
3 if(num_corner_facets .eq. 0) return
272
273
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
3 select case(indices(1))
274 case(3) ! circular
275
2/2
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 1 times.
6 do f = 1, num_corner_facets
276 do concurrent( &
277 s = 1:input_shape(4), &
278 m = 1:input_shape(3), &
279
4/8
✗ Branch 1 not taken.
✓ Branch 2 taken 4 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 4 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 4 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 4 times.
8 j = adj_ja(1,(f-1)*4 + 3 + adj_ja_offset) : &
280 adj_ja(1,(f-1)*4 + 4 + adj_ja_offset), &
281
4/8
✗ Branch 1 not taken.
✓ Branch 2 taken 4 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 4 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 4 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 4 times.
8 i = adj_ja(1,(f-1)*4 + 1 + adj_ja_offset) : &
282 adj_ja(1,(f-1)*4 + 2 + adj_ja_offset) &
283
4/8
✗ Branch 0 not taken.
✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 4 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 4 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 4 times.
17 )
284 idx_in = i + (j-1) * input_size_h + &
285 16 (m-1) * input_size_h * input_size_w
286
2/4
✗ Branch 1 not taken.
✓ Branch 2 taken 16 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 16 times.
16 idx_out = ( &
287 adj_ja(2,(f-1)*4 + 1 + adj_ja_offset) + &
288
2/4
✗ Branch 1 not taken.
✓ Branch 2 taken 16 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 16 times.
16 (i - adj_ja(1,(f-1)*4 + 1 + adj_ja_offset)) &
289
2/4
✗ Branch 1 not taken.
✓ Branch 2 taken 16 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 16 times.
16 ) + ( &
290 adj_ja(2,(f-1)*4 + 3 + adj_ja_offset) + &
291
2/4
✗ Branch 1 not taken.
✓ Branch 2 taken 16 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 16 times.
16 (j - adj_ja(1,(f-1)*4 + 3 + adj_ja_offset)) - 1 &
292
4/8
✗ Branch 0 not taken.
✓ Branch 1 taken 16 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 16 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 16 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 16 times.
64 ) * output_size_h + (m-1) * output_size_h * output_size_w
293
20/32
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 16 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 16 times.
✓ Branch 5 taken 16 times.
✓ Branch 6 taken 16 times.
✓ Branch 7 taken 16 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 16 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 16 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 16 times.
✗ Branch 17 not taken.
✓ Branch 18 taken 16 times.
✗ Branch 20 not taken.
✓ Branch 21 taken 16 times.
✗ Branch 23 not taken.
✓ Branch 24 taken 16 times.
✗ Branch 26 not taken.
✓ Branch 27 taken 16 times.
✗ Branch 29 not taken.
✓ Branch 30 taken 16 times.
✗ Branch 32 not taken.
✓ Branch 33 taken 16 times.
✗ Branch 35 not taken.
✓ Branch 36 taken 16 times.
✗ Branch 38 not taken.
✓ Branch 39 taken 16 times.
✗ Branch 41 not taken.
✓ Branch 42 taken 16 times.
60 output(idx_in, s) = output(idx_in, s) + upstream_grad(idx_out, s)
294 end do
295 end do
296 case(4) ! reflection
297
2/2
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 1 times.
6 do f = 1, num_corner_facets
298 do concurrent( &
299 s = 1:input_shape(4), &
300 m = 1:input_shape(3), &
301
4/8
✗ Branch 1 not taken.
✓ Branch 2 taken 4 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 4 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 4 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 4 times.
8 j = adj_ja(1,(f-1)*4 + 4 + adj_ja_offset) : &
302 adj_ja(1,(f-1)*4 + 3 + adj_ja_offset), &
303
4/8
✗ Branch 1 not taken.
✓ Branch 2 taken 4 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 4 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 4 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 4 times.
8 i = adj_ja(1,(f-1)*4 + 2 + adj_ja_offset) : &
304 adj_ja(1,(f-1)*4 + 1 + adj_ja_offset) &
305
4/8
✗ Branch 0 not taken.
✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 4 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 4 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 4 times.
17 )
306 idx_in = i + (j-1) * input_size_h + &
307 16 (m-1) * input_size_h * input_size_w
308
2/4
✗ Branch 1 not taken.
✓ Branch 2 taken 16 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 16 times.
16 idx_out = ( &
309 adj_ja(2,(f-1)*4 + 1 + adj_ja_offset) - &
310
2/4
✗ Branch 1 not taken.
✓ Branch 2 taken 16 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 16 times.
16 (i - adj_ja(1,(f-1)*4 + 1 + adj_ja_offset)) &
311
2/4
✗ Branch 1 not taken.
✓ Branch 2 taken 16 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 16 times.
16 ) + ( &
312 adj_ja(2,(f-1)*4 + 4 + adj_ja_offset) - &
313
2/4
✗ Branch 1 not taken.
✓ Branch 2 taken 16 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 16 times.
16 (j - adj_ja(1,(f-1)*4 + 4 + adj_ja_offset)) - 1 &
314
4/8
✗ Branch 0 not taken.
✓ Branch 1 taken 16 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 16 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 16 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 16 times.
64 ) * output_size_h + (m-1) * output_size_h * output_size_w
315
20/32
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 16 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 16 times.
✓ Branch 5 taken 16 times.
✓ Branch 6 taken 16 times.
✓ Branch 7 taken 16 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 16 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 16 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 16 times.
✗ Branch 17 not taken.
✓ Branch 18 taken 16 times.
✗ Branch 20 not taken.
✓ Branch 21 taken 16 times.
✗ Branch 23 not taken.
✓ Branch 24 taken 16 times.
✗ Branch 26 not taken.
✓ Branch 27 taken 16 times.
✗ Branch 29 not taken.
✓ Branch 30 taken 16 times.
✗ Branch 32 not taken.
✓ Branch 33 taken 16 times.
✗ Branch 35 not taken.
✓ Branch 36 taken 16 times.
✗ Branch 38 not taken.
✓ Branch 39 taken 16 times.
✗ Branch 41 not taken.
✓ Branch 42 taken 16 times.
60 output(idx_in, s) = output(idx_in, s) + upstream_grad(idx_out, s)
316 end do
317 end do
318 case(5) ! replication
319
5/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 1 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 4 times.
✓ Branch 5 taken 1 times.
7 do f = 1, num_corner_facets
320
2/2
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 4 times.
9 do s = 1, input_shape(4)
321
2/2
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 4 times.
12 do m = 1, input_shape(3)
322 4 grad_sum = 0._real32
323
6/10
✗ Branch 1 not taken.
✓ Branch 2 taken 4 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 4 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 4 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 4 times.
✓ Branch 14 taken 8 times.
✓ Branch 15 taken 4 times.
20 do j = adj_ja(2,(f-1)*4 + 3 + adj_ja_offset), &
324
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 4 times.
12 adj_ja(2,(f-1)*4 + 4 + adj_ja_offset)
325
6/10
✗ Branch 1 not taken.
✓ Branch 2 taken 8 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 8 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 8 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 8 times.
✓ Branch 14 taken 16 times.
✓ Branch 15 taken 8 times.
40 do i = adj_ja(2,(f-1)*4 + 1 + adj_ja_offset), &
326
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 8 times.
28 adj_ja(2,(f-1)*4 + 2 + adj_ja_offset)
327 idx_out = i + (j-1) * output_size_h + &
328 16 (m-1) * output_size_h * output_size_w
329
4/8
✗ Branch 0 not taken.
✓ Branch 1 taken 16 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 16 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 16 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 16 times.
24 grad_sum = grad_sum + upstream_grad(idx_out, s)
330 end do
331 end do
332
2/4
✗ Branch 1 not taken.
✓ Branch 2 taken 4 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 4 times.
4 idx_in = adj_ja(1,(f-1)*4 + 1 + adj_ja_offset) + &
333
2/4
✗ Branch 1 not taken.
✓ Branch 2 taken 4 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 4 times.
4 (adj_ja(1,(f-1)*4 + 3 + adj_ja_offset) - 1) * &
334
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 4 times.
8 input_size_h + (m-1) * input_size_h * input_size_w
335
8/16
✗ Branch 0 not taken.
✓ Branch 1 taken 4 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 4 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 4 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 4 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 4 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 4 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 4 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 4 times.
8 output(idx_in, s) = output(idx_in, s) + grad_sum
336 end do
337 end do
338 end do
339 end select
340
341 end subroutine accumulate_corner_gradients_2d_val
342 !-------------------------------------------------------------------------------
343
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 pure subroutine accumulate_edge_gradients_2d_val(upstream_grad, output, &
344
3/6
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 3 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 3 times.
✗ Branch 5 not taken.
3 input_shape, indices, adj_ja)
345 !! Accumulate edge gradients for 2D padding - raw array version
346 implicit none
347
348 ! Arguments
349 real(real32), dimension(:,:), intent(in) :: upstream_grad
350 real(real32), dimension(:,:), intent(inout) :: output
351 integer, dimension(4), intent(in) :: input_shape
352 integer, dimension(:), intent(in) :: indices
353 integer, dimension(:,:), intent(in) :: adj_ja
354
355 ! Local variables
356 integer :: i, j, m, s, f, idx
357 integer :: idx_in, idx_out
358 integer :: input_size_h, input_size_w
359 integer :: output_size_h, output_size_w
360 integer :: num_edge_facets
361 integer :: facet_dim
362 real(real32) :: grad_sum
363
364 3 input_size_h = input_shape(1)
365 3 input_size_w = input_shape(2)
366
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
3 output_size_h = input_size_h + 2 * indices(2)
367
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
3 output_size_w = input_size_w + 2 * indices(3)
368
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
3 num_edge_facets = indices(4)
369
370
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
3 if(num_edge_facets .eq. 0) return
371
372
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
3 select case(indices(1))
373 case(3) ! circular
374
2/2
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 1 times.
6 do f = 1, num_edge_facets
375
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 4 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 4 times.
4 facet_dim = indices(5 + f)
376
2/2
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 2 times.
5 if(facet_dim .eq. 1)then
377 do concurrent( &
378 s = 1:input_shape(4), &
379 m = 1:input_shape(3), &
380
4/8
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 2 times.
4 j = adj_ja(1,(f-1)*4 + 3):adj_ja(1,(f-1)*4 + 4), &
381
8/16
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 2 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 2 times.
✗ Branch 19 not taken.
✓ Branch 20 taken 2 times.
6 i = adj_ja(1,(f-1)*4 + 1):adj_ja(1,(f-1)*4 + 2))
382 idx_in = i + (j-1) * input_size_h + &
383 16 (m-1) * input_size_h * input_size_w
384 idx_out = &
385
2/4
✗ Branch 1 not taken.
✓ Branch 2 taken 16 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 16 times.
16 ( &
386 adj_ja(2,(f-1)*4 + 1) + &
387
2/4
✗ Branch 1 not taken.
✓ Branch 2 taken 16 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 16 times.
16 (i - adj_ja(1,(f-1)*4 + 1)) &
388 ) + &
389
4/8
✗ Branch 1 not taken.
✓ Branch 2 taken 16 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 16 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 16 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 16 times.
32 (j + adj_ja(2,(f-1)*4 + 3) - adj_ja(1,(f-1)*4 + 3) - 1) * &
390
4/8
✗ Branch 0 not taken.
✓ Branch 1 taken 16 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 16 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 16 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 16 times.
64 output_size_h + (m-1) * output_size_h * output_size_w
391
4/8
✗ Branch 1 not taken.
✓ Branch 2 taken 16 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 16 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 16 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 16 times.
64 output(idx_in, s) = output(idx_in, s) + &
392
16/24
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 16 times.
✓ Branch 3 taken 4 times.
✓ Branch 4 taken 16 times.
✓ Branch 5 taken 16 times.
✓ Branch 6 taken 16 times.
✓ Branch 7 taken 16 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 16 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 16 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 16 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 16 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 16 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 16 times.
✗ Branch 24 not taken.
✓ Branch 25 taken 16 times.
✗ Branch 26 not taken.
✓ Branch 27 taken 16 times.
118 upstream_grad(idx_out, s)
393 end do
394 else
395 do concurrent( &
396 s = 1:input_shape(4), &
397 m = 1:input_shape(3), &
398
4/8
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 2 times.
4 j = adj_ja(1,(f-1)*4 + 3):adj_ja(1,(f-1)*4 + 4), &
399
8/16
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 2 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 2 times.
✗ Branch 19 not taken.
✓ Branch 20 taken 2 times.
6 i = adj_ja(1,(f-1)*4 + 1):adj_ja(1,(f-1)*4 + 2))
400 idx_in = i + (j-1) * input_size_h + &
401 16 (m-1) * input_size_h * input_size_w
402 idx_out = &
403 ( &
404
2/4
✗ Branch 1 not taken.
✓ Branch 2 taken 16 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 16 times.
16 i + adj_ja(2,(f-1)*4 + 1) - &
405
2/4
✗ Branch 1 not taken.
✓ Branch 2 taken 16 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 16 times.
16 adj_ja(1,(f-1)*4 + 1) &
406
2/4
✗ Branch 1 not taken.
✓ Branch 2 taken 16 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 16 times.
16 ) + ( &
407 adj_ja(2,(f-1)*4 + 3) + &
408
2/4
✗ Branch 1 not taken.
✓ Branch 2 taken 16 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 16 times.
16 (j - adj_ja(1,(f-1)*4 + 3)) - 1 &
409 ) * output_size_h + &
410
4/8
✗ Branch 0 not taken.
✓ Branch 1 taken 16 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 16 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 16 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 16 times.
64 (m-1) * output_size_h * output_size_w
411
4/8
✗ Branch 1 not taken.
✓ Branch 2 taken 16 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 16 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 16 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 16 times.
64 output(idx_in, s) = output(idx_in, s) + &
412
16/24
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 16 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 16 times.
✓ Branch 5 taken 16 times.
✓ Branch 6 taken 16 times.
✓ Branch 7 taken 16 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 16 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 16 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 16 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 16 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 16 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 16 times.
✗ Branch 24 not taken.
✓ Branch 25 taken 16 times.
✗ Branch 26 not taken.
✓ Branch 27 taken 16 times.
122 upstream_grad(idx_out, s)
413 end do
414 end if
415 end do
416 case(4) ! reflection
417
2/2
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 1 times.
6 do f = 1, num_edge_facets
418
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 4 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 4 times.
4 facet_dim = indices(5 + f)
419
2/2
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 2 times.
5 if(facet_dim .eq. 1)then
420 do concurrent( &
421 s = 1:input_shape(4), &
422 m = 1:input_shape(3), &
423
4/8
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 2 times.
4 j = adj_ja(1,(f-1)*4 + 3):adj_ja(1,(f-1)*4 + 4), &
424
8/16
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 2 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 2 times.
✗ Branch 19 not taken.
✓ Branch 20 taken 2 times.
6 i = adj_ja(1,(f-1)*4 + 2):adj_ja(1,(f-1)*4 + 1))
425 idx_in = i + (j-1) * input_size_h + &
426 16 (m-1) * input_size_h * input_size_w
427 idx_out = &
428
2/4
✗ Branch 1 not taken.
✓ Branch 2 taken 16 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 16 times.
16 ( &
429 adj_ja(2,(f-1)*4 + 1) - &
430
2/4
✗ Branch 1 not taken.
✓ Branch 2 taken 16 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 16 times.
16 (i - adj_ja(1,(f-1)*4 + 1)) &
431 ) + &
432
4/8
✗ Branch 1 not taken.
✓ Branch 2 taken 16 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 16 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 16 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 16 times.
32 (j + adj_ja(2,(f-1)*4 + 3) - adj_ja(1,(f-1)*4 + 3) - 1) * &
433
4/8
✗ Branch 0 not taken.
✓ Branch 1 taken 16 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 16 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 16 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 16 times.
64 output_size_h + (m-1) * output_size_h * output_size_w
434
4/8
✗ Branch 1 not taken.
✓ Branch 2 taken 16 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 16 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 16 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 16 times.
64 output(idx_in, s) = output(idx_in, s) + &
435
16/24
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 16 times.
✓ Branch 3 taken 4 times.
✓ Branch 4 taken 16 times.
✓ Branch 5 taken 16 times.
✓ Branch 6 taken 16 times.
✓ Branch 7 taken 16 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 16 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 16 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 16 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 16 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 16 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 16 times.
✗ Branch 24 not taken.
✓ Branch 25 taken 16 times.
✗ Branch 26 not taken.
✓ Branch 27 taken 16 times.
118 upstream_grad(idx_out, s)
436 end do
437 else
438 do concurrent( &
439 s = 1:input_shape(4), &
440 m = 1:input_shape(3), &
441
4/8
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 2 times.
4 j = adj_ja(1,(f-1)*4 + 4):adj_ja(1,(f-1)*4 + 3), &
442
8/16
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 2 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 2 times.
✗ Branch 19 not taken.
✓ Branch 20 taken 2 times.
6 i = adj_ja(1,(f-1)*4 + 1):adj_ja(1,(f-1)*4 + 2))
443 idx_in = i + (j-1) * input_size_h + &
444 16 (m-1) * input_size_h * input_size_w
445 idx_out = &
446 ( &
447
2/4
✗ Branch 1 not taken.
✓ Branch 2 taken 16 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 16 times.
16 i + adj_ja(2,(f-1)*4 + 1) - &
448
2/4
✗ Branch 1 not taken.
✓ Branch 2 taken 16 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 16 times.
16 adj_ja(1,(f-1)*4 + 1) &
449
2/4
✗ Branch 1 not taken.
✓ Branch 2 taken 16 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 16 times.
16 ) + ( &
450 adj_ja(2,(f-1)*4 + 4) - &
451
2/4
✗ Branch 1 not taken.
✓ Branch 2 taken 16 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 16 times.
16 (j - adj_ja(1,(f-1)*4 + 4)) - 1 &
452 ) * output_size_h + &
453
4/8
✗ Branch 0 not taken.
✓ Branch 1 taken 16 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 16 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 16 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 16 times.
64 (m-1) * output_size_h * output_size_w
454
4/8
✗ Branch 1 not taken.
✓ Branch 2 taken 16 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 16 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 16 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 16 times.
64 output(idx_in, s) = output(idx_in, s) + &
455
16/24
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 16 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 16 times.
✓ Branch 5 taken 16 times.
✓ Branch 6 taken 16 times.
✓ Branch 7 taken 16 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 16 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 16 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 16 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 16 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 16 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 16 times.
✗ Branch 24 not taken.
✓ Branch 25 taken 16 times.
✗ Branch 26 not taken.
✓ Branch 27 taken 16 times.
122 upstream_grad(idx_out, s)
456 end do
457 end if
458 end do
459 case(5) ! replication
460
5/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 1 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 4 times.
✓ Branch 5 taken 1 times.
7 do f = 1, num_edge_facets
461
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 4 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 4 times.
4 facet_dim = indices(5 + f)
462
2/2
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 2 times.
5 if(facet_dim .eq. 1)then
463
2/2
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 2 times.
4 do s = 1, input_shape(4)
464
2/2
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 2 times.
6 do m = 1, input_shape(3)
465
8/14
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 2 times.
✓ Branch 18 taken 8 times.
✓ Branch 19 taken 2 times.
12 do j = adj_ja(1,(f-1)*4 + 3), adj_ja(1,(f-1)*4 + 4)
466 8 grad_sum = 0._real32
467
8/14
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 8 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 8 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 8 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 8 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 8 times.
✓ Branch 18 taken 16 times.
✓ Branch 19 taken 8 times.
24 do i = adj_ja(2,(f-1)*4 + 1), adj_ja(2,(f-1)*4 + 2)
468 idx_out = i + &
469 ( &
470
2/4
✗ Branch 1 not taken.
✓ Branch 2 taken 16 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 16 times.
16 j + adj_ja(2,(f-1)*4 + 3) - &
471
2/4
✗ Branch 1 not taken.
✓ Branch 2 taken 16 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 16 times.
16 adj_ja(1,(f-1)*4 + 3) - 1 &
472 ) * output_size_h + &
473
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 16 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 16 times.
32 (m-1) * output_size_h * output_size_w
474
4/8
✗ Branch 0 not taken.
✓ Branch 1 taken 16 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 16 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 16 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 16 times.
24 grad_sum = grad_sum + upstream_grad(idx_out, s)
475 end do
476
2/4
✗ Branch 1 not taken.
✓ Branch 2 taken 8 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 8 times.
8 idx_in = adj_ja(1,(f-1)*4 + 1) + (j-1) * input_size_h + &
477
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
8 (m-1) * input_size_h * input_size_w
478
8/16
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 8 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 8 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 8 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 8 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 8 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 8 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 8 times.
10 output(idx_in, s) = output(idx_in, s) + grad_sum
479 end do
480 end do
481 end do
482 else
483
2/2
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 2 times.
4 do s = 1, input_shape(4)
484
2/2
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 2 times.
6 do m = 1, input_shape(3)
485
8/14
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 2 times.
✓ Branch 18 taken 8 times.
✓ Branch 19 taken 2 times.
12 do i = adj_ja(1,(f-1)*4 + 1), adj_ja(1,(f-1)*4 + 2)
486 8 grad_sum = 0._real32
487
8/14
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 8 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 8 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 8 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 8 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 8 times.
✓ Branch 18 taken 16 times.
✓ Branch 19 taken 8 times.
24 do j = adj_ja(2,(f-1)*4 + 3), adj_ja(2,(f-1)*4 + 4)
488 idx_out = &
489
4/8
✗ Branch 1 not taken.
✓ Branch 2 taken 16 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 16 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 16 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 16 times.
32 ( i + adj_ja(2,(f-1)*4 + 1) - adj_ja(1,(f-1)*4 + 1) ) + &
490 (j-1) * output_size_h + &
491
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 16 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 16 times.
32 (m-1) * output_size_h * output_size_w
492
4/8
✗ Branch 0 not taken.
✓ Branch 1 taken 16 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 16 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 16 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 16 times.
24 grad_sum = grad_sum + upstream_grad(idx_out, s)
493 end do
494
2/4
✗ Branch 1 not taken.
✓ Branch 2 taken 8 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 8 times.
8 idx_in = i + (adj_ja(1,(f-1)*4 + 3) - 1) * &
495
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
8 input_size_h + (m-1) * input_size_h * input_size_w
496
8/16
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 8 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 8 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 8 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 8 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 8 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 8 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 8 times.
10 output(idx_in, s) = output(idx_in, s) + grad_sum
497 end do
498 end do
499 end do
500 end if
501 end do
502 end select
503
504 end subroutine accumulate_edge_gradients_2d_val
505 !###############################################################################
506
507
508 !###############################################################################
509 1 subroutine fill_corner_region_3d(input, output)
510 !! Fill corner region for 3D padding
511 implicit none
512
513 ! Arguments
514 type(array_type), intent(in) :: input
515 type(array_type), intent(inout) :: output
516
517 ! Local variables
518 integer :: i, j, k, m, s, f
519 integer :: step, idx_in, idx_out, idx_shift
520 integer :: input_h, input_w, input_d
521 integer :: output_h, output_w, output_d
522 integer, dimension(2,3) :: orig, dest
523
524
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
1 input_h = input%shape(1)
525
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
1 input_w = input%shape(2)
526
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
1 input_d = input%shape(3)
527
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
1 output_h = output%shape(1)
528
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
1 output_w = output%shape(2)
529
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
1 output_d = output%shape(3)
530
531
4/8
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 1 times.
1 idx_shift = ( output%indices(5) + output%indices(6) ) * 6
532
4/6
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✓ Branch 6 taken 8 times.
✓ Branch 7 taken 1 times.
9 do f = 1, output%indices(7)
533
9/16
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 8 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 8 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 8 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 8 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 8 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 8 times.
✓ Branch 21 taken 16 times.
✓ Branch 22 taken 8 times.
24 orig(1:2,1) = output%adj_ja(1,(f-1)*6 + 1 + idx_shift:(f-1)*6 + 2 + idx_shift)
534
9/16
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 8 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 8 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 8 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 8 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 8 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 8 times.
✓ Branch 21 taken 16 times.
✓ Branch 22 taken 8 times.
24 orig(1:2,2) = output%adj_ja(1,(f-1)*6 + 3 + idx_shift:(f-1)*6 + 4 + idx_shift)
535
9/16
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 8 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 8 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 8 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 8 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 8 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 8 times.
✓ Branch 21 taken 16 times.
✓ Branch 22 taken 8 times.
24 orig(1:2,3) = output%adj_ja(1,(f-1)*6 + 5 + idx_shift:(f-1)*6 + 6 + idx_shift)
536
9/16
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 8 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 8 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 8 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 8 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 8 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 8 times.
✓ Branch 21 taken 16 times.
✓ Branch 22 taken 8 times.
24 dest(1:2,1) = output%adj_ja(2,(f-1)*6 + 1 + idx_shift:(f-1)*6 + 2 + idx_shift)
537
9/16
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 8 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 8 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 8 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 8 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 8 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 8 times.
✓ Branch 21 taken 16 times.
✓ Branch 22 taken 8 times.
24 dest(1:2,2) = output%adj_ja(2,(f-1)*6 + 3 + idx_shift:(f-1)*6 + 4 + idx_shift)
538
9/16
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 8 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 8 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 8 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 8 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 8 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 8 times.
✓ Branch 21 taken 16 times.
✓ Branch 22 taken 8 times.
24 dest(1:2,3) = output%adj_ja(2,(f-1)*6 + 5 + idx_shift:(f-1)*6 + 6 + idx_shift)
539
540
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 8 times.
9 do concurrent( s = 1:size(output%val, dim=2), m = 1:output%shape(4) )
541
6/8
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 8 times.
✓ Branch 3 taken 8 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 8 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 8 times.
24 select case(output%indices(1))
542 case(3, 4) ! circular or reflection
543 step = merge(1, -1, output%indices(1) .eq. 3)
544 do k = dest(1,3), dest(2,3)
545 do j = dest(1,2), dest(2,2)
546 do i = dest(1,1), dest(2,1)
547 idx_out = i + (j-1) * output_h + &
548 (k-1) * output_h * output_w + &
549 (m - 1) * output_h * output_w * output_d
550 idx_in = orig(1,1) + step * (i - dest(1,1)) + &
551 (orig(1,2) + step * (j - dest(1,2)) - 1) * input_h + &
552 (orig(1,3) + step * (k - dest(1,3)) - 1) * &
553 input_h * input_w + &
554 (m - 1) * input_h * input_w * input_d
555 output%val(idx_out, s) = input%val(idx_in, s)
556 end do
557 end do
558 end do
559 case(5) ! replication
560 idx_in = orig(1,1) + &
561 (orig(1,2) - 1) * input_h + &
562 (orig(1,3) - 1) * input_h * input_w + &
563 8 (m - 1) * input_h * input_w * input_d
564
3/5
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 16 times.
✓ Branch 4 taken 8 times.
24 do k = dest(1,3), dest(2,3)
565
2/2
✓ Branch 0 taken 32 times.
✓ Branch 1 taken 16 times.
56 do j = dest(1,2), dest(2,2)
566
2/2
✓ Branch 0 taken 64 times.
✓ Branch 1 taken 32 times.
112 do i = dest(1,1), dest(2,1)
567 idx_out = i + (j - 1) * output_h + &
568 (k - 1) * output_h * output_w + &
569 64 (m - 1) * output_h * output_w * output_d
570
8/16
✗ Branch 0 not taken.
✓ Branch 1 taken 64 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 64 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 64 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 64 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 64 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 64 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 64 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 64 times.
96 output%val(idx_out, s) = input%val(idx_in, s)
571 end do
572 end do
573 end do
574 end select
575 end do
576 end do
577
578 1 end subroutine fill_corner_region_3d
579 !-------------------------------------------------------------------------------
580 1 subroutine fill_edge_region_3d(input, output)
581 !! Fill edge region for 3D padding
582 implicit none
583
584 ! Arguments
585 type(array_type), intent(in) :: input
586 type(array_type), intent(inout) :: output
587
588 ! Local variables
589 integer :: i, j, k, m, s, f, idim
590 integer :: step1, step2, step3, idx_in, idx_out, idx_shift
591 integer :: input_h, input_w, input_d
592 integer :: output_h, output_w, output_d
593 integer :: pad_h, pad_w, pad_d
594 integer, dimension(2,3) :: orig, dest
595
596
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
1 input_h = input%shape(1)
597
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
1 input_w = input%shape(2)
598
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
1 input_d = input%shape(3)
599
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
1 output_h = output%shape(1)
600
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
1 output_w = output%shape(2)
601
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
1 output_d = output%shape(3)
602
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
1 pad_h = output%indices(2)
603
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
1 pad_w = output%indices(3)
604
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
1 pad_d = output%indices(4)
605
606
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
1 idx_shift = output%indices(5) * 6
607
4/6
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✓ Branch 6 taken 12 times.
✓ Branch 7 taken 1 times.
13 do f = 1, output%indices(6)
608
4/8
✗ Branch 0 not taken.
✓ Branch 1 taken 12 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 12 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 12 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 12 times.
12 idim = output%indices(7 + output%indices(5) + f)
609
9/16
✗ Branch 0 not taken.
✓ Branch 1 taken 12 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 12 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 12 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 12 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 12 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 12 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 12 times.
✓ Branch 21 taken 24 times.
✓ Branch 22 taken 12 times.
36 orig(1:2,1) = output%adj_ja(1,(f-1)*6 + 1 + idx_shift:(f-1)*6 + 2 + idx_shift)
610
9/16
✗ Branch 0 not taken.
✓ Branch 1 taken 12 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 12 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 12 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 12 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 12 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 12 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 12 times.
✓ Branch 21 taken 24 times.
✓ Branch 22 taken 12 times.
36 orig(1:2,2) = output%adj_ja(1,(f-1)*6 + 3 + idx_shift:(f-1)*6 + 4 + idx_shift)
611
9/16
✗ Branch 0 not taken.
✓ Branch 1 taken 12 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 12 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 12 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 12 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 12 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 12 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 12 times.
✓ Branch 21 taken 24 times.
✓ Branch 22 taken 12 times.
36 orig(1:2,3) = output%adj_ja(1,(f-1)*6 + 5 + idx_shift:(f-1)*6 + 6 + idx_shift)
612
9/16
✗ Branch 0 not taken.
✓ Branch 1 taken 12 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 12 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 12 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 12 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 12 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 12 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 12 times.
✓ Branch 21 taken 24 times.
✓ Branch 22 taken 12 times.
36 dest(1:2,1) = output%adj_ja(2,(f-1)*6 + 1 + idx_shift:(f-1)*6 + 2 + idx_shift)
613
9/16
✗ Branch 0 not taken.
✓ Branch 1 taken 12 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 12 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 12 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 12 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 12 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 12 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 12 times.
✓ Branch 21 taken 24 times.
✓ Branch 22 taken 12 times.
36 dest(1:2,2) = output%adj_ja(2,(f-1)*6 + 3 + idx_shift:(f-1)*6 + 4 + idx_shift)
614
9/16
✗ Branch 0 not taken.
✓ Branch 1 taken 12 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 12 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 12 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 12 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 12 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 12 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 12 times.
✓ Branch 21 taken 24 times.
✓ Branch 22 taken 12 times.
36 dest(1:2,3) = output%adj_ja(2,(f-1)*6 + 5 + idx_shift:(f-1)*6 + 6 + idx_shift)
615
616
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 12 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 12 times.
13 do concurrent( s = 1:size(output%val, dim=2), m = 1:output%shape(4) )
617
6/8
✓ Branch 0 taken 12 times.
✓ Branch 1 taken 12 times.
✓ Branch 2 taken 12 times.
✓ Branch 3 taken 12 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 12 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 12 times.
36 select case(output%indices(1))
618 case(3, 4) ! circular or reflection
619 step1 = merge(-1, 1, output%indices(1) .eq. 4 .and. idim .eq. 1)
620 step2 = merge(-1, 1, output%indices(1) .eq. 4 .and. idim .eq. 2)
621 step3 = merge(-1, 1, output%indices(1) .eq. 4 .and. idim .eq. 3)
622 do k = dest(1,3), dest(2,3)
623 do j = dest(1,2), dest(2,2)
624 do i = dest(1,1), dest(2,1)
625 idx_out = i + (j-1) * output_h + &
626 (k-1) * output_h * output_w + &
627 (m - 1) * output_h * output_w * output_d
628 idx_in = orig(1,1) + step1 * (i - dest(1,1)) + &
629 (orig(1,2) + step2 * (j - dest(1,2)) - 1) * &
630 input_h + &
631 (orig(1,3) + step3 * (k - dest(1,3)) - 1) * &
632 input_h * input_w + &
633 (m - 1) * input_h * input_w * input_d
634 output%val(idx_out, s) = input%val(idx_in, s)
635 end do
636 end do
637 end do
638 case(5) ! replication
639
1/3
✗ Branch 0 not taken.
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
12 select case(idim)
640 case(1) ! Edge along dimension 1
641
2/2
✓ Branch 0 taken 16 times.
✓ Branch 1 taken 4 times.
24 do i = dest(1,1), dest(2,1)
642 idx_in = i - dest(1,1) + 1 + &
643 (orig(1,2) - 1) * input_h + &
644 (orig(1,3) - 1) * input_h * input_w + &
645 16 (m - 1) * input_h * input_w * input_d
646
2/2
✓ Branch 0 taken 32 times.
✓ Branch 1 taken 16 times.
52 do k = dest(1,3), dest(2,3)
647
2/2
✓ Branch 0 taken 64 times.
✓ Branch 1 taken 32 times.
112 do j = dest(1,2), dest(2,2)
648 idx_out = i + (j - 1) * output_h + &
649 (k - 1) * output_h * output_w + &
650 64 (m - 1) * output_h * output_w * output_d
651
8/16
✗ Branch 0 not taken.
✓ Branch 1 taken 64 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 64 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 64 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 64 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 64 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 64 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 64 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 64 times.
96 output%val(idx_out, s) = input%val(idx_in, s)
652 end do
653 end do
654 end do
655 case(2) ! Edge along dimension 2
656
2/2
✓ Branch 0 taken 16 times.
✓ Branch 1 taken 4 times.
24 do j = dest(1,2), dest(2,2)
657 idx_in = orig(1,1) + &
658 (j - dest(1,2)) * input_h + &
659 (orig(1,3) - 1) * input_h * input_w + &
660 16 (m - 1) * input_h * input_w * input_d
661
2/2
✓ Branch 0 taken 32 times.
✓ Branch 1 taken 16 times.
52 do k = dest(1,3), dest(2,3)
662
2/2
✓ Branch 0 taken 64 times.
✓ Branch 1 taken 32 times.
112 do i = dest(1,1), dest(2,1)
663 idx_out = i + (j - 1) * output_h + &
664 (k - 1) * output_h * output_w + &
665 64 (m - 1) * output_h * output_w * output_d
666
8/16
✗ Branch 0 not taken.
✓ Branch 1 taken 64 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 64 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 64 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 64 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 64 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 64 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 64 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 64 times.
96 output%val(idx_out, s) = input%val(idx_in, s)
667 end do
668 end do
669 end do
670 case(3) ! Edge along dimension 3
671
5/6
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 4 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 16 times.
✓ Branch 5 taken 4 times.
28 do k = dest(1,3), dest(2,3)
672 idx_in = orig(1,1) + &
673 (orig(1,2) - 1) * input_h + &
674 (k - dest(1,3)) * input_h * input_w + &
675 16 (m - 1) * input_h * input_w * input_d
676
2/2
✓ Branch 0 taken 32 times.
✓ Branch 1 taken 16 times.
52 do j = dest(1,2), dest(2,2)
677
2/2
✓ Branch 0 taken 64 times.
✓ Branch 1 taken 32 times.
112 do i = dest(1,1), dest(2,1)
678 idx_out = i + (j - 1) * output_h + &
679 (k - 1) * output_h * output_w + &
680 64 (m - 1) * output_h * output_w * output_d
681
8/16
✗ Branch 0 not taken.
✓ Branch 1 taken 64 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 64 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 64 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 64 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 64 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 64 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 64 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 64 times.
96 output%val(idx_out, s) = input%val(idx_in, s)
682 end do
683 end do
684 end do
685 end select
686 end select
687 end do
688 end do
689
690 1 end subroutine fill_edge_region_3d
691 !-------------------------------------------------------------------------------
692 1 subroutine fill_face_region_3d(input, output)
693 !! Fill face region for 3D padding
694 implicit none
695
696 ! Arguments
697 type(array_type), intent(in) :: input
698 type(array_type), intent(inout) :: output
699
700 ! Local variables
701 integer :: i, j, k, m, s, f, idim
702 integer :: step1, step2, step3, idx_in, idx_out
703 integer :: input_h, input_w, input_d
704 integer :: output_h, output_w, output_d
705 integer, dimension(2,3) :: orig, dest
706
707
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
1 input_h = input%shape(1)
708
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
1 input_w = input%shape(2)
709
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
1 input_d = input%shape(3)
710
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
1 output_h = output%shape(1)
711
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
1 output_w = output%shape(2)
712
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
1 output_d = output%shape(3)
713
714
4/6
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✓ Branch 6 taken 6 times.
✓ Branch 7 taken 1 times.
7 do f = 1, output%indices(5)
715
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 6 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 6 times.
6 idim = output%indices(7 + f)
716
9/16
✗ Branch 0 not taken.
✓ Branch 1 taken 6 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 6 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 6 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 6 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 6 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 6 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 6 times.
✓ Branch 21 taken 12 times.
✓ Branch 22 taken 6 times.
18 orig(1:2,1) = output%adj_ja(1,(f-1)*6 + 1:(f-1)*6 + 2)
717
9/16
✗ Branch 0 not taken.
✓ Branch 1 taken 6 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 6 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 6 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 6 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 6 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 6 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 6 times.
✓ Branch 21 taken 12 times.
✓ Branch 22 taken 6 times.
18 orig(1:2,2) = output%adj_ja(1,(f-1)*6 + 3:(f-1)*6 + 4)
718
9/16
✗ Branch 0 not taken.
✓ Branch 1 taken 6 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 6 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 6 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 6 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 6 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 6 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 6 times.
✓ Branch 21 taken 12 times.
✓ Branch 22 taken 6 times.
18 orig(1:2,3) = output%adj_ja(1,(f-1)*6 + 5:(f-1)*6 + 6)
719
9/16
✗ Branch 0 not taken.
✓ Branch 1 taken 6 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 6 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 6 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 6 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 6 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 6 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 6 times.
✓ Branch 21 taken 12 times.
✓ Branch 22 taken 6 times.
18 dest(1:2,1) = output%adj_ja(2,(f-1)*6 + 1:(f-1)*6 + 2)
720
9/16
✗ Branch 0 not taken.
✓ Branch 1 taken 6 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 6 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 6 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 6 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 6 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 6 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 6 times.
✓ Branch 21 taken 12 times.
✓ Branch 22 taken 6 times.
18 dest(1:2,2) = output%adj_ja(2,(f-1)*6 + 3:(f-1)*6 + 4)
721
9/16
✗ Branch 0 not taken.
✓ Branch 1 taken 6 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 6 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 6 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 6 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 6 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 6 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 6 times.
✓ Branch 21 taken 12 times.
✓ Branch 22 taken 6 times.
18 dest(1:2,3) = output%adj_ja(2,(f-1)*6 + 5:(f-1)*6 + 6)
722
723
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 6 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 6 times.
7 do concurrent( s = 1:size(output%val, dim=2), m = 1:output%shape(4) )
724
6/8
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 6 times.
✓ Branch 3 taken 6 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 6 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 6 times.
18 select case(output%indices(1))
725 case(3, 4) ! circular or reflection
726 step1 = merge(-1, 1, output%indices(1) .eq. 4 .and. idim .eq. 1)
727 step2 = merge(-1, 1, output%indices(1) .eq. 4 .and. idim .eq. 2)
728 step3 = merge(-1, 1, output%indices(1) .eq. 4 .and. idim .eq. 3)
729 do k = dest(1,3), dest(2,3)
730 do j = dest(1,2), dest(2,2)
731 do i = dest(1,1), dest(2,1)
732 idx_out = i + (j-1) * output_h + &
733 (k-1) * output_h * output_w + &
734 (m - 1) * output_h * output_w * output_d
735 idx_in = orig(1,1) + step1 * (i - dest(1,1)) + &
736 (orig(1,2) + step2 * (j - dest(1,2)) - 1) * &
737 input_h + &
738 (orig(1,3) + step3 * (k - dest(1,3)) - 1) * &
739 input_h * input_w + &
740 (m - 1) * input_h * input_w * input_d
741 output%val(idx_out, s) = input%val(idx_in, s)
742 end do
743 end do
744 end do
745 case(5) ! replication
746
1/3
✗ Branch 0 not taken.
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
6 select case(idim)
747 case(1) ! Face perpendicular to dimension 1
748
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 2 times.
12 do k = dest(1,3), dest(2,3)
749
2/2
✓ Branch 0 taken 32 times.
✓ Branch 1 taken 8 times.
42 do j = dest(1,2), dest(2,2)
750 idx_in = orig(1,1) + &
751 (j - dest(1,2) + orig(1,2) - 1) * input_h + &
752 (k - dest(1,3) + orig(1,3) - 1) * input_h * input_w + &
753 32 (m - 1) * input_h * input_w * input_d
754
2/2
✓ Branch 0 taken 64 times.
✓ Branch 1 taken 32 times.
104 do i = dest(1,1), dest(2,1)
755 idx_out = i + (j - 1) * output_h + &
756 (k - 1) * output_h * output_w + &
757 64 (m - 1) * output_h * output_w * output_d
758
8/16
✗ Branch 0 not taken.
✓ Branch 1 taken 64 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 64 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 64 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 64 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 64 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 64 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 64 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 64 times.
96 output%val(idx_out, s) = input%val(idx_in, s)
759 end do
760 end do
761 end do
762 case(2) ! Face perpendicular to dimension 2
763
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 2 times.
12 do k = dest(1,3), dest(2,3)
764
2/2
✓ Branch 0 taken 32 times.
✓ Branch 1 taken 8 times.
42 do i = dest(1,1), dest(2,1)
765 idx_in = i - dest(1,1) + orig(1,1) + &
766 (orig(1,2) - 1) * input_h + &
767 (k - dest(1,3) + orig(1,3) - 1) * input_h * input_w + &
768 32 (m - 1) * input_h * input_w * input_d
769
2/2
✓ Branch 0 taken 64 times.
✓ Branch 1 taken 32 times.
104 do j = dest(1,2), dest(2,2)
770 idx_out = i + (j - 1) * output_h + &
771 (k - 1) * output_h * output_w + &
772 64 (m - 1) * output_h * output_w * output_d
773
8/16
✗ Branch 0 not taken.
✓ Branch 1 taken 64 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 64 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 64 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 64 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 64 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 64 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 64 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 64 times.
96 output%val(idx_out, s) = input%val(idx_in, s)
774 end do
775 end do
776 end do
777 case(3) ! Face perpendicular to dimension 3
778
5/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 8 times.
✓ Branch 5 taken 2 times.
14 do j = dest(1,2), dest(2,2)
779
2/2
✓ Branch 0 taken 32 times.
✓ Branch 1 taken 8 times.
42 do i = dest(1,1), dest(2,1)
780 idx_in = i - dest(1,1) + orig(1,1) + &
781 (j - dest(1,2) + orig(1,2) - 1) * input_h + &
782 (orig(1,3) - 1) * input_h * input_w + &
783 32 (m - 1) * input_h * input_w * input_d
784
2/2
✓ Branch 0 taken 64 times.
✓ Branch 1 taken 32 times.
104 do k = dest(1,3), dest(2,3)
785 idx_out = i + (j - 1) * output_h + &
786 (k - 1) * output_h * output_w + &
787 64 (m - 1) * output_h * output_w * output_d
788
8/16
✗ Branch 0 not taken.
✓ Branch 1 taken 64 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 64 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 64 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 64 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 64 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 64 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 64 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 64 times.
96 output%val(idx_out, s) = input%val(idx_in, s)
789 end do
790 end do
791 end do
792 end select
793 end select
794 end do
795 end do
796
797 1 end subroutine fill_face_region_3d
798 !-------------------------------------------------------------------------------
799
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
1 pure subroutine accumulate_corner_gradients_3d_val(upstream_grad, output, &
800
3/6
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
1 input_shape, indices, adj_ja)
801 !! Accumulate corner gradients for 3D padding - raw array version
802 implicit none
803
804 ! Arguments
805 real(real32), dimension(:,:), intent(in) :: upstream_grad
806 real(real32), dimension(:,:), intent(inout) :: output
807 integer, dimension(5), intent(in) :: input_shape
808 integer, dimension(:), intent(in) :: indices
809 integer, dimension(:,:), intent(in) :: adj_ja
810
811 ! Local variables
812 integer :: i, j, k, m, s, f
813 integer :: step, idx_in, idx_out, idx_shift
814 integer :: input_h, input_w, input_d
815 integer :: output_h, output_w, output_d
816 integer, dimension(2,3) :: orig, dest
817 real(real32) :: grad_sum
818
819 1 input_h = input_shape(1)
820 1 input_w = input_shape(2)
821 1 input_d = input_shape(3)
822
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
1 output_h = input_h + 2 * indices(2)
823
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
1 output_w = input_w + 2 * indices(3)
824
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
1 output_d = input_d + 2 * indices(4)
825
826
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
1 if(indices(7) .eq. 0) return
827
828
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
1 idx_shift = ( indices(5) + indices(6) ) * 6
829
830
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
1 select case(indices(1))
831 case(3, 4) ! circular or reflection
832 step = merge(1, -1, indices(1) .eq. 3)
833 do f = 1, indices(7)
834 orig(1:2,1) = adj_ja(1,(f-1)*6 + 1 + idx_shift:(f-1)*6 + 2 + idx_shift)
835 orig(1:2,2) = adj_ja(1,(f-1)*6 + 3 + idx_shift:(f-1)*6 + 4 + idx_shift)
836 orig(1:2,3) = adj_ja(1,(f-1)*6 + 5 + idx_shift:(f-1)*6 + 6 + idx_shift)
837 dest(1:2,1) = adj_ja(2,(f-1)*6 + 1 + idx_shift:(f-1)*6 + 2 + idx_shift)
838 dest(1:2,2) = adj_ja(2,(f-1)*6 + 3 + idx_shift:(f-1)*6 + 4 + idx_shift)
839 dest(1:2,3) = adj_ja(2,(f-1)*6 + 5 + idx_shift:(f-1)*6 + 6 + idx_shift)
840
841 do s = 1, input_shape(5)
842 do m = 1, input_shape(4)
843 do k = dest(1,3), dest(2,3)
844 do j = dest(1,2), dest(2,2)
845 do i = dest(1,1), dest(2,1)
846 idx_out = i + (j-1) * output_h + &
847 (k-1) * output_h * output_w + &
848 (m - 1) * output_h * output_w * output_d
849 idx_in = orig(1,1) + step * (i - dest(1,1)) + &
850 (orig(1,2) + step * (j - dest(1,2)) - 1) * &
851 input_h + &
852 (orig(1,3) + step * (k - dest(1,3)) - 1) * &
853 input_h * input_w + &
854 (m - 1) * input_h * input_w * input_d
855 output(idx_in, s) = output(idx_in, s) + &
856 upstream_grad(idx_out, s)
857 end do
858 end do
859 end do
860 end do
861 end do
862 end do
863 case(5) ! replication
864
4/7
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✓ Branch 6 taken 8 times.
✓ Branch 7 taken 1 times.
9 do f = 1, indices(7)
865
8/14
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 8 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 8 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 8 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 8 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 8 times.
✓ Branch 18 taken 16 times.
✓ Branch 19 taken 8 times.
24 orig(1:2,1) = adj_ja(1,(f-1)*6 + 1 + idx_shift:(f-1)*6 + 2 + idx_shift)
866
8/14
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 8 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 8 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 8 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 8 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 8 times.
✓ Branch 18 taken 16 times.
✓ Branch 19 taken 8 times.
24 orig(1:2,2) = adj_ja(1,(f-1)*6 + 3 + idx_shift:(f-1)*6 + 4 + idx_shift)
867
8/14
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 8 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 8 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 8 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 8 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 8 times.
✓ Branch 18 taken 16 times.
✓ Branch 19 taken 8 times.
24 orig(1:2,3) = adj_ja(1,(f-1)*6 + 5 + idx_shift:(f-1)*6 + 6 + idx_shift)
868
8/14
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 8 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 8 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 8 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 8 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 8 times.
✓ Branch 18 taken 16 times.
✓ Branch 19 taken 8 times.
24 dest(1:2,1) = adj_ja(2,(f-1)*6 + 1 + idx_shift:(f-1)*6 + 2 + idx_shift)
869
8/14
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 8 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 8 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 8 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 8 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 8 times.
✓ Branch 18 taken 16 times.
✓ Branch 19 taken 8 times.
24 dest(1:2,2) = adj_ja(2,(f-1)*6 + 3 + idx_shift:(f-1)*6 + 4 + idx_shift)
870
8/14
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 8 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 8 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 8 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 8 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 8 times.
✓ Branch 18 taken 16 times.
✓ Branch 19 taken 8 times.
24 dest(1:2,3) = adj_ja(2,(f-1)*6 + 5 + idx_shift:(f-1)*6 + 6 + idx_shift)
871
872
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
17 do s = 1, input_shape(5)
873
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
24 do m = 1, input_shape(4)
874 8 grad_sum = 0._real32
875
2/2
✓ Branch 0 taken 16 times.
✓ Branch 1 taken 8 times.
24 do k = dest(1,3), dest(2,3)
876
2/2
✓ Branch 0 taken 32 times.
✓ Branch 1 taken 16 times.
56 do j = dest(1,2), dest(2,2)
877
2/2
✓ Branch 0 taken 64 times.
✓ Branch 1 taken 32 times.
112 do i = dest(1,1), dest(2,1)
878 idx_out = i + (j-1) * output_h + &
879 (k-1) * output_h * output_w + &
880 64 (m - 1) * output_h * output_w * output_d
881
4/8
✗ Branch 0 not taken.
✓ Branch 1 taken 64 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 64 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 64 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 64 times.
96 grad_sum = grad_sum + upstream_grad(idx_out, s)
882 end do
883 end do
884 end do
885 idx_in = orig(1,1) + (orig(1,2) - 1) * input_h + &
886 (orig(1,3) - 1) * input_h * input_w + &
887 8 (m - 1) * input_h * input_w * input_d
888
8/16
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 8 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 8 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 8 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 8 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 8 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 8 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 8 times.
16 output(idx_in, s) = output(idx_in, s) + grad_sum
889 end do
890 end do
891 end do
892 end select
893
894 end subroutine accumulate_corner_gradients_3d_val
895 !-------------------------------------------------------------------------------
896
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
1 pure subroutine accumulate_edge_gradients_3d_val(upstream_grad, output, &
897
3/6
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
1 input_shape, indices, adj_ja)
898 !! Accumulate edge gradients for 3D padding - raw array version
899 implicit none
900
901 ! Arguments
902 real(real32), dimension(:,:), intent(in) :: upstream_grad
903 real(real32), dimension(:,:), intent(inout) :: output
904 integer, dimension(5), intent(in) :: input_shape
905 integer, dimension(:), intent(in) :: indices
906 integer, dimension(:,:), intent(in) :: adj_ja
907
908 ! Local variables
909 integer :: i, j, k, m, s, f, idim
910 integer :: step1, step2, step3, idx_in, idx_out, idx_shift
911 integer :: input_h, input_w, input_d
912 integer :: output_h, output_w, output_d
913 integer, dimension(2,3) :: orig, dest
914 real(real32) :: grad_sum
915
916 1 input_h = input_shape(1)
917 1 input_w = input_shape(2)
918 1 input_d = input_shape(3)
919
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
1 output_h = input_h + 2 * indices(2)
920
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
1 output_w = input_w + 2 * indices(3)
921
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
1 output_d = input_d + 2 * indices(4)
922
923
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
1 if(indices(6) .eq. 0) return
924
925
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
1 idx_shift = indices(5) * 6
926
927
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
1 select case(indices(1))
928 case(3, 4) ! circular or reflection
929 do f = 1, indices(6)
930 idim = indices(7 + indices(5) + f)
931 orig(1:2,1) = adj_ja(1,(f-1)*6 + 1 + idx_shift:(f-1)*6 + 2 + idx_shift)
932 orig(1:2,2) = adj_ja(1,(f-1)*6 + 3 + idx_shift:(f-1)*6 + 4 + idx_shift)
933 orig(1:2,3) = adj_ja(1,(f-1)*6 + 5 + idx_shift:(f-1)*6 + 6 + idx_shift)
934 dest(1:2,1) = adj_ja(2,(f-1)*6 + 1 + idx_shift:(f-1)*6 + 2 + idx_shift)
935 dest(1:2,2) = adj_ja(2,(f-1)*6 + 3 + idx_shift:(f-1)*6 + 4 + idx_shift)
936 dest(1:2,3) = adj_ja(2,(f-1)*6 + 5 + idx_shift:(f-1)*6 + 6 + idx_shift)
937
938 step1 = merge(-1, 1, indices(1) .eq. 4 .and. idim .eq. 1)
939 step2 = merge(-1, 1, indices(1) .eq. 4 .and. idim .eq. 2)
940 step3 = merge(-1, 1, indices(1) .eq. 4 .and. idim .eq. 3)
941
942 do s = 1, input_shape(5)
943 do m = 1, input_shape(4)
944 do k = dest(1,3), dest(2,3)
945 do j = dest(1,2), dest(2,2)
946 do i = dest(1,1), dest(2,1)
947 idx_out = i + (j-1) * output_h + &
948 (k-1) * output_h * output_w + &
949 (m - 1) * output_h * output_w * output_d
950 idx_in = orig(1,1) + step1 * (i - dest(1,1)) + &
951 (orig(1,2) + step2 * (j - dest(1,2)) - 1) * &
952 input_h + &
953 (orig(1,3) + step3 * (k - dest(1,3)) - 1) * &
954 input_h * input_w + &
955 (m - 1) * input_h * input_w * input_d
956 output(idx_in, s) = output(idx_in, s) + &
957 upstream_grad(idx_out, s)
958 end do
959 end do
960 end do
961 end do
962 end do
963 end do
964 case(5) ! replication
965
4/7
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✓ Branch 6 taken 12 times.
✓ Branch 7 taken 1 times.
13 do f = 1, indices(6)
966
3/6
✗ Branch 0 not taken.
✓ Branch 1 taken 12 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 12 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 12 times.
12 idim = indices(7 + indices(5) + f)
967
8/14
✗ Branch 0 not taken.
✓ Branch 1 taken 12 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 12 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 12 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 12 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 12 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 12 times.
✓ Branch 18 taken 24 times.
✓ Branch 19 taken 12 times.
36 orig(1:2,1) = adj_ja(1,(f-1)*6 + 1 + idx_shift:(f-1)*6 + 2 + idx_shift)
968
8/14
✗ Branch 0 not taken.
✓ Branch 1 taken 12 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 12 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 12 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 12 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 12 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 12 times.
✓ Branch 18 taken 24 times.
✓ Branch 19 taken 12 times.
36 orig(1:2,2) = adj_ja(1,(f-1)*6 + 3 + idx_shift:(f-1)*6 + 4 + idx_shift)
969
8/14
✗ Branch 0 not taken.
✓ Branch 1 taken 12 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 12 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 12 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 12 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 12 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 12 times.
✓ Branch 18 taken 24 times.
✓ Branch 19 taken 12 times.
36 orig(1:2,3) = adj_ja(1,(f-1)*6 + 5 + idx_shift:(f-1)*6 + 6 + idx_shift)
970
8/14
✗ Branch 0 not taken.
✓ Branch 1 taken 12 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 12 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 12 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 12 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 12 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 12 times.
✓ Branch 18 taken 24 times.
✓ Branch 19 taken 12 times.
36 dest(1:2,1) = adj_ja(2,(f-1)*6 + 1 + idx_shift:(f-1)*6 + 2 + idx_shift)
971
8/14
✗ Branch 0 not taken.
✓ Branch 1 taken 12 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 12 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 12 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 12 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 12 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 12 times.
✓ Branch 18 taken 24 times.
✓ Branch 19 taken 12 times.
36 dest(1:2,2) = adj_ja(2,(f-1)*6 + 3 + idx_shift:(f-1)*6 + 4 + idx_shift)
972
8/14
✗ Branch 0 not taken.
✓ Branch 1 taken 12 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 12 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 12 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 12 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 12 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 12 times.
✓ Branch 18 taken 24 times.
✓ Branch 19 taken 12 times.
36 dest(1:2,3) = adj_ja(2,(f-1)*6 + 5 + idx_shift:(f-1)*6 + 6 + idx_shift)
973
974 1 select case(idim)
975 case(1) ! Edge along dimension 1
976
2/2
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 4 times.
12 do s = 1, input_shape(5)
977
2/2
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 4 times.
12 do m = 1, input_shape(4)
978
2/2
✓ Branch 0 taken 16 times.
✓ Branch 1 taken 4 times.
24 do i = dest(1,1), dest(2,1)
979 idx_in = i - dest(1,1) + 1 + &
980 (orig(1,2) - 1) * input_h + &
981 (orig(1,3) - 1) * input_h * input_w + &
982 16 (m - 1) * input_h * input_w * input_d
983 16 grad_sum = 0._real32
984
2/2
✓ Branch 0 taken 32 times.
✓ Branch 1 taken 16 times.
48 do k = dest(1,3), dest(2,3)
985
2/2
✓ Branch 0 taken 64 times.
✓ Branch 1 taken 32 times.
112 do j = dest(1,2), dest(2,2)
986 idx_out = i + (j - 1) * output_h + &
987 (k - 1) * output_h * output_w + &
988 64 (m - 1) * output_h * output_w * output_d
989
4/8
✗ Branch 0 not taken.
✓ Branch 1 taken 64 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 64 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 64 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 64 times.
96 grad_sum = grad_sum + upstream_grad(idx_out, s)
990 end do
991 end do
992
8/16
✗ Branch 0 not taken.
✓ Branch 1 taken 16 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 16 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 16 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 16 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 16 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 16 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 16 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 16 times.
20 output(idx_in, s) = output(idx_in, s) + grad_sum
993 end do
994 end do
995 end do
996 case(2) ! Edge along dimension 2
997
2/2
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 4 times.
12 do s = 1, input_shape(5)
998
2/2
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 4 times.
12 do m = 1, input_shape(4)
999
2/2
✓ Branch 0 taken 16 times.
✓ Branch 1 taken 4 times.
24 do j = dest(1,2), dest(2,2)
1000 idx_in = orig(1,1) + &
1001 (j - dest(1,2)) * input_h + &
1002 (orig(1,3) - 1) * input_h * input_w + &
1003 16 (m - 1) * input_h * input_w * input_d
1004 16 grad_sum = 0._real32
1005
2/2
✓ Branch 0 taken 32 times.
✓ Branch 1 taken 16 times.
48 do k = dest(1,3), dest(2,3)
1006
2/2
✓ Branch 0 taken 64 times.
✓ Branch 1 taken 32 times.
112 do i = dest(1,1), dest(2,1)
1007 idx_out = i + (j - 1) * output_h + &
1008 (k - 1) * output_h * output_w + &
1009 64 (m - 1) * output_h * output_w * output_d
1010
4/8
✗ Branch 0 not taken.
✓ Branch 1 taken 64 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 64 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 64 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 64 times.
96 grad_sum = grad_sum + upstream_grad(idx_out, s)
1011 end do
1012 end do
1013
8/16
✗ Branch 0 not taken.
✓ Branch 1 taken 16 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 16 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 16 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 16 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 16 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 16 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 16 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 16 times.
20 output(idx_in, s) = output(idx_in, s) + grad_sum
1014 end do
1015 end do
1016 end do
1017 case(3) ! Edge along dimension 3
1018
5/6
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 4 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 4 times.
✓ Branch 5 taken 4 times.
16 do s = 1, input_shape(5)
1019
2/2
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 4 times.
12 do m = 1, input_shape(4)
1020
2/2
✓ Branch 0 taken 16 times.
✓ Branch 1 taken 4 times.
24 do k = dest(1,3), dest(2,3)
1021 idx_in = orig(1,1) + &
1022 (orig(1,2) - 1) * input_h + &
1023 (k - dest(1,3)) * input_h * input_w + &
1024 16 (m - 1) * input_h * input_w * input_d
1025 16 grad_sum = 0._real32
1026
2/2
✓ Branch 0 taken 32 times.
✓ Branch 1 taken 16 times.
48 do j = dest(1,2), dest(2,2)
1027
2/2
✓ Branch 0 taken 64 times.
✓ Branch 1 taken 32 times.
112 do i = dest(1,1), dest(2,1)
1028 idx_out = i + (j - 1) * output_h + &
1029 (k - 1) * output_h * output_w + &
1030 64 (m - 1) * output_h * output_w * output_d
1031
4/8
✗ Branch 0 not taken.
✓ Branch 1 taken 64 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 64 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 64 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 64 times.
96 grad_sum = grad_sum + upstream_grad(idx_out, s)
1032 end do
1033 end do
1034
8/16
✗ Branch 0 not taken.
✓ Branch 1 taken 16 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 16 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 16 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 16 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 16 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 16 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 16 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 16 times.
20 output(idx_in, s) = output(idx_in, s) + grad_sum
1035 end do
1036 end do
1037 end do
1038 end select
1039 end do
1040 end select
1041
1042 end subroutine accumulate_edge_gradients_3d_val
1043 !-------------------------------------------------------------------------------
1044
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
1 pure subroutine accumulate_face_gradients_3d_val(upstream_grad, output, &
1045
3/6
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
1 input_shape, indices, adj_ja)
1046 !! Accumulate face gradients for 3D padding - raw array version
1047 implicit none
1048
1049 ! Arguments
1050 real(real32), dimension(:,:), intent(in) :: upstream_grad
1051 real(real32), dimension(:,:), intent(inout) :: output
1052 integer, dimension(5), intent(in) :: input_shape
1053 integer, dimension(:), intent(in) :: indices
1054 integer, dimension(:,:), intent(in) :: adj_ja
1055
1056 ! Local variables
1057 integer :: i, j, k, m, s, f, idim
1058 integer :: step1, step2, step3, idx_in, idx_out
1059 integer :: input_h, input_w, input_d
1060 integer :: output_h, output_w, output_d
1061 integer, dimension(2,3) :: orig, dest
1062 real(real32) :: grad_sum
1063
1064 1 input_h = input_shape(1)
1065 1 input_w = input_shape(2)
1066 1 input_d = input_shape(3)
1067
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
1 output_h = input_h + 2 * indices(2)
1068
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
1 output_w = input_w + 2 * indices(4)
1069
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
1 output_d = input_d + 2 * indices(4)
1070
1071
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
1 if(indices(5) .eq. 0) return
1072
1073
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
1 select case(indices(1))
1074 case(3, 4) ! circular or reflection
1075 do f = 1, indices(5)
1076 idim = indices(7 + f)
1077 orig(1:2,1) = adj_ja(1,(f-1)*6 + 1:(f-1)*6 + 2)
1078 orig(1:2,2) = adj_ja(1,(f-1)*6 + 3:(f-1)*6 + 4)
1079 orig(1:2,3) = adj_ja(1,(f-1)*6 + 5:(f-1)*6 + 6)
1080 dest(1:2,1) = adj_ja(2,(f-1)*6 + 1:(f-1)*6 + 2)
1081 dest(1:2,2) = adj_ja(2,(f-1)*6 + 3:(f-1)*6 + 4)
1082 dest(1:2,3) = adj_ja(2,(f-1)*6 + 5:(f-1)*6 + 6)
1083
1084 step1 = merge(-1, 1, indices(1) .eq. 4 .and. idim .eq. 1)
1085 step2 = merge(-1, 1, indices(1) .eq. 4 .and. idim .eq. 2)
1086 step3 = merge(-1, 1, indices(1) .eq. 4 .and. idim .eq. 3)
1087
1088 do s = 1, input_shape(5)
1089 do m = 1, input_shape(4)
1090 do k = dest(1,3), dest(2,3)
1091 do j = dest(1,2), dest(2,2)
1092 do i = dest(1,1), dest(2,1)
1093 idx_out = i + (j-1) * output_h + &
1094 (k-1) * output_h * output_w + &
1095 (m - 1) * output_h * output_w * output_d
1096 idx_in = orig(1,1) + step1 * (i - dest(1,1)) + &
1097 (orig(1,2) + step2 * (j - dest(1,2)) - 1) * &
1098 input_h + &
1099 (orig(1,3) + step3 * (k - dest(1,3)) - 1) * &
1100 input_h * input_w + &
1101 (m - 1) * input_h * input_w * input_d
1102 output(idx_in, s) = output(idx_in, s) + &
1103 upstream_grad(idx_out, s)
1104 end do
1105 end do
1106 end do
1107 end do
1108 end do
1109 end do
1110 case(5) ! replication
1111
4/7
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✓ Branch 6 taken 6 times.
✓ Branch 7 taken 1 times.
7 do f = 1, indices(5)
1112
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 6 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 6 times.
6 idim = indices(7 + f)
1113
8/14
✗ Branch 0 not taken.
✓ Branch 1 taken 6 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 6 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 6 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 6 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 6 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 6 times.
✓ Branch 18 taken 12 times.
✓ Branch 19 taken 6 times.
18 orig(1:2,1) = adj_ja(1,(f-1)*6 + 1:(f-1)*6 + 2)
1114
8/14
✗ Branch 0 not taken.
✓ Branch 1 taken 6 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 6 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 6 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 6 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 6 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 6 times.
✓ Branch 18 taken 12 times.
✓ Branch 19 taken 6 times.
18 orig(1:2,2) = adj_ja(1,(f-1)*6 + 3:(f-1)*6 + 4)
1115
8/14
✗ Branch 0 not taken.
✓ Branch 1 taken 6 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 6 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 6 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 6 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 6 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 6 times.
✓ Branch 18 taken 12 times.
✓ Branch 19 taken 6 times.
18 orig(1:2,3) = adj_ja(1,(f-1)*6 + 5:(f-1)*6 + 6)
1116
8/14
✗ Branch 0 not taken.
✓ Branch 1 taken 6 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 6 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 6 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 6 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 6 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 6 times.
✓ Branch 18 taken 12 times.
✓ Branch 19 taken 6 times.
18 dest(1:2,1) = adj_ja(2,(f-1)*6 + 1:(f-1)*6 + 2)
1117
8/14
✗ Branch 0 not taken.
✓ Branch 1 taken 6 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 6 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 6 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 6 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 6 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 6 times.
✓ Branch 18 taken 12 times.
✓ Branch 19 taken 6 times.
18 dest(1:2,2) = adj_ja(2,(f-1)*6 + 3:(f-1)*6 + 4)
1118
8/14
✗ Branch 0 not taken.
✓ Branch 1 taken 6 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 6 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 6 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 6 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 6 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 6 times.
✓ Branch 18 taken 12 times.
✓ Branch 19 taken 6 times.
18 dest(1:2,3) = adj_ja(2,(f-1)*6 + 5:(f-1)*6 + 6)
1119
1120 1 select case(idim)
1121 case(1) ! Face perpendicular to dimension 1
1122
2/2
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 2 times.
6 do s = 1, input_shape(5)
1123
2/2
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 2 times.
6 do m = 1, input_shape(4)
1124
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 2 times.
12 do k = dest(1,3), dest(2,3)
1125
2/2
✓ Branch 0 taken 32 times.
✓ Branch 1 taken 8 times.
42 do j = dest(1,2), dest(2,2)
1126 idx_in = orig(1,1) + &
1127 ( j - dest(1,2) ) * input_h + &
1128 ( k - dest(1,3) ) * input_h * input_w + &
1129 32 (m - 1) * input_h * input_w * input_d
1130 32 grad_sum = 0._real32
1131
2/2
✓ Branch 0 taken 64 times.
✓ Branch 1 taken 32 times.
96 do i = dest(1,1), dest(2,1)
1132 idx_out = i + (j-1) * output_h + &
1133 (k-1) * output_h * output_w + &
1134 64 (m - 1) * output_h * output_w * output_d
1135
4/8
✗ Branch 0 not taken.
✓ Branch 1 taken 64 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 64 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 64 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 64 times.
96 grad_sum = grad_sum + upstream_grad(idx_out, s)
1136 end do
1137
8/16
✗ Branch 0 not taken.
✓ Branch 1 taken 32 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 32 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 32 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 32 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 32 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 32 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 32 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 32 times.
40 output(idx_in, s) = output(idx_in, s) + grad_sum
1138 end do
1139 end do
1140 end do
1141 end do
1142 case(2) ! Face perpendicular to dimension 2
1143
2/2
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 2 times.
6 do s = 1, input_shape(5)
1144
2/2
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 2 times.
6 do m = 1, input_shape(4)
1145
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 2 times.
12 do k = dest(1,3), dest(2,3)
1146
2/2
✓ Branch 0 taken 32 times.
✓ Branch 1 taken 8 times.
42 do i = dest(1,1), dest(2,1)
1147 idx_in = i - dest(1,1) + 1 + &
1148 ( k - dest(1,3) ) * input_h * input_w + &
1149 32 (m - 1) * input_h * input_w * input_d
1150 32 grad_sum = 0._real32
1151
2/2
✓ Branch 0 taken 64 times.
✓ Branch 1 taken 32 times.
96 do j = dest(1,2), dest(2,2)
1152 idx_out = i + (j-1) * output_h + &
1153 (k-1) * output_h * output_w + &
1154 64 (m - 1) * output_h * output_w * output_d
1155
4/8
✗ Branch 0 not taken.
✓ Branch 1 taken 64 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 64 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 64 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 64 times.
96 grad_sum = grad_sum + upstream_grad(idx_out, s)
1156 end do
1157
8/16
✗ Branch 0 not taken.
✓ Branch 1 taken 32 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 32 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 32 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 32 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 32 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 32 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 32 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 32 times.
40 output(idx_in, s) = output(idx_in, s) + grad_sum
1158 end do
1159 end do
1160 end do
1161 end do
1162 case(3) ! Face perpendicular to dimension 3
1163
5/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 2 times.
8 do s = 1, input_shape(5)
1164
2/2
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 2 times.
6 do m = 1, input_shape(4)
1165
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 2 times.
12 do j = dest(1,2), dest(2,2)
1166
2/2
✓ Branch 0 taken 32 times.
✓ Branch 1 taken 8 times.
42 do i = dest(1,1), dest(2,1)
1167 idx_in = i - dest(1,1) + 1 + &
1168 ( j - dest(1,2) ) * input_h + &
1169 32 (m - 1) * input_h * input_w * input_d
1170 32 grad_sum = 0._real32
1171
2/2
✓ Branch 0 taken 64 times.
✓ Branch 1 taken 32 times.
96 do k = dest(1,3), dest(2,3)
1172 idx_out = i + (j-1) * output_h + &
1173 (k-1) * output_h * output_w + &
1174 64 (m - 1) * output_h * output_w * output_d
1175
4/8
✗ Branch 0 not taken.
✓ Branch 1 taken 64 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 64 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 64 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 64 times.
96 grad_sum = grad_sum + upstream_grad(idx_out, s)
1176 end do
1177
8/16
✗ Branch 0 not taken.
✓ Branch 1 taken 32 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 32 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 32 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 32 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 32 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 32 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 32 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 32 times.
40 output(idx_in, s) = output(idx_in, s) + grad_sum
1178 end do
1179 end do
1180 end do
1181 end do
1182 end select
1183 end do
1184 end select
1185
1186 end subroutine accumulate_face_gradients_3d_val
1187 !###############################################################################
1188
1189
1190 !###############################################################################
1191 13 module function pad1d(input, facets, pad_size, imethod) result(output)
1192 !! 1D padding operation
1193 implicit none
1194
1195 ! Arguments
1196 type(array_type), intent(in), target :: input
1197 type(facets_type), intent(in) :: facets
1198 integer, intent(in) :: pad_size
1199 integer, intent(in) :: imethod
1200 type(array_type), pointer :: output
1201
1202 ! Local variables
1203 integer :: i, m, s
1204 integer :: idx_in, idx_out
1205 integer :: input_size, output_size
1206 integer, dimension(3) :: output_shape
1207
1208
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 13 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 13 times.
13 input_size = input%shape(1)
1209 13 output_size = input_size + 2 * pad_size
1210
1211
4/6
✗ Branch 0 not taken.
✓ Branch 1 taken 13 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 13 times.
✓ Branch 6 taken 39 times.
✓ Branch 7 taken 13 times.
52 output_shape = [ output_size, input%shape(2), size(input%val, dim=2) ]
1212 13 output => input%create_result(array_shape = output_shape)
1213
1214 ! save the facet values to indices and adj_ja
1215
8/16
✓ Branch 0 taken 13 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 13 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 13 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 13 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 13 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 13 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 13 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 13 times.
13 allocate(output%indices(2 + facets%num))
1216
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 13 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 13 times.
13 output%indices(1) = imethod
1217
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 13 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 13 times.
13 output%indices(2) = pad_size
1218
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 13 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 13 times.
13 output%indices(3) = facets%num
1219
8/16
✓ Branch 0 taken 13 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 13 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 13 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 13 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 13 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 13 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 13 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 13 times.
13 allocate(output%adj_ja(2, 2 * facets%num))
1220
2/2
✓ Branch 0 taken 26 times.
✓ Branch 1 taken 13 times.
39 do i = 1, facets%num
1221
10/20
✗ Branch 0 not taken.
✓ Branch 1 taken 26 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 26 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 26 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 26 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 26 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 26 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 26 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 26 times.
✗ Branch 24 not taken.
✓ Branch 25 taken 26 times.
✗ Branch 27 not taken.
✓ Branch 28 taken 26 times.
26 output%adj_ja(1,(i-1)*2 + 1) = facets%orig_bound(1,1,i)
1222
10/20
✗ Branch 0 not taken.
✓ Branch 1 taken 26 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 26 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 26 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 26 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 26 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 26 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 26 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 26 times.
✗ Branch 24 not taken.
✓ Branch 25 taken 26 times.
✗ Branch 27 not taken.
✓ Branch 28 taken 26 times.
26 output%adj_ja(2,(i-1)*2 + 1) = facets%dest_bound(1,1,i)
1223
10/20
✗ Branch 0 not taken.
✓ Branch 1 taken 26 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 26 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 26 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 26 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 26 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 26 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 26 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 26 times.
✗ Branch 24 not taken.
✓ Branch 25 taken 26 times.
✗ Branch 27 not taken.
✓ Branch 28 taken 26 times.
26 output%adj_ja(1,(i-1)*2 + 2) = facets%orig_bound(2,1,i)
1224
10/20
✗ Branch 0 not taken.
✓ Branch 1 taken 26 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 26 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 26 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 26 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 26 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 26 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 26 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 26 times.
✗ Branch 24 not taken.
✓ Branch 25 taken 26 times.
✗ Branch 27 not taken.
✓ Branch 28 taken 26 times.
39 output%adj_ja(2,(i-1)*2 + 2) = facets%dest_bound(2,1,i)
1225 end do
1226
1227 ! Initialise with pad_value
1228
4/4
✓ Branch 0 taken 15 times.
✓ Branch 1 taken 13 times.
✓ Branch 2 taken 350 times.
✓ Branch 3 taken 15 times.
378 output%val = 0._real32
1229
1230 ! Copy input into the correct location in output
1231 do concurrent( &
1232 s = 1:output_shape(3), &
1233 m = 1:output_shape(2), &
1234 13 i = 1:input_size)
1235 214 idx_in = i + (m-1) * input_size
1236 214 idx_out = i + pad_size + (m-1) * output_size
1237
14/22
✓ Branch 0 taken 70 times.
✓ Branch 1 taken 13 times.
✓ Branch 2 taken 178 times.
✓ Branch 3 taken 70 times.
✓ Branch 4 taken 214 times.
✓ Branch 5 taken 178 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 214 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 214 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 214 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 214 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 214 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 214 times.
✗ Branch 24 not taken.
✓ Branch 25 taken 214 times.
✗ Branch 27 not taken.
✓ Branch 28 taken 214 times.
475 output%val(idx_out, s) = input%val(idx_in, s)
1238 end do
1239
1240
6/10
✗ Branch 0 not taken.
✓ Branch 1 taken 13 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 13 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 13 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 13 times.
✓ Branch 12 taken 3 times.
✓ Branch 13 taken 10 times.
13 if(output%indices(1) .ge. 3 .and. output%indices(1) .le. 5)then
1241 3 call fill_edge_region_1d( input, output )
1242 end if
1243
1244
1245 13 output%get_partial_left => get_partial_pad1d
1246 13 output%get_partial_left_val => get_partial_pad1d_val
1247
2/2
✓ Branch 0 taken 12 times.
✓ Branch 1 taken 1 times.
13 if(input%requires_grad)then
1248 12 output%requires_grad = .true.
1249 12 output%is_forward = input%is_forward
1250 12 output%operation = 'pad'
1251 12 output%left_operand => input
1252 end if
1253
1254 13 end function pad1d
1255 !-------------------------------------------------------------------------------
1256 function get_partial_pad1d(this, upstream_grad) result(output)
1257 !! Get the partial derivative for the pad1d operation
1258 implicit none
1259
1260 ! Arguments
1261 class(array_type), intent(inout) :: this
1262 type(array_type), intent(in) :: upstream_grad
1263 type(array_type) :: output
1264
1265 ! Local variables
1266 integer, dimension(3) :: input_shape
1267
1268 input_shape = [ this%left_operand%shape, size(this%val, dim=2) ]
1269 call output%allocate(array_shape = input_shape)
1270 output%indices = this%indices
1271 output%adj_ja = this%adj_ja
1272
1273 call this%get_partial_left_val(upstream_grad%val, output%val)
1274
1275 end function get_partial_pad1d
1276 !-------------------------------------------------------------------------------
1277
2/4
✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 5 times.
✗ Branch 3 not taken.
5 pure subroutine get_partial_pad1d_val(this, upstream_grad, output)
1278 !! Get the partial derivative for the pad1d operation - raw array version
1279 implicit none
1280
1281 ! Arguments
1282 class(array_type), intent(in) :: this
1283 real(real32), dimension(:,:), intent(in) :: upstream_grad
1284 real(real32), dimension(:,:), intent(out) :: output
1285
1286 ! Local variables
1287 integer :: i, m, s
1288 integer :: idx_in, idx_out
1289 integer :: input_size, output_size
1290 integer :: num_samples, num_features
1291 integer, dimension(3) :: input_shape
1292
1293
14/24
✗ Branch 0 not taken.
✓ Branch 1 taken 5 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 5 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 5 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 5 times.
✓ Branch 12 taken 10 times.
✓ Branch 13 taken 5 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 5 times.
✗ Branch 17 not taken.
✓ Branch 18 taken 5 times.
✗ Branch 20 not taken.
✓ Branch 21 taken 5 times.
✗ Branch 23 not taken.
✓ Branch 24 taken 5 times.
✗ Branch 26 not taken.
✓ Branch 27 taken 5 times.
✗ Branch 29 not taken.
✓ Branch 30 taken 5 times.
✓ Branch 32 taken 15 times.
✓ Branch 33 taken 5 times.
30 input_shape = [ this%left_operand%shape, size(upstream_grad, dim=2) ]
1294 5 num_samples = input_shape(3)
1295 5 num_features = input_shape(2)
1296 5 input_size = input_shape(1)
1297
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 5 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 5 times.
5 output_size = input_size + 2 * this%indices(2)
1298
1299
10/16
✗ Branch 0 not taken.
✓ Branch 1 taken 5 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 5 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 5 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 5 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 5 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 5 times.
✓ Branch 18 taken 6 times.
✓ Branch 19 taken 5 times.
✓ Branch 20 taken 52 times.
✓ Branch 21 taken 6 times.
63 output = 0._real32
1300
1301 ! Main gradient extraction
1302 do concurrent( &
1303 s = 1:num_samples, &
1304 m = 1:num_features, &
1305 5 i = 1:input_size)
1306 52 idx_in = i + (m-1) * input_size
1307
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 52 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 52 times.
52 idx_out = i + this%indices(2) + (m-1) * output_size
1308
14/22
✓ Branch 0 taken 22 times.
✓ Branch 1 taken 5 times.
✓ Branch 2 taken 34 times.
✓ Branch 3 taken 22 times.
✓ Branch 4 taken 52 times.
✓ Branch 5 taken 34 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 52 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 52 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 52 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 52 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 52 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 52 times.
✗ Branch 24 not taken.
✓ Branch 25 taken 52 times.
✗ Branch 27 not taken.
✓ Branch 28 taken 52 times.
113 output(idx_in, s) = upstream_grad(idx_out, s)
1309 end do
1310
1311 ! Handle edge gradients for special padding modes
1312
6/10
✗ Branch 0 not taken.
✓ Branch 1 taken 5 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 5 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 5 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 5 times.
✓ Branch 12 taken 3 times.
✓ Branch 13 taken 2 times.
5 if(this%indices(1) .ge. 3 .and. this%indices(1) .le. 5)then
1313 call accumulate_edge_gradients_1d_val( &
1314 upstream_grad, output, input_shape, this%indices, this%adj_ja &
1315
12/24
✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 3 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 3 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 3 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 3 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 3 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 3 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 3 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 3 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 3 times.
✗ Branch 20 not taken.
✓ Branch 21 taken 3 times.
✗ Branch 22 not taken.
✓ Branch 23 taken 3 times.
3 )
1316 end if
1317
1318 5 end subroutine get_partial_pad1d_val
1319 !###############################################################################
1320
1321
1322 !###############################################################################
1323 14 module function pad2d(input, facets, pad_size, imethod) result(output)
1324 !! 2D padding operation
1325 implicit none
1326
1327 ! Arguments
1328 type(array_type), intent(in), target :: input
1329 type(facets_type), dimension(2), intent(in) :: facets
1330 integer, dimension(2), intent(in) :: pad_size
1331 integer, intent(in) :: imethod
1332 type(array_type), pointer :: output
1333
1334 ! Local variables
1335 integer :: i, j, m, s
1336 integer :: idx_in, idx_out, idx_shift
1337 integer :: input_size_h, input_size_w, num_channels
1338 integer :: output_size_h, output_size_w
1339 integer, dimension(4) :: output_shape
1340
1341
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 14 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 14 times.
14 input_size_h = input%shape(1)
1342
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 14 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 14 times.
14 input_size_w = input%shape(2)
1343
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 14 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 14 times.
14 num_channels = input%shape(3)
1344 14 output_size_h = input_size_h + 2 * pad_size(1)
1345 14 output_size_w = input_size_w + 2 * pad_size(2)
1346
1347 output_shape = [ &
1348 output_size_h, output_size_w, num_channels, size(input%val, dim=2) &
1349
2/2
✓ Branch 0 taken 56 times.
✓ Branch 1 taken 14 times.
70 ]
1350 14 output => input%create_result(array_shape = output_shape)
1351
1352 ! save the facet values to indices and adj_ja
1353
10/18
✓ Branch 0 taken 28 times.
✓ Branch 1 taken 14 times.
✓ Branch 2 taken 14 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 14 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 14 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 14 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 14 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 14 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 14 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 14 times.
42 allocate(output%indices(3 + 2 + sum( facets(:)%num )))
1354
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 14 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 14 times.
14 output%indices(1) = imethod
1355
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 14 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 14 times.
14 output%indices(2) = pad_size(1)
1356
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 14 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 14 times.
14 output%indices(3) = pad_size(2)
1357
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 14 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 14 times.
14 output%indices(4) = facets(1)%num
1358
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 14 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 14 times.
14 output%indices(5) = facets(2)%num
1359
11/18
✗ Branch 0 not taken.
✓ Branch 1 taken 14 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 14 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 14 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 14 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 14 times.
✓ Branch 14 taken 56 times.
✓ Branch 15 taken 14 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 56 times.
✗ Branch 19 not taken.
✓ Branch 20 taken 56 times.
✓ Branch 22 taken 56 times.
✓ Branch 23 taken 14 times.
126 output%indices(6:5 + facets(1)%num) = [(facets(1)%dim(i), i=1, facets(1)%num)]
1360 output%indices(6 + facets(1)%num:5 + facets(1)%num + facets(2)%num) = &
1361
11/18
✗ Branch 0 not taken.
✓ Branch 1 taken 14 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 14 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 14 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 14 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 14 times.
✓ Branch 10 taken 56 times.
✓ Branch 11 taken 14 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 56 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 56 times.
✓ Branch 18 taken 56 times.
✓ Branch 19 taken 14 times.
126 [(facets(2)%dim(i), i=1, facets(2)%num)]
1362
8/16
✓ Branch 0 taken 14 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 14 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 14 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 14 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 14 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 14 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 14 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 14 times.
14 allocate(output%adj_ja(2, 4 * ( facets(1)%num + facets(2)%num )))
1363 ! Edges (1D faces)
1364
2/2
✓ Branch 0 taken 56 times.
✓ Branch 1 taken 14 times.
70 do i = 1, facets(1)%num
1365
10/20
✗ Branch 0 not taken.
✓ Branch 1 taken 56 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 56 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 56 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 56 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 56 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 56 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 56 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 56 times.
✗ Branch 24 not taken.
✓ Branch 25 taken 56 times.
✗ Branch 27 not taken.
✓ Branch 28 taken 56 times.
56 output%adj_ja(1,(i-1)*4 + 1) = facets(1)%orig_bound(1,1,i)
1366
10/20
✗ Branch 0 not taken.
✓ Branch 1 taken 56 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 56 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 56 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 56 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 56 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 56 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 56 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 56 times.
✗ Branch 24 not taken.
✓ Branch 25 taken 56 times.
✗ Branch 27 not taken.
✓ Branch 28 taken 56 times.
56 output%adj_ja(2,(i-1)*4 + 1) = facets(1)%dest_bound(1,1,i)
1367
10/20
✗ Branch 0 not taken.
✓ Branch 1 taken 56 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 56 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 56 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 56 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 56 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 56 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 56 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 56 times.
✗ Branch 24 not taken.
✓ Branch 25 taken 56 times.
✗ Branch 27 not taken.
✓ Branch 28 taken 56 times.
56 output%adj_ja(1,(i-1)*4 + 2) = facets(1)%orig_bound(2,1,i)
1368
10/20
✗ Branch 0 not taken.
✓ Branch 1 taken 56 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 56 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 56 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 56 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 56 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 56 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 56 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 56 times.
✗ Branch 24 not taken.
✓ Branch 25 taken 56 times.
✗ Branch 27 not taken.
✓ Branch 28 taken 56 times.
56 output%adj_ja(2,(i-1)*4 + 2) = facets(1)%dest_bound(2,1,i)
1369
10/20
✗ Branch 0 not taken.
✓ Branch 1 taken 56 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 56 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 56 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 56 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 56 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 56 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 56 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 56 times.
✗ Branch 24 not taken.
✓ Branch 25 taken 56 times.
✗ Branch 27 not taken.
✓ Branch 28 taken 56 times.
56 output%adj_ja(1,(i-1)*4 + 3) = facets(1)%orig_bound(1,2,i)
1370
10/20
✗ Branch 0 not taken.
✓ Branch 1 taken 56 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 56 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 56 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 56 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 56 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 56 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 56 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 56 times.
✗ Branch 24 not taken.
✓ Branch 25 taken 56 times.
✗ Branch 27 not taken.
✓ Branch 28 taken 56 times.
56 output%adj_ja(2,(i-1)*4 + 3) = facets(1)%dest_bound(1,2,i)
1371
10/20
✗ Branch 0 not taken.
✓ Branch 1 taken 56 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 56 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 56 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 56 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 56 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 56 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 56 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 56 times.
✗ Branch 24 not taken.
✓ Branch 25 taken 56 times.
✗ Branch 27 not taken.
✓ Branch 28 taken 56 times.
56 output%adj_ja(1,(i-1)*4 + 4) = facets(1)%orig_bound(2,2,i)
1372
10/20
✗ Branch 0 not taken.
✓ Branch 1 taken 56 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 56 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 56 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 56 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 56 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 56 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 56 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 56 times.
✗ Branch 24 not taken.
✓ Branch 25 taken 56 times.
✗ Branch 27 not taken.
✓ Branch 28 taken 56 times.
70 output%adj_ja(2,(i-1)*4 + 4) = facets(1)%dest_bound(2,2,i)
1373 end do
1374 14 idx_shift = facets(1)%num * 4
1375 ! Corners (2D edges)
1376
2/2
✓ Branch 0 taken 56 times.
✓ Branch 1 taken 14 times.
70 do i = 1, facets(2)%num
1377
10/20
✗ Branch 0 not taken.
✓ Branch 1 taken 56 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 56 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 56 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 56 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 56 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 56 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 56 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 56 times.
✗ Branch 24 not taken.
✓ Branch 25 taken 56 times.
✗ Branch 27 not taken.
✓ Branch 28 taken 56 times.
56 output%adj_ja(1,(i-1)*4 + 1 + idx_shift) = facets(2)%orig_bound(1,1,i)
1378
10/20
✗ Branch 0 not taken.
✓ Branch 1 taken 56 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 56 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 56 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 56 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 56 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 56 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 56 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 56 times.
✗ Branch 24 not taken.
✓ Branch 25 taken 56 times.
✗ Branch 27 not taken.
✓ Branch 28 taken 56 times.
56 output%adj_ja(2,(i-1)*4 + 1 + idx_shift) = facets(2)%dest_bound(1,1,i)
1379
10/20
✗ Branch 0 not taken.
✓ Branch 1 taken 56 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 56 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 56 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 56 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 56 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 56 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 56 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 56 times.
✗ Branch 24 not taken.
✓ Branch 25 taken 56 times.
✗ Branch 27 not taken.
✓ Branch 28 taken 56 times.
56 output%adj_ja(1,(i-1)*4 + 2 + idx_shift) = facets(2)%orig_bound(2,1,i)
1380
10/20
✗ Branch 0 not taken.
✓ Branch 1 taken 56 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 56 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 56 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 56 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 56 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 56 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 56 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 56 times.
✗ Branch 24 not taken.
✓ Branch 25 taken 56 times.
✗ Branch 27 not taken.
✓ Branch 28 taken 56 times.
56 output%adj_ja(2,(i-1)*4 + 2 + idx_shift) = facets(2)%dest_bound(2,1,i)
1381
10/20
✗ Branch 0 not taken.
✓ Branch 1 taken 56 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 56 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 56 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 56 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 56 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 56 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 56 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 56 times.
✗ Branch 24 not taken.
✓ Branch 25 taken 56 times.
✗ Branch 27 not taken.
✓ Branch 28 taken 56 times.
56 output%adj_ja(1,(i-1)*4 + 3 + idx_shift) = facets(2)%orig_bound(1,2,i)
1382
10/20
✗ Branch 0 not taken.
✓ Branch 1 taken 56 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 56 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 56 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 56 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 56 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 56 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 56 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 56 times.
✗ Branch 24 not taken.
✓ Branch 25 taken 56 times.
✗ Branch 27 not taken.
✓ Branch 28 taken 56 times.
56 output%adj_ja(2,(i-1)*4 + 3 + idx_shift) = facets(2)%dest_bound(1,2,i)
1383
10/20
✗ Branch 0 not taken.
✓ Branch 1 taken 56 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 56 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 56 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 56 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 56 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 56 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 56 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 56 times.
✗ Branch 24 not taken.
✓ Branch 25 taken 56 times.
✗ Branch 27 not taken.
✓ Branch 28 taken 56 times.
56 output%adj_ja(1,(i-1)*4 + 4 + idx_shift) = facets(2)%orig_bound(2,2,i)
1384
10/20
✗ Branch 0 not taken.
✓ Branch 1 taken 56 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 56 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 56 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 56 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 56 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 56 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 56 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 56 times.
✗ Branch 24 not taken.
✓ Branch 25 taken 56 times.
✗ Branch 27 not taken.
✓ Branch 28 taken 56 times.
70 output%adj_ja(2,(i-1)*4 + 4 + idx_shift) = facets(2)%dest_bound(2,2,i)
1385 end do
1386
1387 ! Initialise with zero
1388
4/4
✓ Branch 0 taken 16 times.
✓ Branch 1 taken 14 times.
✓ Branch 2 taken 836 times.
✓ Branch 3 taken 16 times.
866 output%val = 0._real32
1389
1390 ! Copy input into the correct location in output
1391 do concurrent( &
1392 s = 1:output_shape(4), &
1393 m = 1:num_channels, &
1394 j = 1:input_size_w, &
1395 14 i = 1:input_size_h)
1396 256 idx_in = i + (j-1) * input_size_h + (m-1) * input_size_h * input_size_w
1397 idx_out = (i + pad_size(1)) + (j + pad_size(2) - 1) * output_size_h + &
1398 256 (m-1) * output_size_h * output_size_w
1399
16/24
✓ Branch 0 taken 56 times.
✓ Branch 1 taken 14 times.
✓ Branch 2 taken 184 times.
✓ Branch 3 taken 56 times.
✓ Branch 4 taken 208 times.
✓ Branch 5 taken 184 times.
✓ Branch 6 taken 256 times.
✓ Branch 7 taken 208 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 256 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 256 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 256 times.
✗ Branch 17 not taken.
✓ Branch 18 taken 256 times.
✗ Branch 20 not taken.
✓ Branch 21 taken 256 times.
✗ Branch 23 not taken.
✓ Branch 24 taken 256 times.
✗ Branch 26 not taken.
✓ Branch 27 taken 256 times.
✗ Branch 29 not taken.
✓ Branch 30 taken 256 times.
718 output%val(idx_out, s) = input%val(idx_in, s)
1400 end do
1401
1402
6/10
✗ Branch 0 not taken.
✓ Branch 1 taken 14 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 14 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 14 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 14 times.
✓ Branch 12 taken 3 times.
✓ Branch 13 taken 11 times.
14 if(output%indices(1) .ge. 3 .and. output%indices(1) .le. 5)then
1403 3 call fill_corner_region_2d( input, output )
1404 3 call fill_edge_region_2d( input, output )
1405 end if
1406
1407 14 output%get_partial_left => get_partial_pad2d
1408 14 output%get_partial_left_val => get_partial_pad2d_val
1409
2/2
✓ Branch 0 taken 13 times.
✓ Branch 1 taken 1 times.
14 if(input%requires_grad)then
1410 13 output%requires_grad = .true.
1411 13 output%is_forward = input%is_forward
1412 13 output%operation = 'pad'
1413 13 output%left_operand => input
1414 end if
1415
1416 14 end function pad2d
1417 !-------------------------------------------------------------------------------
1418 function get_partial_pad2d(this, upstream_grad) result(output)
1419 !! Get the partial derivative for the pad2d operation
1420 implicit none
1421
1422 ! Arguments
1423 class(array_type), intent(inout) :: this
1424 type(array_type), intent(in) :: upstream_grad
1425 type(array_type) :: output
1426
1427 ! Local variables
1428 integer, dimension(4) :: input_shape
1429
1430 input_shape = [ this%left_operand%shape, size(this%val, dim=2) ]
1431 call output%allocate(array_shape = input_shape)
1432 output%indices = this%indices
1433 output%adj_ja = this%adj_ja
1434
1435 call this%get_partial_left_val(upstream_grad%val, output%val)
1436
1437 end function get_partial_pad2d
1438 !-------------------------------------------------------------------------------
1439
2/4
✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 5 times.
✗ Branch 3 not taken.
5 pure subroutine get_partial_pad2d_val(this, upstream_grad, output)
1440 !! Get the partial derivative for the pad2d operation - raw array version
1441 implicit none
1442
1443 ! Arguments
1444 class(array_type), intent(in) :: this
1445 real(real32), dimension(:,:), intent(in) :: upstream_grad
1446 real(real32), dimension(:,:), intent(out) :: output
1447
1448 ! Local variables
1449 integer :: i, j, m, s
1450 integer :: idx_in, idx_out
1451 integer :: input_size_h, input_size_w, num_channels
1452 integer :: output_size_h, output_size_w
1453 integer :: num_samples
1454 integer, dimension(4) :: input_shape
1455
1456
14/24
✗ Branch 0 not taken.
✓ Branch 1 taken 5 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 5 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 5 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 5 times.
✓ Branch 12 taken 15 times.
✓ Branch 13 taken 5 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 5 times.
✗ Branch 17 not taken.
✓ Branch 18 taken 5 times.
✗ Branch 20 not taken.
✓ Branch 21 taken 5 times.
✗ Branch 23 not taken.
✓ Branch 24 taken 5 times.
✗ Branch 26 not taken.
✓ Branch 27 taken 5 times.
✗ Branch 29 not taken.
✓ Branch 30 taken 5 times.
✓ Branch 32 taken 20 times.
✓ Branch 33 taken 5 times.
40 input_shape = [ this%left_operand%shape, size(upstream_grad, dim=2) ]
1457 5 num_samples = input_shape(4)
1458 5 input_size_h = input_shape(1)
1459 5 input_size_w = input_shape(2)
1460 5 num_channels = input_shape(3)
1461
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 5 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 5 times.
5 output_size_h = input_size_h + 2 * this%indices(2)
1462
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 5 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 5 times.
5 output_size_w = input_size_w + 2 * this%indices(3)
1463
1464
10/16
✗ Branch 0 not taken.
✓ Branch 1 taken 5 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 5 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 5 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 5 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 5 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 5 times.
✓ Branch 18 taken 6 times.
✓ Branch 19 taken 5 times.
✓ Branch 20 taken 112 times.
✓ Branch 21 taken 6 times.
123 output = 0._real32
1465
1466 ! Main gradient extraction
1467 do concurrent( &
1468 s = 1:num_samples, &
1469 m = 1:num_channels, &
1470 j = 1:input_size_w, &
1471 5 i = 1:input_size_h)
1472 112 idx_in = i + (j-1) * input_size_h + (m-1) * input_size_h * input_size_w
1473 224 idx_out = (i + this%indices(2)) + &
1474 224 (j + this%indices(3) - 1) * output_size_h + &
1475
4/8
✗ Branch 0 not taken.
✓ Branch 1 taken 112 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 112 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 112 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 112 times.
112 (m-1) * output_size_h * output_size_w
1476
16/24
✓ Branch 0 taken 20 times.
✓ Branch 1 taken 5 times.
✓ Branch 2 taken 76 times.
✓ Branch 3 taken 20 times.
✓ Branch 4 taken 88 times.
✓ Branch 5 taken 76 times.
✓ Branch 6 taken 112 times.
✓ Branch 7 taken 88 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 112 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 112 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 112 times.
✗ Branch 17 not taken.
✓ Branch 18 taken 112 times.
✗ Branch 20 not taken.
✓ Branch 21 taken 112 times.
✗ Branch 23 not taken.
✓ Branch 24 taken 112 times.
✗ Branch 26 not taken.
✓ Branch 27 taken 112 times.
✗ Branch 29 not taken.
✓ Branch 30 taken 112 times.
301 output(idx_in, s) = upstream_grad(idx_out, s)
1477 end do
1478
1479 ! Handle corner and edge gradients for special padding modes
1480
6/10
✗ Branch 0 not taken.
✓ Branch 1 taken 5 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 5 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 5 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 5 times.
✓ Branch 12 taken 3 times.
✓ Branch 13 taken 2 times.
5 if(this%indices(1) .ge. 3 .and. this%indices(1) .le. 5)then
1481 call accumulate_corner_gradients_2d_val( &
1482 upstream_grad, output, input_shape, this%indices, this%adj_ja &
1483
12/24
✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 3 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 3 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 3 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 3 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 3 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 3 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 3 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 3 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 3 times.
✗ Branch 20 not taken.
✓ Branch 21 taken 3 times.
✗ Branch 22 not taken.
✓ Branch 23 taken 3 times.
3 )
1484 call accumulate_edge_gradients_2d_val( &
1485 upstream_grad, output, input_shape, this%indices, this%adj_ja &
1486
12/24
✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 3 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 3 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 3 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 3 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 3 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 3 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 3 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 3 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 3 times.
✗ Branch 20 not taken.
✓ Branch 21 taken 3 times.
✗ Branch 22 not taken.
✓ Branch 23 taken 3 times.
3 )
1487 end if
1488
1489 5 end subroutine get_partial_pad2d_val
1490 !###############################################################################
1491
1492
1493 !###############################################################################
1494 13 module function pad3d(input, facets, pad_size, imethod) result(output)
1495 !! 3D padding operation
1496 implicit none
1497
1498 ! Arguments
1499 type(array_type), intent(in), target :: input
1500 type(facets_type), dimension(3), intent(in) :: facets
1501 integer, dimension(3), intent(in) :: pad_size
1502 integer, intent(in) :: imethod
1503 type(array_type), pointer :: output
1504
1505 ! Local variables
1506 integer :: i, j, k, m, s
1507 integer :: idx_in, idx_out, idx_shift
1508 integer :: input_size_h, input_size_w, input_size_d, num_channels
1509 integer :: output_size_h, output_size_w, output_size_d
1510 integer, dimension(5) :: output_shape
1511
1512
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 13 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 13 times.
13 input_size_h = input%shape(1)
1513
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 13 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 13 times.
13 input_size_w = input%shape(2)
1514
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 13 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 13 times.
13 input_size_d = input%shape(3)
1515
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 13 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 13 times.
13 num_channels = input%shape(4)
1516 13 output_size_h = input_size_h + 2 * pad_size(1)
1517 13 output_size_w = input_size_w + 2 * pad_size(2)
1518 13 output_size_d = input_size_d + 2 * pad_size(3)
1519
1520 output_shape = [ output_size_h, output_size_w, output_size_d, num_channels, &
1521
2/2
✓ Branch 0 taken 65 times.
✓ Branch 1 taken 13 times.
78 size(input%val, dim=2) ]
1522 13 output => input%create_result(array_shape = output_shape)
1523
1524 ! save the facet values to indices and adj_ja
1525
10/18
✓ Branch 0 taken 39 times.
✓ Branch 1 taken 13 times.
✓ Branch 2 taken 13 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 13 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 13 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 13 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 13 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 13 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 13 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 13 times.
52 allocate(output%indices(4 + 3 + sum( facets(:)%num )))
1526
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 13 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 13 times.
13 output%indices(1) = imethod
1527
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 13 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 13 times.
13 output%indices(2) = pad_size(1)
1528
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 13 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 13 times.
13 output%indices(3) = pad_size(2)
1529
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 13 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 13 times.
13 output%indices(4) = pad_size(3)
1530
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 13 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 13 times.
13 output%indices(5) = facets(1)%num
1531
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 13 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 13 times.
13 output%indices(6) = facets(2)%num
1532
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 13 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 13 times.
13 output%indices(7) = facets(3)%num
1533
11/18
✗ Branch 0 not taken.
✓ Branch 1 taken 13 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 13 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 13 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 13 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 13 times.
✓ Branch 14 taken 78 times.
✓ Branch 15 taken 13 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 78 times.
✗ Branch 19 not taken.
✓ Branch 20 taken 78 times.
✓ Branch 22 taken 78 times.
✓ Branch 23 taken 13 times.
169 output%indices(8:7 + facets(1)%num) = [(facets(1)%dim(i), i=1, facets(1)%num)]
1534 output%indices(8 + facets(1)%num:7 + facets(1)%num + facets(2)%num) = &
1535
11/18
✗ Branch 0 not taken.
✓ Branch 1 taken 13 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 13 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 13 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 13 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 13 times.
✓ Branch 10 taken 156 times.
✓ Branch 11 taken 13 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 156 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 156 times.
✓ Branch 18 taken 156 times.
✓ Branch 19 taken 13 times.
325 [(facets(2)%dim(i), i=1, facets(2)%num)]
1536 output%indices(8 + facets(1)%num + facets(2)%num:7 + &
1537 facets(1)%num + facets(2)%num + facets(3)%num) = &
1538
11/18
✗ Branch 0 not taken.
✓ Branch 1 taken 13 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 13 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 13 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 13 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 13 times.
✓ Branch 10 taken 104 times.
✓ Branch 11 taken 13 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 104 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 104 times.
✓ Branch 18 taken 104 times.
✓ Branch 19 taken 13 times.
221 [(facets(3)%dim(i), i=1, facets(3)%num)]
1539
8/16
✓ Branch 0 taken 13 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 13 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 13 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 13 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 13 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 13 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 13 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 13 times.
13 allocate(output%adj_ja(2, 6 * (facets(1)%num + facets(2)%num + facets(3)%num)))
1540 ! Edges (1D edges)
1541
2/2
✓ Branch 0 taken 78 times.
✓ Branch 1 taken 13 times.
91 do i = 1, facets(1)%num
1542
17/32
✗ Branch 0 not taken.
✓ Branch 1 taken 78 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 78 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 78 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 78 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 78 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 78 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 78 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 78 times.
✗ Branch 24 not taken.
✓ Branch 25 taken 78 times.
✗ Branch 27 not taken.
✓ Branch 28 taken 78 times.
✗ Branch 30 not taken.
✓ Branch 31 taken 78 times.
✗ Branch 33 not taken.
✓ Branch 34 taken 78 times.
✗ Branch 36 not taken.
✓ Branch 37 taken 78 times.
✗ Branch 39 not taken.
✓ Branch 40 taken 78 times.
✗ Branch 42 not taken.
✓ Branch 43 taken 78 times.
✓ Branch 45 taken 156 times.
✓ Branch 46 taken 78 times.
234 output%adj_ja(1,(i-1)*6 + 1 : (i-1)*6 + 2) = facets(1)%orig_bound(1:2,1,i)
1543
17/32
✗ Branch 0 not taken.
✓ Branch 1 taken 78 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 78 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 78 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 78 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 78 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 78 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 78 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 78 times.
✗ Branch 24 not taken.
✓ Branch 25 taken 78 times.
✗ Branch 27 not taken.
✓ Branch 28 taken 78 times.
✗ Branch 30 not taken.
✓ Branch 31 taken 78 times.
✗ Branch 33 not taken.
✓ Branch 34 taken 78 times.
✗ Branch 36 not taken.
✓ Branch 37 taken 78 times.
✗ Branch 39 not taken.
✓ Branch 40 taken 78 times.
✗ Branch 42 not taken.
✓ Branch 43 taken 78 times.
✓ Branch 45 taken 156 times.
✓ Branch 46 taken 78 times.
234 output%adj_ja(1,(i-1)*6 + 3 : (i-1)*6 + 4) = facets(1)%orig_bound(1:2,2,i)
1544
17/32
✗ Branch 0 not taken.
✓ Branch 1 taken 78 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 78 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 78 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 78 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 78 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 78 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 78 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 78 times.
✗ Branch 24 not taken.
✓ Branch 25 taken 78 times.
✗ Branch 27 not taken.
✓ Branch 28 taken 78 times.
✗ Branch 30 not taken.
✓ Branch 31 taken 78 times.
✗ Branch 33 not taken.
✓ Branch 34 taken 78 times.
✗ Branch 36 not taken.
✓ Branch 37 taken 78 times.
✗ Branch 39 not taken.
✓ Branch 40 taken 78 times.
✗ Branch 42 not taken.
✓ Branch 43 taken 78 times.
✓ Branch 45 taken 156 times.
✓ Branch 46 taken 78 times.
234 output%adj_ja(1,(i-1)*6 + 5 : (i-1)*6 + 6) = facets(1)%orig_bound(1:2,3,i)
1545
17/32
✗ Branch 0 not taken.
✓ Branch 1 taken 78 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 78 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 78 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 78 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 78 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 78 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 78 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 78 times.
✗ Branch 24 not taken.
✓ Branch 25 taken 78 times.
✗ Branch 27 not taken.
✓ Branch 28 taken 78 times.
✗ Branch 30 not taken.
✓ Branch 31 taken 78 times.
✗ Branch 33 not taken.
✓ Branch 34 taken 78 times.
✗ Branch 36 not taken.
✓ Branch 37 taken 78 times.
✗ Branch 39 not taken.
✓ Branch 40 taken 78 times.
✗ Branch 42 not taken.
✓ Branch 43 taken 78 times.
✓ Branch 45 taken 156 times.
✓ Branch 46 taken 78 times.
234 output%adj_ja(2,(i-1)*6 + 1 : (i-1)*6 + 2) = facets(1)%dest_bound(1:2,1,i)
1546
17/32
✗ Branch 0 not taken.
✓ Branch 1 taken 78 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 78 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 78 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 78 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 78 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 78 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 78 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 78 times.
✗ Branch 24 not taken.
✓ Branch 25 taken 78 times.
✗ Branch 27 not taken.
✓ Branch 28 taken 78 times.
✗ Branch 30 not taken.
✓ Branch 31 taken 78 times.
✗ Branch 33 not taken.
✓ Branch 34 taken 78 times.
✗ Branch 36 not taken.
✓ Branch 37 taken 78 times.
✗ Branch 39 not taken.
✓ Branch 40 taken 78 times.
✗ Branch 42 not taken.
✓ Branch 43 taken 78 times.
✓ Branch 45 taken 156 times.
✓ Branch 46 taken 78 times.
234 output%adj_ja(2,(i-1)*6 + 3 : (i-1)*6 + 4) = facets(1)%dest_bound(1:2,2,i)
1547
17/32
✗ Branch 0 not taken.
✓ Branch 1 taken 78 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 78 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 78 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 78 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 78 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 78 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 78 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 78 times.
✗ Branch 24 not taken.
✓ Branch 25 taken 78 times.
✗ Branch 27 not taken.
✓ Branch 28 taken 78 times.
✗ Branch 30 not taken.
✓ Branch 31 taken 78 times.
✗ Branch 33 not taken.
✓ Branch 34 taken 78 times.
✗ Branch 36 not taken.
✓ Branch 37 taken 78 times.
✗ Branch 39 not taken.
✓ Branch 40 taken 78 times.
✗ Branch 42 not taken.
✓ Branch 43 taken 78 times.
✓ Branch 45 taken 156 times.
✓ Branch 46 taken 78 times.
247 output%adj_ja(2,(i-1)*6 + 5 : (i-1)*6 + 6) = facets(1)%dest_bound(1:2,3,i)
1548 end do
1549 13 idx_shift = facets(1)%num * 6
1550 ! Faces (2D faces)
1551
2/2
✓ Branch 0 taken 156 times.
✓ Branch 1 taken 13 times.
169 do i = 1, facets(2)%num
1552 output%adj_ja(1,(i-1)*6 + 1 + idx_shift : (i-1)*6 + 2 + idx_shift) = &
1553
17/32
✗ Branch 0 not taken.
✓ Branch 1 taken 156 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 156 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 156 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 156 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 156 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 156 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 156 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 156 times.
✗ Branch 20 not taken.
✓ Branch 21 taken 156 times.
✗ Branch 23 not taken.
✓ Branch 24 taken 156 times.
✗ Branch 26 not taken.
✓ Branch 27 taken 156 times.
✗ Branch 29 not taken.
✓ Branch 30 taken 156 times.
✗ Branch 32 not taken.
✓ Branch 33 taken 156 times.
✗ Branch 35 not taken.
✓ Branch 36 taken 156 times.
✗ Branch 37 not taken.
✓ Branch 38 taken 156 times.
✓ Branch 39 taken 312 times.
✓ Branch 40 taken 156 times.
468 facets(2)%orig_bound(1:2,1,i)
1554 output%adj_ja(1,(i-1)*6 + 3 + idx_shift : (i-1)*6 + 4 + idx_shift) = &
1555
17/32
✗ Branch 0 not taken.
✓ Branch 1 taken 156 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 156 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 156 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 156 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 156 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 156 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 156 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 156 times.
✗ Branch 20 not taken.
✓ Branch 21 taken 156 times.
✗ Branch 23 not taken.
✓ Branch 24 taken 156 times.
✗ Branch 26 not taken.
✓ Branch 27 taken 156 times.
✗ Branch 29 not taken.
✓ Branch 30 taken 156 times.
✗ Branch 32 not taken.
✓ Branch 33 taken 156 times.
✗ Branch 35 not taken.
✓ Branch 36 taken 156 times.
✗ Branch 37 not taken.
✓ Branch 38 taken 156 times.
✓ Branch 39 taken 312 times.
✓ Branch 40 taken 156 times.
468 facets(2)%orig_bound(1:2,2,i)
1556 output%adj_ja(1,(i-1)*6 + 5 + idx_shift : (i-1)*6 + 6 + idx_shift) = &
1557
17/32
✗ Branch 0 not taken.
✓ Branch 1 taken 156 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 156 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 156 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 156 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 156 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 156 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 156 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 156 times.
✗ Branch 20 not taken.
✓ Branch 21 taken 156 times.
✗ Branch 23 not taken.
✓ Branch 24 taken 156 times.
✗ Branch 26 not taken.
✓ Branch 27 taken 156 times.
✗ Branch 29 not taken.
✓ Branch 30 taken 156 times.
✗ Branch 32 not taken.
✓ Branch 33 taken 156 times.
✗ Branch 35 not taken.
✓ Branch 36 taken 156 times.
✗ Branch 37 not taken.
✓ Branch 38 taken 156 times.
✓ Branch 39 taken 312 times.
✓ Branch 40 taken 156 times.
468 facets(2)%orig_bound(1:2,3,i)
1558 output%adj_ja(2,(i-1)*6 + 1 + idx_shift : (i-1)*6 + 2 + idx_shift) = &
1559
17/32
✗ Branch 0 not taken.
✓ Branch 1 taken 156 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 156 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 156 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 156 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 156 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 156 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 156 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 156 times.
✗ Branch 20 not taken.
✓ Branch 21 taken 156 times.
✗ Branch 23 not taken.
✓ Branch 24 taken 156 times.
✗ Branch 26 not taken.
✓ Branch 27 taken 156 times.
✗ Branch 29 not taken.
✓ Branch 30 taken 156 times.
✗ Branch 32 not taken.
✓ Branch 33 taken 156 times.
✗ Branch 35 not taken.
✓ Branch 36 taken 156 times.
✗ Branch 37 not taken.
✓ Branch 38 taken 156 times.
✓ Branch 39 taken 312 times.
✓ Branch 40 taken 156 times.
468 facets(2)%dest_bound(1:2,1,i)
1560 output%adj_ja(2,(i-1)*6 + 3 + idx_shift : (i-1)*6 + 4 + idx_shift) = &
1561
17/32
✗ Branch 0 not taken.
✓ Branch 1 taken 156 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 156 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 156 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 156 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 156 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 156 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 156 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 156 times.
✗ Branch 20 not taken.
✓ Branch 21 taken 156 times.
✗ Branch 23 not taken.
✓ Branch 24 taken 156 times.
✗ Branch 26 not taken.
✓ Branch 27 taken 156 times.
✗ Branch 29 not taken.
✓ Branch 30 taken 156 times.
✗ Branch 32 not taken.
✓ Branch 33 taken 156 times.
✗ Branch 35 not taken.
✓ Branch 36 taken 156 times.
✗ Branch 37 not taken.
✓ Branch 38 taken 156 times.
✓ Branch 39 taken 312 times.
✓ Branch 40 taken 156 times.
468 facets(2)%dest_bound(1:2,2,i)
1562 output%adj_ja(2,(i-1)*6 + 5 + idx_shift : (i-1)*6 + 6 + idx_shift) = &
1563
17/32
✗ Branch 0 not taken.
✓ Branch 1 taken 156 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 156 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 156 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 156 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 156 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 156 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 156 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 156 times.
✗ Branch 20 not taken.
✓ Branch 21 taken 156 times.
✗ Branch 23 not taken.
✓ Branch 24 taken 156 times.
✗ Branch 26 not taken.
✓ Branch 27 taken 156 times.
✗ Branch 29 not taken.
✓ Branch 30 taken 156 times.
✗ Branch 32 not taken.
✓ Branch 33 taken 156 times.
✗ Branch 35 not taken.
✓ Branch 36 taken 156 times.
✗ Branch 37 not taken.
✓ Branch 38 taken 156 times.
✓ Branch 39 taken 312 times.
✓ Branch 40 taken 156 times.
481 facets(2)%dest_bound(1:2,3,i)
1564 end do
1565 13 idx_shift = idx_shift + facets(2)%num * 6
1566 ! Corners (3D corners)
1567
2/2
✓ Branch 0 taken 104 times.
✓ Branch 1 taken 13 times.
117 do i = 1, facets(3)%num
1568 output%adj_ja(1,(i-1)*6 + 1 + idx_shift : (i-1)*6 + 2 + idx_shift) = &
1569
17/32
✗ Branch 0 not taken.
✓ Branch 1 taken 104 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 104 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 104 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 104 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 104 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 104 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 104 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 104 times.
✗ Branch 20 not taken.
✓ Branch 21 taken 104 times.
✗ Branch 23 not taken.
✓ Branch 24 taken 104 times.
✗ Branch 26 not taken.
✓ Branch 27 taken 104 times.
✗ Branch 29 not taken.
✓ Branch 30 taken 104 times.
✗ Branch 32 not taken.
✓ Branch 33 taken 104 times.
✗ Branch 35 not taken.
✓ Branch 36 taken 104 times.
✗ Branch 37 not taken.
✓ Branch 38 taken 104 times.
✓ Branch 39 taken 208 times.
✓ Branch 40 taken 104 times.
312 facets(3)%orig_bound(1:2,1,i)
1570 output%adj_ja(1,(i-1)*6 + 3 + idx_shift : (i-1)*6 + 4 + idx_shift) = &
1571
17/32
✗ Branch 0 not taken.
✓ Branch 1 taken 104 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 104 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 104 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 104 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 104 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 104 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 104 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 104 times.
✗ Branch 20 not taken.
✓ Branch 21 taken 104 times.
✗ Branch 23 not taken.
✓ Branch 24 taken 104 times.
✗ Branch 26 not taken.
✓ Branch 27 taken 104 times.
✗ Branch 29 not taken.
✓ Branch 30 taken 104 times.
✗ Branch 32 not taken.
✓ Branch 33 taken 104 times.
✗ Branch 35 not taken.
✓ Branch 36 taken 104 times.
✗ Branch 37 not taken.
✓ Branch 38 taken 104 times.
✓ Branch 39 taken 208 times.
✓ Branch 40 taken 104 times.
312 facets(3)%orig_bound(1:2,2,i)
1572 output%adj_ja(1,(i-1)*6 + 5 + idx_shift : (i-1)*6 + 6 + idx_shift) = &
1573
17/32
✗ Branch 0 not taken.
✓ Branch 1 taken 104 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 104 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 104 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 104 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 104 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 104 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 104 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 104 times.
✗ Branch 20 not taken.
✓ Branch 21 taken 104 times.
✗ Branch 23 not taken.
✓ Branch 24 taken 104 times.
✗ Branch 26 not taken.
✓ Branch 27 taken 104 times.
✗ Branch 29 not taken.
✓ Branch 30 taken 104 times.
✗ Branch 32 not taken.
✓ Branch 33 taken 104 times.
✗ Branch 35 not taken.
✓ Branch 36 taken 104 times.
✗ Branch 37 not taken.
✓ Branch 38 taken 104 times.
✓ Branch 39 taken 208 times.
✓ Branch 40 taken 104 times.
312 facets(3)%orig_bound(1:2,3,i)
1574 output%adj_ja(2,(i-1)*6 + 1 + idx_shift : (i-1)*6 + 2 + idx_shift) = &
1575
17/32
✗ Branch 0 not taken.
✓ Branch 1 taken 104 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 104 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 104 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 104 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 104 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 104 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 104 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 104 times.
✗ Branch 20 not taken.
✓ Branch 21 taken 104 times.
✗ Branch 23 not taken.
✓ Branch 24 taken 104 times.
✗ Branch 26 not taken.
✓ Branch 27 taken 104 times.
✗ Branch 29 not taken.
✓ Branch 30 taken 104 times.
✗ Branch 32 not taken.
✓ Branch 33 taken 104 times.
✗ Branch 35 not taken.
✓ Branch 36 taken 104 times.
✗ Branch 37 not taken.
✓ Branch 38 taken 104 times.
✓ Branch 39 taken 208 times.
✓ Branch 40 taken 104 times.
312 facets(3)%dest_bound(1:2,1,i)
1576 output%adj_ja(2,(i-1)*6 + 3 + idx_shift : (i-1)*6 + 4 + idx_shift) = &
1577
17/32
✗ Branch 0 not taken.
✓ Branch 1 taken 104 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 104 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 104 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 104 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 104 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 104 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 104 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 104 times.
✗ Branch 20 not taken.
✓ Branch 21 taken 104 times.
✗ Branch 23 not taken.
✓ Branch 24 taken 104 times.
✗ Branch 26 not taken.
✓ Branch 27 taken 104 times.
✗ Branch 29 not taken.
✓ Branch 30 taken 104 times.
✗ Branch 32 not taken.
✓ Branch 33 taken 104 times.
✗ Branch 35 not taken.
✓ Branch 36 taken 104 times.
✗ Branch 37 not taken.
✓ Branch 38 taken 104 times.
✓ Branch 39 taken 208 times.
✓ Branch 40 taken 104 times.
312 facets(3)%dest_bound(1:2,2,i)
1578 output%adj_ja(2,(i-1)*6 + 5 + idx_shift : (i-1)*6 + 6 + idx_shift) = &
1579
17/32
✗ Branch 0 not taken.
✓ Branch 1 taken 104 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 104 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 104 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 104 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 104 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 104 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 104 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 104 times.
✗ Branch 20 not taken.
✓ Branch 21 taken 104 times.
✗ Branch 23 not taken.
✓ Branch 24 taken 104 times.
✗ Branch 26 not taken.
✓ Branch 27 taken 104 times.
✗ Branch 29 not taken.
✓ Branch 30 taken 104 times.
✗ Branch 32 not taken.
✓ Branch 33 taken 104 times.
✗ Branch 35 not taken.
✓ Branch 36 taken 104 times.
✗ Branch 37 not taken.
✓ Branch 38 taken 104 times.
✓ Branch 39 taken 208 times.
✓ Branch 40 taken 104 times.
325 facets(3)%dest_bound(1:2,3,i)
1580 end do
1581
1582 ! Initialise with zero
1583
4/4
✓ Branch 0 taken 15 times.
✓ Branch 1 taken 13 times.
✓ Branch 2 taken 3153 times.
✓ Branch 3 taken 15 times.
3181 output%val = 0._real32
1584
1585 ! Copy input into the correct location in output
1586 do concurrent( &
1587 s = 1:output_shape(5), &
1588 m = 1:num_channels, &
1589 k = 1:input_size_d, &
1590 j = 1:input_size_w, &
1591 13 i = 1:input_size_h)
1592 idx_in = i + (j-1) * input_size_h + (k-1) * input_size_h * input_size_w + &
1593 513 (m-1) * input_size_h * input_size_w * input_size_d
1594 idx_out = (i + pad_size(1)) + &
1595 (j + pad_size(2) - 1) * output_size_h + &
1596 (k + pad_size(3) - 1) * output_size_h * output_size_w + &
1597 513 (m-1) * output_size_h * output_size_w * output_size_d
1598
18/26
✓ Branch 0 taken 39 times.
✓ Branch 1 taken 13 times.
✓ Branch 2 taken 153 times.
✓ Branch 3 taken 39 times.
✓ Branch 4 taken 369 times.
✓ Branch 5 taken 153 times.
✓ Branch 6 taken 417 times.
✓ Branch 7 taken 369 times.
✓ Branch 8 taken 513 times.
✓ Branch 9 taken 417 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 513 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 513 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 513 times.
✗ Branch 19 not taken.
✓ Branch 20 taken 513 times.
✗ Branch 22 not taken.
✓ Branch 23 taken 513 times.
✗ Branch 25 not taken.
✓ Branch 26 taken 513 times.
✗ Branch 28 not taken.
✓ Branch 29 taken 513 times.
✗ Branch 31 not taken.
✓ Branch 32 taken 513 times.
1504 output%val(idx_out, s) = input%val(idx_in, s)
1599 end do
1600
1601
6/10
✗ Branch 0 not taken.
✓ Branch 1 taken 13 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 13 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 13 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 13 times.
✓ Branch 12 taken 1 times.
✓ Branch 13 taken 12 times.
13 if(output%indices(1) .ge. 3 .and. output%indices(1) .le. 5)then
1602 1 call fill_corner_region_3d( input, output )
1603 1 call fill_edge_region_3d( input, output )
1604 1 call fill_face_region_3d( input, output )
1605 end if
1606
1607 13 output%get_partial_left => get_partial_pad3d
1608 13 output%get_partial_left_val => get_partial_pad3d_val
1609
2/2
✓ Branch 0 taken 12 times.
✓ Branch 1 taken 1 times.
13 if(input%requires_grad)then
1610 12 output%requires_grad = .true.
1611 12 output%is_forward = input%is_forward
1612 12 output%operation = 'pad'
1613 12 output%left_operand => input
1614 end if
1615
1616 13 end function pad3d
1617 !-------------------------------------------------------------------------------
1618 function get_partial_pad3d(this, upstream_grad) result(output)
1619 !! Get the partial derivative for the pad3d operation
1620 implicit none
1621
1622 ! Arguments
1623 class(array_type), intent(inout) :: this
1624 type(array_type), intent(in) :: upstream_grad
1625 type(array_type) :: output
1626
1627 ! Local variables
1628 integer, dimension(5) :: input_shape
1629
1630 input_shape = [ this%left_operand%shape, size(this%val, dim=2) ]
1631 call output%allocate(array_shape = input_shape)
1632 output%indices = this%indices
1633 output%adj_ja = this%adj_ja
1634
1635 call this%get_partial_left_val(upstream_grad%val, output%val)
1636
1637 end function get_partial_pad3d
1638 !-------------------------------------------------------------------------------
1639
2/4
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 3 times.
✗ Branch 3 not taken.
3 pure subroutine get_partial_pad3d_val(this, upstream_grad, output)
1640 !! Get the partial derivative for the pad3d operation - raw array version
1641 implicit none
1642
1643 ! Arguments
1644 class(array_type), intent(in) :: this
1645 real(real32), dimension(:,:), intent(in) :: upstream_grad
1646 real(real32), dimension(:,:), intent(out) :: output
1647
1648 ! Local variables
1649 integer :: i, j, k, m, s
1650 integer :: idx_in, idx_out
1651 integer :: input_size_h, input_size_w, input_size_d, num_channels
1652 integer :: output_size_h, output_size_w, output_size_d
1653 integer :: num_samples
1654 integer, dimension(5) :: input_shape
1655
1656
14/24
✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 3 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 3 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 3 times.
✓ Branch 12 taken 12 times.
✓ Branch 13 taken 3 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 3 times.
✗ Branch 17 not taken.
✓ Branch 18 taken 3 times.
✗ Branch 20 not taken.
✓ Branch 21 taken 3 times.
✗ Branch 23 not taken.
✓ Branch 24 taken 3 times.
✗ Branch 26 not taken.
✓ Branch 27 taken 3 times.
✗ Branch 29 not taken.
✓ Branch 30 taken 3 times.
✓ Branch 32 taken 15 times.
✓ Branch 33 taken 3 times.
30 input_shape = [ this%left_operand%shape, size(upstream_grad, dim=2) ]
1657 3 num_samples = input_shape(5)
1658 3 input_size_h = input_shape(1)
1659 3 input_size_w = input_shape(2)
1660 3 input_size_d = input_shape(3)
1661 3 num_channels = input_shape(4)
1662
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 3 times.
3 output_size_h = input_size_h + 2 * this%indices(2)
1663
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 3 times.
3 output_size_w = input_size_w + 2 * this%indices(3)
1664
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 3 times.
3 output_size_d = input_size_d + 2 * this%indices(4)
1665
1666
10/16
✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 3 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 3 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 3 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 3 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 3 times.
✓ Branch 18 taken 4 times.
✓ Branch 19 taken 3 times.
✓ Branch 20 taken 224 times.
✓ Branch 21 taken 4 times.
231 output = 0._real32
1667
1668 ! Main gradient extraction
1669 do concurrent( &
1670 s = 1:num_samples, &
1671 m = 1:num_channels, &
1672 k = 1:input_size_d, &
1673 j = 1:input_size_w, &
1674 3 i = 1:input_size_h)
1675 idx_in = i + (j-1) * input_size_h + &
1676 (k-1) * input_size_h * input_size_w + &
1677 224 (m-1) * input_size_h * input_size_w * input_size_d
1678 448 idx_out = (i + this%indices(2)) + &
1679 448 (j + this%indices(3) - 1) * output_size_h + &
1680 448 (k + this%indices(4) - 1) * output_size_h * output_size_w + &
1681
6/12
✗ Branch 0 not taken.
✓ Branch 1 taken 224 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 224 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 224 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 224 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 224 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 224 times.
224 (m-1) * output_size_h * output_size_w * output_size_d
1682
18/26
✓ Branch 0 taken 11 times.
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 44 times.
✓ Branch 3 taken 11 times.
✓ Branch 4 taken 152 times.
✓ Branch 5 taken 44 times.
✓ Branch 6 taken 176 times.
✓ Branch 7 taken 152 times.
✓ Branch 8 taken 224 times.
✓ Branch 9 taken 176 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 224 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 224 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 224 times.
✗ Branch 19 not taken.
✓ Branch 20 taken 224 times.
✗ Branch 22 not taken.
✓ Branch 23 taken 224 times.
✗ Branch 25 not taken.
✓ Branch 26 taken 224 times.
✗ Branch 28 not taken.
✓ Branch 29 taken 224 times.
✗ Branch 31 not taken.
✓ Branch 32 taken 224 times.
610 output(idx_in, s) = upstream_grad(idx_out, s)
1683 end do
1684
1685 ! Handle corner, edge, and face gradients for special padding modes
1686
6/10
✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 3 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 3 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 3 times.
✓ Branch 12 taken 1 times.
✓ Branch 13 taken 2 times.
3 if(this%indices(1) .ge. 3 .and. this%indices(1) .le. 5)then
1687 call accumulate_corner_gradients_3d_val( &
1688 upstream_grad, output, input_shape, this%indices, this%adj_ja &
1689
12/24
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 1 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 1 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 1 times.
✗ Branch 20 not taken.
✓ Branch 21 taken 1 times.
✗ Branch 22 not taken.
✓ Branch 23 taken 1 times.
1 )
1690 call accumulate_edge_gradients_3d_val( &
1691 upstream_grad, output, input_shape, this%indices, this%adj_ja &
1692
12/24
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 1 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 1 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 1 times.
✗ Branch 20 not taken.
✓ Branch 21 taken 1 times.
✗ Branch 22 not taken.
✓ Branch 23 taken 1 times.
1 )
1693 call accumulate_face_gradients_3d_val( &
1694 upstream_grad, output, input_shape, this%indices, this%adj_ja &
1695
12/24
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 1 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 1 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 1 times.
✗ Branch 20 not taken.
✓ Branch 21 taken 1 times.
✗ Branch 22 not taken.
✓ Branch 23 taken 1 times.
1 )
1696 end if
1697
1698 3 end subroutine get_partial_pad3d_val
1699 !###############################################################################
1700
1701 end submodule athena__diffstruc_extd_submodule_pad
1702