aboutsummaryrefslogtreecommitdiff
path: root/gprofng/examples/mxv-pthreads/src/mydefs.h
blob: 63b9dc40969e9264062cd6cd67029826643ee411 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
/* 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.  */

#ifndef ALREADY_INCLUDED
#define ALREADY_INCLUDED

#include <stdlib.h>
#include <stdio.h>
#include <stdint.h>
#include <stdbool.h>
#include <string.h>
#include <unistd.h>
#include <float.h>
#include <math.h>
#include <malloc.h>
#include <pthread.h>

struct thread_arguments_data {
	int     thread_id;
	bool    verbose;
	bool    do_work;
	int64_t repeat_count;
	int64_t row_index_start;
	int64_t row_index_end;
	int64_t m;
	int64_t n;
	double  *b;
	double  *c;
	double  **A;
};

typedef struct thread_arguments_data thread_data;

void *driver_mxv (void *thread_arguments);

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);

int get_user_options (int     argc,
		      char    *argv[],
		      int64_t *number_of_rows,
		      int64_t *number_of_columns,
		      int64_t *repeat_count,
		      int64_t *number_of_threads);

void init_data (int64_t m,
		int64_t n,
		double  **restrict A,
		double  *restrict b,
		double  *restrict c,
		double  *restrict ref);

void  allocate_data (int	 active_threads,
		     int64_t     number_of_rows,
		     int64_t     number_of_columns,
		     double      ***A,
		     double      **b,
		     double      **c,
		     double      **ref,
		     thread_data **thread_data_arguments,
		     pthread_t   **pthread_ids);

int64_t check_results (int64_t m,
		       int64_t n,
		       double *c,
		       double *ref);

void get_workload_stats (int64_t number_of_threads,
			 int64_t number_of_rows,
			 int64_t number_of_columns,
			 int64_t *rows_per_thread,
			 int64_t *remainder_rows,
			 int64_t *active_threads);

void determine_work_per_thread (int64_t TID,
				int64_t rows_per_thread,
				int64_t remainder_rows,
				int64_t *row_index_start,
				int64_t *row_index_end);

void mxv (int64_t m,
	  int64_t n,
	  double **restrict A,
	  double *restrict b,
	  double *restrict c);

void print_all_results (int64_t number_of_rows,
			int64_t number_of_columns,
			int64_t number_of_threads,
			int64_t errors);

extern bool verbose;

#endif