| /* Copyright (C) 2021-2025 Free Software Foundation, Inc. | |
| Contributed by Oracle. | |
| This file is part of GNU Binutils. | |
| This program is free software; you can redistribute it and/or modify | |
| it under the terms of the GNU General Public License as published by | |
| the Free Software Foundation; either version 3, or (at your option) | |
| any later version. | |
| This program is distributed in the hope that it will be useful, | |
| but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
| GNU General Public License for more details. | |
| You should have received a copy of the GNU General Public License | |
| along with this program; if not, write to the Free Software | |
| Foundation, 51 Franklin Street - Fifth Floor, Boston, | |
| MA 02110-1301, USA. */ | |
| #include "mydefs.h" | |
| /* | |
| * ----------------------------------------------------------------------------- | |
| * Driver for the core computational part. | |
| * ----------------------------------------------------------------------------- | |
| */ | |
| void *driver_mxv (void *thread_arguments) | |
| { | |
| thread_data *local_data; | |
| local_data = (thread_data *) thread_arguments; | |
| bool do_work = local_data->do_work; | |
| int64_t repeat_count = local_data->repeat_count; | |
| int64_t row_index_start = local_data->row_index_start; | |
| int64_t row_index_end = local_data->row_index_end; | |
| int64_t m = local_data->m; | |
| int64_t n = local_data->n; | |
| double *b = local_data->b; | |
| double *c = local_data->c; | |
| double **A = local_data->A; | |
| if (do_work) | |
| { | |
| for (int64_t r=0; r<repeat_count; r++) | |
| { | |
| (void) mxv_core (row_index_start, row_index_end, m, n, A, b, c); | |
| } | |
| } | |
| return (0); | |
| } | |
| /* | |
| * ----------------------------------------------------------------------------- | |
| * Computational heart of the algorithm. | |
| * | |
| * Disable inlining to avoid the repeat count loop is removed by the compiler. | |
| * This is only done to make for a more interesting call tree. | |
| * ----------------------------------------------------------------------------- | |
| */ | |
| void __attribute__ ((noinline)) mxv_core (int64_t row_index_start, | |
| int64_t row_index_end, | |
| int64_t m, | |
| int64_t n, | |
| double **restrict A, | |
| double *restrict b, | |
| double *restrict c) | |
| { | |
| for (int64_t i=row_index_start; i<=row_index_end; i++) | |
| { | |
| double row_sum = 0.0; | |
| for (int64_t j=0; j<n; j++) | |
| row_sum += A[i][j] * b[j]; | |
| c[i] = row_sum; | |
| } | |
| } |