@@ -16,6 +16,7 @@ submodule(stdlib_intrinsics) stdlib_intrinsics_sum
16
16
17
17
contains
18
18
19
+ !================= 1D Base implementations ============
19
20
#:for rk, rt, rs in RC_KINDS_TYPES
20
21
pure module function fsum_1d_${rs}$(a) result(s)
21
22
${rt}$, intent(in) :: a(:)
@@ -60,6 +61,54 @@ pure module function fsum_1d_${rs}$_mask(a,mask) result(s)
60
61
end do
61
62
end function
62
63
64
+ pure module function fsum_kahan_1d_${rs}$(a) result(s)
65
+ ${rt}$, intent(in) :: a(:)
66
+ ${rt}$ :: s
67
+ ${rt}$ :: sbatch(chunk)
68
+ ${rt}$ :: cbatch(chunk)
69
+ integer :: i, dr, rr
70
+ ! -----------------------------
71
+ dr = size(a)/(chunk)
72
+ rr = size(a) - dr*chunk
73
+ sbatch = zero_${rs}$
74
+ cbatch = zero_${rs}$
75
+ do i = 1, dr
76
+ call kahan_kernel( a(chunk*i-chunk+1:chunk*i) , sbatch(1:chunk) , cbatch(1:chunk) )
77
+ end do
78
+ call kahan_kernel( a(size(a)-rr+1:size(a)) , sbatch(1:rr) , cbatch(1:rr) )
79
+
80
+ s = zero_${rs}$
81
+ do i = 1,chunk
82
+ call kahan_kernel( sbatch(i) , s , cbatch(i) )
83
+ end do
84
+ end function
85
+
86
+ pure module function fsum_kahan_1d_${rs}$_mask(a,mask) result(s)
87
+ ${rt}$, intent(in) :: a(:)
88
+ logical, intent(in) :: mask(:)
89
+ ${rt}$ :: s
90
+ ${rt}$ :: sbatch(chunk)
91
+ ${rt}$ :: cbatch(chunk)
92
+ integer :: i, dr, rr
93
+ ! -----------------------------
94
+ dr = size(a)/(chunk)
95
+ rr = size(a) - dr*chunk
96
+ sbatch = zero_${rs}$
97
+ cbatch = zero_${rs}$
98
+ do i = 1, dr
99
+ call kahan_kernel( a(chunk*i-chunk+1:chunk*i) , sbatch(1:chunk) , cbatch(1:chunk) , mask(chunk*i-chunk+1:chunk*i) )
100
+ end do
101
+ call kahan_kernel( a(size(a)-rr+1:size(a)) , sbatch(1:rr) , cbatch(1:rr) , mask(size(a)-rr+1:size(a)) )
102
+
103
+ s = zero_${rs}$
104
+ do i = 1,chunk
105
+ call kahan_kernel( sbatch(i) , s , cbatch(i) )
106
+ end do
107
+ end function
108
+ #:endfor
109
+
110
+ !================= N-D implementations ============
111
+ #:for rk, rt, rs in RC_KINDS_TYPES
63
112
#:for rank in RANKS
64
113
pure module function fsum_${rank}$d_${rs}$( x , mask ) result( s )
65
114
${rt}$, intent(in) :: x${ranksuffix(rank)}$
@@ -133,51 +182,4 @@ end function
133
182
#:endfor
134
183
#:endfor
135
184
136
- #:for rk, rt, rs in RC_KINDS_TYPES
137
- pure module function fsum_kahan_1d_${rs}$(a) result(s)
138
- ${rt}$, intent(in) :: a(:)
139
- ${rt}$ :: s
140
- ${rt}$ :: sbatch(chunk)
141
- ${rt}$ :: cbatch(chunk)
142
- integer :: i, dr, rr
143
- ! -----------------------------
144
- dr = size(a)/(chunk)
145
- rr = size(a) - dr*chunk
146
- sbatch = zero_${rs}$
147
- cbatch = zero_${rs}$
148
- do i = 1, dr
149
- call kahan_kernel( a(chunk*i-chunk+1:chunk*i) , sbatch(1:chunk) , cbatch(1:chunk) )
150
- end do
151
- call kahan_kernel( a(size(a)-rr+1:size(a)) , sbatch(1:rr) , cbatch(1:rr) )
152
-
153
- s = zero_${rs}$
154
- do i = 1,chunk
155
- call kahan_kernel( sbatch(i) , s , cbatch(i) )
156
- end do
157
- end function
158
-
159
- pure module function fsum_kahan_1d_${rs}$_mask(a,mask) result(s)
160
- ${rt}$, intent(in) :: a(:)
161
- logical, intent(in) :: mask(:)
162
- ${rt}$ :: s
163
- ${rt}$ :: sbatch(chunk)
164
- ${rt}$ :: cbatch(chunk)
165
- integer :: i, dr, rr
166
- ! -----------------------------
167
- dr = size(a)/(chunk)
168
- rr = size(a) - dr*chunk
169
- sbatch = zero_${rs}$
170
- cbatch = zero_${rs}$
171
- do i = 1, dr
172
- call kahan_kernel( a(chunk*i-chunk+1:chunk*i) , sbatch(1:chunk) , cbatch(1:chunk) , mask(chunk*i-chunk+1:chunk*i) )
173
- end do
174
- call kahan_kernel( a(size(a)-rr+1:size(a)) , sbatch(1:rr) , cbatch(1:rr) , mask(size(a)-rr+1:size(a)) )
175
-
176
- s = zero_${rs}$
177
- do i = 1,chunk
178
- call kahan_kernel( sbatch(i) , s , cbatch(i) )
179
- end do
180
- end function
181
- #:endfor
182
-
183
185
end submodule stdlib_intrinsics_sum
0 commit comments