1/* Copyright (C) 2021-2023 Free Software Foundation, Inc. 2 Contributed by Oracle. 3 4 This file is part of GNU Binutils. 5 6 This program is free software; you can redistribute it and/or modify 7 it under the terms of the GNU General Public License as published by 8 the Free Software Foundation; either version 3, or (at your option) 9 any later version. 10 11 This program is distributed in the hope that it will be useful, 12 but WITHOUT ANY WARRANTY; without even the implied warranty of 13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 GNU General Public License for more details. 15 16 You should have received a copy of the GNU General Public License 17 along with this program; if not, write to the Free Software 18 Foundation, 51 Franklin Street - Fifth Floor, Boston, 19 MA 02110-1301, USA. */ 20 21#include "mydefs.h" 22 23/* 24* ----------------------------------------------------------------------------- 25* Driver for the core computational part. 26* ----------------------------------------------------------------------------- 27*/ 28void *driver_mxv (void *thread_arguments) 29{ 30 thread_data *local_data; 31 32 local_data = (thread_data *) thread_arguments; 33 34 bool do_work = local_data->do_work; 35 int64_t repeat_count = local_data->repeat_count; 36 int64_t row_index_start = local_data->row_index_start; 37 int64_t row_index_end = local_data->row_index_end; 38 int64_t m = local_data->m; 39 int64_t n = local_data->n; 40 double *b = local_data->b; 41 double *c = local_data->c; 42 double **A = local_data->A; 43 44 if (do_work) 45 { 46 for (int64_t r=0; r<repeat_count; r++) 47 { 48 (void) mxv_core (row_index_start, row_index_end, m, n, A, b, c); 49 } 50 } 51 52 return (0); 53} 54 55/* 56* ----------------------------------------------------------------------------- 57* Computational heart of the algorithm. 58* 59* Disable inlining to avoid the repeat count loop is removed by the compiler. 60* This is only done to make for a more interesting call tree. 61* ----------------------------------------------------------------------------- 62*/ 63void __attribute__ ((noinline)) mxv_core (int64_t row_index_start, 64 int64_t row_index_end, 65 int64_t m, 66 int64_t n, 67 double **restrict A, 68 double *restrict b, 69 double *restrict c) 70{ 71 for (int64_t i=row_index_start; i<=row_index_end; i++) 72 { 73 double row_sum = 0.0; 74 for (int64_t j=0; j<n; j++) 75 row_sum += A[i][j] * b[j]; 76 c[i] = row_sum; 77 } 78} 79