Skip to content

Commit 29e0eda

Browse files
committed
refactor: update index increment to stride addition
--- type: pre_commit_static_analysis_report description: Results of running static analysis checks when committing changes. report: - task: lint_filenames status: passed - task: lint_editorconfig status: passed - task: lint_markdown status: na - task: lint_package_json status: na - task: lint_repl_help status: na - task: lint_javascript_src status: passed - task: lint_javascript_cli status: na - task: lint_javascript_examples status: na - task: lint_javascript_tests status: na - task: lint_javascript_benchmarks status: na - task: lint_python status: na - task: lint_r status: na - task: lint_c_src status: na - task: lint_c_examples status: na - task: lint_c_benchmarks status: na - task: lint_c_tests_fixtures status: na - task: lint_shell status: na - task: lint_typescript_declarations status: passed - task: lint_typescript_tests status: na - task: lint_license_headers status: passed ---
1 parent 264ecd4 commit 29e0eda

1 file changed

Lines changed: 38 additions & 25 deletions

File tree

  • lib/node_modules/@stdlib/blas/base/cgemv/lib

lib/node_modules/@stdlib/blas/base/cgemv/lib/base.js

Lines changed: 38 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -106,9 +106,8 @@ function cgemv( trans, M, N, alpha, A, strideA1, strideA2, offsetA, x, strideX,
106106
var xlen;
107107
var ylen;
108108
var sign;
109-
var sa0;
110-
var sa1;
111-
var oa2;
109+
var da0;
110+
var da1;
112111
var rea;
113112
var ima;
114113
var rex;
@@ -166,16 +165,6 @@ function cgemv( trans, M, N, alpha, A, strideA1, strideA2, offsetA, x, strideX,
166165
sign = 1;
167166
}
168167

169-
if ( isrm ) {
170-
// For row-major matrices, the last dimension has the fastest changing index...
171-
sa0 = strideA2 * 2; // offset increment for innermost loop
172-
sa1 = strideA1 * 2; // offset increment for outermost loop
173-
} else { // isColMajor
174-
// For column-major matrices, the first dimension has the fastest changing index...
175-
sa0 = strideA1 * 2; // offset increment for innermost loop
176-
sa1 = strideA2 * 2; // offset increment for outermost loop
177-
}
178-
179168
// Vector indexing base
180169
oa = offsetA * 2;
181170
ox = offsetX * 2;
@@ -190,42 +179,66 @@ function cgemv( trans, M, N, alpha, A, strideA1, strideA2, offsetA, x, strideX,
190179
( !isrm && !isTransposed( trans ) ) ||
191180
( isrm && isTransposed( trans ) )
192181
) {
182+
if ( isrm ) {
183+
da0 = strideA2 * 2;
184+
da1 = ( strideA1 * 2 ) - ( ylen * strideA2 * 2 );
185+
} else {
186+
da0 = strideA1 * 2;
187+
da1 = ( strideA2 * 2 ) - ( ylen * strideA1 * 2 );
188+
}
189+
ia = oa;
190+
ix = ox;
193191
for ( i1 = 0; i1 < xlen; i1++ ) {
194-
ix = ox + ( i1 * sx );
195-
oa2 = oa + ( i1 * sa1 );
196192
rex = viewX[ ix ];
197193
imx = viewX[ ix + 1 ];
198194
retmp = f32( ( realpha * rex ) - ( imalpha * imx ) );
199195
imtmp = f32( ( realpha * imx ) + ( imalpha * rex ) );
200-
for ( i0 = 0; i0 < ylen; i0++ ) {
201-
ia = oa2 + ( i0 * sa0 );
202-
rea = viewA[ ia ];
203-
ima = sign * viewA[ ia + 1 ];
204-
iy = oy + ( i0 * sy );
205-
muladd( rea, ima, retmp, imtmp, viewY[ iy ], viewY[ iy + 1 ], viewY, 1, iy ); // eslint-disable-line max-len
196+
if ( retmp === 0.0 && imtmp === 0.0 ) {
197+
ia += da0 * ylen;
198+
} else {
199+
iy = oy;
200+
for ( i0 = 0; i0 < ylen; i0++ ) {
201+
rea = viewA[ ia ];
202+
ima = sign * viewA[ ia + 1 ];
203+
muladd( rea, ima, retmp, imtmp, viewY[ iy ], viewY[ iy + 1 ], viewY, 1, iy ); // eslint-disable-line max-len
204+
iy += sy;
205+
ia += da0;
206+
}
206207
}
208+
ix += sx;
209+
ia += da1;
207210
}
208211
return y;
209212
}
210213

211214
// Form: y = α*A^T*x + y
212215
// ( !isrm && isTransposed( trans ) ) || ( isrm && !isTransposed( trans ) )
216+
if ( isrm ) {
217+
da0 = strideA2 * 2;
218+
da1 = ( strideA1 * 2 ) - ( xlen * strideA2 * 2 );
219+
} else {
220+
da0 = strideA1 * 2;
221+
da1 = ( strideA2 * 2 ) - ( xlen * strideA1 * 2 );
222+
}
223+
ia = oa;
224+
iy = oy;
213225
for ( i1 = 0; i1 < ylen; i1++ ) {
214-
oa2 = oa + ( i1 * sa1 );
215226
retmp = 0.0;
216227
imtmp = 0.0;
228+
ix = ox;
217229
for ( i0 = 0; i0 < xlen; i0++ ) {
218-
ia = oa2 + ( i0 * sa0 );
219-
ix = ox + ( i0 * sx );
220230
rea = viewA[ ia ];
221231
ima = sign * viewA[ ia + 1 ];
222232
rex = viewX[ ix ];
223233
imx = viewX[ ix + 1 ];
224234
retmp = f32( retmp + f32( ( rea * rex ) - ( ima * imx ) ) );
225235
imtmp = f32( imtmp + f32( ( rea * imx ) + ( ima * rex ) ) );
236+
ix += sx;
237+
ia += da0;
226238
}
227-
iy = oy + ( i1 * sy );
228239
muladd( realpha, imalpha, retmp, imtmp, viewY[ iy ], viewY[ iy + 1 ], viewY, 1, iy ); // eslint-disable-line max-len
240+
iy += sy;
241+
ia += da1;
229242
}
230243
return y;
231244
}

0 commit comments

Comments
 (0)