The VisAO Camera
svbksb.cpp
1 #include "svbksb.h"
2 #include <pthread.h>
3 
4 void preconditionU(double **u, double *w, int m, int n)
5 {
6  for(int j =0; j<n; j++)
7  {
8  for(int i=0;i<m;i++)
9  {
10  if(w[j]) u[i][j]/= w[j];
11  else u[i][j] = 0;
12  }
13  }
14 
15 }
16 
17 void preconditionU_F(float **u, float *w, int m, int n)
18 {
19  for(int j =0; j<n; j++)
20  {
21  for(int i=0;i<m;i++)
22  {
23  if(w[j]) u[i][j]/= w[j];
24  else u[i][j] = 0;
25  }
26  }
27 
28 }
29 
30 void backsub_precond(double **u, double **v, int m, int n, double *b, double *x, double *tmp)
31 {
32  int jj,j,i;
33 
34  double *vrow, *urow, _b;
35 
36  urow = u[0];
37  _b = b[0];
38 
39  for(j=0;j<n; j++)
40  {
41  tmp[j] = urow[j]*_b;
42  }
43 
44  for(i=1;i<m; i++)
45  {
46  urow = u[i];
47  _b = b[i];
48 
49  for(j=0;j<n; j++)
50  {
51  tmp[j] += urow[j]*_b;
52  }
53  }
54 
55  vrow = v[0];
56  for (j=0;j<n;j++)
57  {
58  x[j] = vrow[0]*tmp[0];
59  }
60 
61  for (j=0;j<n;j++)
62  {
63  vrow = v[j];
64  for (jj=1;jj<n;jj++) x[j] += vrow[jj]*tmp[jj];
65  }
66 }
67 
68 void backsub_precond_F(float **u, float **v, int m, int n, float *b, float *x, float *tmp)
69 {
70  int jj,j,i;
71 
72  float *vrow, *urow, _b;
73 
74  urow = u[0];
75  _b = b[0];
76 
77  for(j=0;j<n; j++)
78  {
79  tmp[j] = urow[j]*_b;
80  }
81 
82  for(i=1;i<m; i++)
83  {
84  urow = u[i];
85  _b = b[i];
86 
87  for(j=0;j<n; j++)
88  {
89  tmp[j] += urow[j]*_b;
90  }
91  }
92 
93 /* for(j=0;j<n;j++)
94  {
95  for(i=1;i<m;i++)
96  {
97  tmp[j] += u[i][j]*b[i];
98  }
99  }*/
100 
101  vrow = v[0];
102  for (j=0;j<n;j++)
103  {
104  x[j] = vrow[0]*tmp[0];
105  }
106 
107  for (j=0;j<n;j++)
108  {
109  vrow = v[j];
110  for (jj=1;jj<n;jj++) x[j] += vrow[jj]*tmp[jj];
111  }
112 }
113 
115 {
116  float **u;
117  float **v;
118  int m;
119  int n;
120  float *b;
121  float *x;
122  float *tmp;
123  int jmin;
124  int jmax;
125  int done;
126 };
127 
128 void * threadsub(void * ptr)
129 {
130  int i, j;
131  thread_arg * ta = (thread_arg *) ptr;
132 
133  float *urow, _b;
134 
135  for(i=1;i<ta->m; i++)
136  {
137  urow = ta->u[i];
138  _b = ta->b[i];
139 
140  for(j=ta->jmin;j<ta->jmax; j++)
141  {
142  ta->tmp[j] += urow[j]*_b;
143  }
144  }
145 
146  ta->done = 1;
147  return 0;
148 }
149 
150 void backsub_precond_F_threads(float **u, float **v, int m, int n, float *b, float *x, float *tmp, int nthreads)
151 {
152  struct sched_param schedpar;
153  schedpar.sched_priority = 99;
154 
155  pthread_t th;
156  pthread_attr_t attr;
157  pthread_attr_init(&attr);
158 
159  pthread_attr_setinheritsched(&attr, PTHREAD_EXPLICIT_SCHED);
160  pthread_attr_setschedpolicy(&attr, SCHED_OTHER);
161  pthread_attr_setschedparam(&attr, &schedpar);
162 
163  int jj,j,i;
164 
165  float *vrow, *urow, _b;
166 
167  urow = u[0];
168  _b = b[0];
169 
170  for(j=0;j<n; j++)
171  {
172  tmp[j] = urow[j]*_b;
173  }
174 
175  pthread_t th1;
176  pthread_t th2;
177  pthread_t th3;
178  pthread_t th4;
179 
180  thread_arg ta, ta2, ta3, ta4;
181  ta.u = u;
182  ta.v = v;
183  ta.m = m;
184  ta.n = n;
185  ta.b = b;
186  ta.x = x;
187  ta.tmp = tmp;
188  ta.jmin = 0;
189  ta.jmax = n/nthreads;
190  ta.done = 0;
191  //call thread1
192  pthread_create(&th1, 0, &threadsub, (void *) &ta);
193 
194  ta4 = ta;
195  ta4.jmin = ta.jmax;
196  ta4.jmax = n;
197 
198  if(nthreads == 3)
199  {
200  ta2 = ta;
201  ta2.jmin = ta.jmax;
202  ta2.jmax = 2.*ta.jmax;
203  pthread_create(&th2, 0, &threadsub, (void *) &ta2);
204  ta4.jmin = ta2.jmax;
205  }
206 
207  threadsub(&ta4);
208 
209  //pthread_join(th1, 0);
210  if(nthreads == 2)
211  {
212  pthread_join(th1, 0);
213  }
214  else
215  {
216  if(!ta.done) pthread_join(th1, 0);
217  if(!ta2.done) pthread_join(th2, 0);
218  }
219 
220  vrow = v[0];
221  for (j=0;j<n;j++)
222  {
223  x[j] = vrow[0]*tmp[0];
224  }
225 
226  for (j=0;j<n;j++)
227  {
228  vrow = v[j];
229  for (jj=1;jj<n;jj++) x[j] += vrow[jj]*tmp[jj];
230  }
231 }