xref: /netbsd-src/external/gpl3/binutils/dist/gprofng/examples/mxv-pthreads/src/manage_data.c (revision cb63e24e8d6aae7ddac1859a9015f48b1d8bd90e)
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 bool verbose;
24 
25 /*
26 * -----------------------------------------------------------------------------
27 * This function allocates the data and sets up the data structures to be used
28 * in the remainder.
29 * -----------------------------------------------------------------------------
30 */
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)31 void allocate_data (int active_threads,
32 		    int64_t number_of_rows,
33 		    int64_t number_of_columns,
34 		    double ***A,
35 		    double **b,
36 		    double **c,
37 		    double **ref,
38 		    thread_data **thread_data_arguments,
39 		    pthread_t **pthread_ids)
40 {
41   if ((*b = (double *) malloc (number_of_columns * sizeof (double))) == NULL)
42     {
43       printf ("Error: allocation of vector b failed\n");
44       perror ("vector b");
45       exit (-1);
46     }
47   else
48     {
49       if (verbose) printf ("Vector b allocated\n");
50     }
51 
52   if ((*c = (double *) malloc (number_of_rows * sizeof (double))) == NULL)
53     {
54       printf ("Error: allocation of vector c failed\n");
55       perror ("vector c");
56       exit (-1);
57     }
58   else
59     {
60       if (verbose) printf ("Vector c allocated\n");
61     }
62 
63   if ((*ref = (double *) malloc (number_of_rows * sizeof (double))) == NULL)
64     {
65       printf ("Error: allocation of vector ref failed\n");
66       perror ("vector ref");
67       exit (-1);
68     }
69 
70   if ((*A = (double **) malloc (number_of_rows * sizeof (double))) == NULL)
71     {
72       printf ("Error: allocation of matrix A failed\n");
73       perror ("matrix A");
74       exit (-1);
75     }
76   else
77     {
78       for (int64_t i=0; i<number_of_rows; i++)
79 	{
80 	  if (((*A)[i] = (double *) malloc (number_of_columns
81 					* sizeof (double))) == NULL)
82 	    {
83 	      printf ("Error: allocation of matrix A columns failed\n");
84 	      perror ("matrix A[i]");
85 	      exit (-1);
86 	    }
87 	}
88       if (verbose) printf ("Matrix A allocated\n");
89     }
90 
91 
92   if ((*thread_data_arguments = (thread_data *) malloc ((active_threads)
93 				* sizeof (thread_data))) == NULL)
94     {
95       perror ("malloc thread_data_arguments");
96       exit (-1);
97     }
98   else
99     {
100       if (verbose) printf ("Structure thread_data_arguments allocated\n");
101     }
102 
103   if ((*pthread_ids = (pthread_t *) malloc ((active_threads)
104 				* sizeof (pthread_t))) == NULL)
105     {
106       perror ("malloc pthread_ids");
107       exit (-1);
108     }
109   else
110     {
111       if (verbose) printf ("Structure pthread_ids allocated\n");
112     }
113 }
114 
115 /*
116 * -----------------------------------------------------------------------------
117 * This function initializes the data.
118 * -----------------------------------------------------------------------------
119 */
init_data(int64_t m,int64_t n,double ** restrict A,double * restrict b,double * restrict c,double * restrict ref)120 void init_data (int64_t m,
121 		int64_t n,
122 		double **restrict A,
123 		double *restrict b,
124 		double *restrict c,
125 		double *restrict ref)
126 {
127 
128   (void) srand48 (2020L);
129 
130   for (int64_t j=0; j<n; j++)
131     b[j] = 1.0;
132 
133   for (int64_t i=0; i<m; i++)
134     {
135       ref[i] = n*i;
136       c[i]   = -2022;
137       for (int64_t j=0; j<n; j++)
138 	A[i][j] = drand48 ();
139     }
140 
141   for (int64_t i=0; i<m; i++)
142     {
143       double row_sum = 0.0;
144       for (int64_t j=0; j<n; j++)
145 	row_sum += A[i][j];
146       ref[i] = row_sum;
147     }
148 }
149