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 #ifndef ALREADY_INCLUDED 22 #define ALREADY_INCLUDED 23 24 #include <stdlib.h> 25 #include <stdio.h> 26 #include <stdint.h> 27 #include <stdbool.h> 28 #include <string.h> 29 #include <unistd.h> 30 #include <float.h> 31 #include <math.h> 32 #include <malloc.h> 33 #include <pthread.h> 34 35 struct thread_arguments_data { 36 int thread_id; 37 bool verbose; 38 bool do_work; 39 int64_t repeat_count; 40 int64_t row_index_start; 41 int64_t row_index_end; 42 int64_t m; 43 int64_t n; 44 double *b; 45 double *c; 46 double **A; 47 }; 48 49 typedef struct thread_arguments_data thread_data; 50 51 void *driver_mxv (void *thread_arguments); 52 53 void __attribute__ ((noinline)) mxv_core (int64_t row_index_start, 54 int64_t row_index_end, 55 int64_t m, 56 int64_t n, 57 double **restrict A, 58 double *restrict b, 59 double *restrict c); 60 61 int get_user_options (int argc, 62 char *argv[], 63 int64_t *number_of_rows, 64 int64_t *number_of_columns, 65 int64_t *repeat_count, 66 int64_t *number_of_threads, 67 bool *verbose); 68 69 void init_data (int64_t m, 70 int64_t n, 71 double **restrict A, 72 double *restrict b, 73 double *restrict c, 74 double *restrict ref); 75 76 void allocate_data (int active_threads, 77 int64_t number_of_rows, 78 int64_t number_of_columns, 79 double ***A, 80 double **b, 81 double **c, 82 double **ref, 83 thread_data **thread_data_arguments, 84 pthread_t **pthread_ids); 85 86 int64_t check_results (int64_t m, 87 int64_t n, 88 double *c, 89 double *ref); 90 91 void get_workload_stats (int64_t number_of_threads, 92 int64_t number_of_rows, 93 int64_t number_of_columns, 94 int64_t *rows_per_thread, 95 int64_t *remainder_rows, 96 int64_t *active_threads); 97 98 void determine_work_per_thread (int64_t TID, 99 int64_t rows_per_thread, 100 int64_t remainder_rows, 101 int64_t *row_index_start, 102 int64_t *row_index_end); 103 104 void mxv (int64_t m, 105 int64_t n, 106 double **restrict A, 107 double *restrict b, 108 double *restrict c); 109 110 void print_all_results (int64_t number_of_rows, 111 int64_t number_of_columns, 112 int64_t number_of_threads, 113 int64_t errors); 114 115 extern bool verbose; 116 117 #endif 118