ViennaCL - The Vienna Computing Library  1.6.1
Free open-source GPU-accelerated linear algebra and solver library.
blas3_solve.cpp
Go to the documentation of this file.
1 /* =========================================================================
2  Copyright (c) 2010-2014, Institute for Microelectronics,
3  Institute for Analysis and Scientific Computing,
4  TU Wien.
5  Portions of this software are copyright by UChicago Argonne, LLC.
6 
7  -----------------
8  ViennaCL - The Vienna Computing Library
9  -----------------
10 
11  Project Head: Karl Rupp rupp@iue.tuwien.ac.at
12 
13  (A list of authors and contributors can be found in the PDF manual)
14 
15  License: MIT (X11), see file LICENSE in the base directory
16 ============================================================================= */
17 
18 
23 //#define NDEBUG
24 //#define VIENNACL_DEBUG_BUILD
25 
26 //
27 // *** System
28 //
29 #include <iostream>
30 
31 // We don't need debug mode in UBLAS:
32 #ifndef NDEBUG
33  #define BOOST_UBLAS_NDEBUG
34 #endif
35 
36 //
37 // *** Boost
38 //
39 #include <boost/numeric/ublas/io.hpp>
40 #include <boost/numeric/ublas/triangular.hpp>
41 #include <boost/numeric/ublas/matrix_sparse.hpp>
42 #include <boost/numeric/ublas/matrix.hpp>
43 #include <boost/numeric/ublas/matrix_proxy.hpp>
44 #include <boost/numeric/ublas/lu.hpp>
45 #include <boost/numeric/ublas/io.hpp>
46 
47 //
48 // *** ViennaCL
49 //
50 //#define VIENNACL_DEBUG_ALL
51 //#define VIENNACL_DEBUG_BUILD
52 #define VIENNACL_WITH_UBLAS 1
53 #include "viennacl/scalar.hpp"
54 #include "viennacl/matrix.hpp"
56 #include "viennacl/vector.hpp"
57 #include "viennacl/linalg/prod.hpp"
61 //
62 // -------------------------------------------------------------
63 //
64 using namespace boost::numeric;
65 //
66 // -------------------------------------------------------------
67 //
68 template<typename ScalarType>
70 {
72  if (s1 != s2)
73  return (s1 - s2) / std::max(fabs(s1), fabs(s2));
74  return 0;
75 }
76 
77 template<typename ScalarType>
78 ScalarType diff(ublas::vector<ScalarType> & v1, viennacl::vector<ScalarType> & v2)
79 {
80  ublas::vector<ScalarType> v2_cpu(v2.size());
82  viennacl::copy(v2.begin(), v2.end(), v2_cpu.begin());
84 
85  for (std::size_t i=0;i<v1.size(); ++i)
86  {
87  if ( std::max( fabs(v2_cpu[i]), fabs(v1[i]) ) > 0 )
88  v2_cpu[i] = fabs(v2_cpu[i] - v1[i]) / std::max( fabs(v2_cpu[i]), fabs(v1[i]) );
89  else
90  v2_cpu[i] = 0.0;
91  }
92 
93  return norm_inf(v2_cpu);
94 }
95 
96 
97 template<typename ScalarType, typename VCLMatrixType>
98 ScalarType diff(ublas::matrix<ScalarType> & mat1, VCLMatrixType & mat2)
99 {
100  ublas::matrix<ScalarType> mat2_cpu(mat2.size1(), mat2.size2());
101  viennacl::backend::finish(); //workaround for a bug in APP SDK 2.7 on Trinity APUs (with Catalyst 12.8)
102  viennacl::copy(mat2, mat2_cpu);
103  ScalarType ret = 0;
104  ScalarType act = 0;
105 
106  for (unsigned int i = 0; i < mat2_cpu.size1(); ++i)
107  {
108  for (unsigned int j = 0; j < mat2_cpu.size2(); ++j)
109  {
110  act = std::fabs(mat2_cpu(i,j) - mat1(i,j)) / std::max( std::fabs(mat2_cpu(i, j)), std::fabs(mat1(i,j)) );
111  if (act > ret)
112  ret = act;
113  }
114  }
115  //std::cout << ret << std::endl;
116  return ret;
117 }
118 
119 
120 
121 //
122 // Triangular solvers
123 //
124 
125 
126 
127 template<typename RHSTypeRef, typename RHSTypeCheck, typename Epsilon >
128 void run_solver_check(RHSTypeRef & B_ref, RHSTypeCheck & B_check, int & retval, Epsilon const & epsilon)
129 {
130  double act_diff = fabs(diff(B_ref, B_check));
131  if ( act_diff > epsilon )
132  {
133  std::cout << " FAILED!" << std::endl;
134  std::cout << "# Error at operation: matrix-matrix solve" << std::endl;
135  std::cout << " diff: " << act_diff << std::endl;
136  retval = EXIT_FAILURE;
137  }
138  else
139  std::cout << " passed! " << act_diff << std::endl;
140 
141 }
142 
143 
144 template< typename NumericT, typename Epsilon,
145  typename ReferenceMatrixTypeA, typename ReferenceMatrixTypeB, typename ReferenceMatrixTypeC,
146  typename MatrixTypeA, typename MatrixTypeB, typename MatrixTypeC, typename MatrixTypeResult>
147 int test_solve(Epsilon const& epsilon,
148 
149  ReferenceMatrixTypeA const & A,
150  ReferenceMatrixTypeB const & B_start,
151  ReferenceMatrixTypeC const & C_start,
152 
153  MatrixTypeA const & vcl_A,
154  MatrixTypeB & vcl_B,
155  MatrixTypeC & vcl_C,
156  MatrixTypeResult const &
157  )
158 {
159  int retval = EXIT_SUCCESS;
160 
161  // --------------------------------------------------------------------------
162 
163  ReferenceMatrixTypeA result;
164  ReferenceMatrixTypeC C_trans;
165 
166  ReferenceMatrixTypeB B = B_start;
167  ReferenceMatrixTypeC C = C_start;
168 
169  MatrixTypeResult vcl_result;
170 
171  // Test: A \ B with various tags --------------------------------------------------------------------------
172  std::cout << "Testing A \\ B: " << std::endl;
173  std::cout << " * upper_tag: ";
174  result = ublas::solve(A, B, ublas::upper_tag());
175  vcl_result = viennacl::linalg::solve(vcl_A, vcl_B, viennacl::linalg::upper_tag());
176  run_solver_check(result, vcl_result, retval, epsilon);
177 
178  std::cout << " * unit_upper_tag: ";
179  result = ublas::solve(A, B, ublas::unit_upper_tag());
180  vcl_result = viennacl::linalg::solve(vcl_A, vcl_B, viennacl::linalg::unit_upper_tag());
181  run_solver_check(result, vcl_result, retval, epsilon);
182 
183  std::cout << " * lower_tag: ";
184  result = ublas::solve(A, B, ublas::lower_tag());
185  vcl_result = viennacl::linalg::solve(vcl_A, vcl_B, viennacl::linalg::lower_tag());
186  run_solver_check(result, vcl_result, retval, epsilon);
187 
188  std::cout << " * unit_lower_tag: ";
189  result = ublas::solve(A, B, ublas::unit_lower_tag());
190  vcl_result = viennacl::linalg::solve(vcl_A, vcl_B, viennacl::linalg::unit_lower_tag());
191  run_solver_check(result, vcl_result, retval, epsilon);
192 
193  if (retval == EXIT_SUCCESS)
194  std::cout << "Test A \\ B passed!" << std::endl;
195 
196  B = B_start;
197  C = C_start;
198 
199  // Test: A \ B^T --------------------------------------------------------------------------
200  std::cout << "Testing A \\ B^T: " << std::endl;
201  std::cout << " * upper_tag: ";
202  viennacl::copy(C, vcl_C); C_trans = trans(C);
203  //check solve():
204  result = ublas::solve(A, C_trans, ublas::upper_tag());
205  vcl_result = viennacl::linalg::solve(vcl_A, trans(vcl_C), viennacl::linalg::upper_tag());
206  run_solver_check(result, vcl_result, retval, epsilon);
207  //check compute kernels:
208  std::cout << " * upper_tag: ";
209  ublas::inplace_solve(A, C_trans, ublas::upper_tag());
211  C = trans(C_trans); run_solver_check(C, vcl_C, retval, epsilon);
212 
213  std::cout << " * unit_upper_tag: ";
214  viennacl::copy(C, vcl_C); C_trans = trans(C);
215  ublas::inplace_solve(A, C_trans, ublas::unit_upper_tag());
217  C = trans(C_trans); run_solver_check(C, vcl_C, retval, epsilon);
218 
219  std::cout << " * lower_tag: ";
220  viennacl::copy(C, vcl_C); C_trans = trans(C);
221  ublas::inplace_solve(A, C_trans, ublas::lower_tag());
223  C = trans(C_trans); run_solver_check(C, vcl_C, retval, epsilon);
224 
225  std::cout << " * unit_lower_tag: ";
226  viennacl::copy(C, vcl_C); C_trans = trans(C);
227  ublas::inplace_solve(A, C_trans, ublas::unit_lower_tag());
229  C = trans(C_trans); run_solver_check(C, vcl_C, retval, epsilon);
230 
231  if (retval == EXIT_SUCCESS)
232  std::cout << "Test A \\ B^T passed!" << std::endl;
233 
234  B = B_start;
235  C = C_start;
236 
237  // Test: A \ B with various tags --------------------------------------------------------------------------
238  std::cout << "Testing A^T \\ B: " << std::endl;
239  std::cout << " * upper_tag: ";
240  viennacl::copy(B, vcl_B);
241  result = ublas::solve(trans(A), B, ublas::upper_tag());
242  vcl_result = viennacl::linalg::solve(trans(vcl_A), vcl_B, viennacl::linalg::upper_tag());
243  run_solver_check(result, vcl_result, retval, epsilon);
244 
245  std::cout << " * unit_upper_tag: ";
246  viennacl::copy(B, vcl_B);
247  result = ublas::solve(trans(A), B, ublas::unit_upper_tag());
248  vcl_result = viennacl::linalg::solve(trans(vcl_A), vcl_B, viennacl::linalg::unit_upper_tag());
249  run_solver_check(result, vcl_result, retval, epsilon);
250 
251  std::cout << " * lower_tag: ";
252  viennacl::copy(B, vcl_B);
253  result = ublas::solve(trans(A), B, ublas::lower_tag());
254  vcl_result = viennacl::linalg::solve(trans(vcl_A), vcl_B, viennacl::linalg::lower_tag());
255  run_solver_check(result, vcl_result, retval, epsilon);
256 
257  std::cout << " * unit_lower_tag: ";
258  viennacl::copy(B, vcl_B);
259  result = ublas::solve(trans(A), B, ublas::unit_lower_tag());
260  vcl_result = viennacl::linalg::solve(trans(vcl_A), vcl_B, viennacl::linalg::unit_lower_tag());
261  run_solver_check(result, vcl_result, retval, epsilon);
262 
263  if (retval == EXIT_SUCCESS)
264  std::cout << "Test A^T \\ B passed!" << std::endl;
265 
266  B = B_start;
267  C = C_start;
268 
269  // Test: A^T \ B^T --------------------------------------------------------------------------
270  std::cout << "Testing A^T \\ B^T: " << std::endl;
271  std::cout << " * upper_tag: ";
272  viennacl::copy(C, vcl_C); C_trans = trans(C);
273  //check solve():
274  result = ublas::solve(trans(A), C_trans, ublas::upper_tag());
275  vcl_result = viennacl::linalg::solve(trans(vcl_A), trans(vcl_C), viennacl::linalg::upper_tag());
276  run_solver_check(result, vcl_result, retval, epsilon);
277  //check kernels:
278  std::cout << " * upper_tag: ";
279  ublas::inplace_solve(trans(A), C_trans, ublas::upper_tag());
281  C = trans(C_trans); run_solver_check(C, vcl_C, retval, epsilon);
282 
283  std::cout << " * unit_upper_tag: ";
284  viennacl::copy(C, vcl_C); C_trans = trans(C);
285  ublas::inplace_solve(trans(A), C_trans, ublas::unit_upper_tag());
287  C = trans(C_trans); run_solver_check(C, vcl_C, retval, epsilon);
288 
289  std::cout << " * lower_tag: ";
290  viennacl::copy(C, vcl_C); C_trans = trans(C);
291  ublas::inplace_solve(trans(A), C_trans, ublas::lower_tag());
293  C = trans(C_trans); run_solver_check(C, vcl_C, retval, epsilon);
294 
295  std::cout << " * unit_lower_tag: ";
296  viennacl::copy(C, vcl_C); C_trans = trans(C);
297  ublas::inplace_solve(trans(A), C_trans, ublas::unit_lower_tag());
299  C = trans(C_trans); run_solver_check(C, vcl_C, retval, epsilon);
300 
301  if (retval == EXIT_SUCCESS)
302  std::cout << "Test A^T \\ B^T passed!" << std::endl;
303 
304  return retval;
305 }
306 
307 
308 template< typename NumericT, typename F_A, typename F_B, typename Epsilon >
309 int test_solve(Epsilon const& epsilon)
310 {
311  int ret = EXIT_SUCCESS;
312  std::size_t matrix_size = 135; //some odd number, not too large
313  std::size_t rhs_num = 67;
314 
315  std::cout << "--- Part 2: Testing matrix-matrix solver ---" << std::endl;
316 
317 
318  ublas::matrix<NumericT> A(matrix_size, matrix_size);
319  ublas::matrix<NumericT> B_start(matrix_size, rhs_num);
320  ublas::matrix<NumericT> C_start(rhs_num, matrix_size);
321 
322  for (std::size_t i = 0; i < A.size1(); ++i)
323  {
324  for (std::size_t j = 0; j < A.size2(); ++j)
325  A(i,j) = static_cast<NumericT>(-0.5) * random<NumericT>();
326  A(i,i) = NumericT(1.0) + NumericT(2.0) * random<NumericT>(); //some extra weight on diagonal for stability
327  }
328 
329  for (std::size_t i = 0; i < B_start.size1(); ++i)
330  for (std::size_t j = 0; j < B_start.size2(); ++j)
331  B_start(i,j) = random<NumericT>();
332 
333  for (std::size_t i = 0; i < C_start.size1(); ++i)
334  for (std::size_t j = 0; j < C_start.size2(); ++j)
335  C_start(i,j) = random<NumericT>();
336 
337 
338  // A
339  viennacl::range range1_A(matrix_size, 2*matrix_size);
340  viennacl::range range2_A(2*matrix_size, 3*matrix_size);
341  viennacl::slice slice1_A(matrix_size, 2, matrix_size);
342  viennacl::slice slice2_A(0, 3, matrix_size);
343 
344  viennacl::matrix<NumericT, F_A> vcl_A(matrix_size, matrix_size);
345  viennacl::copy(A, vcl_A);
346 
347  viennacl::matrix<NumericT, F_A> vcl_big_range_A(4*matrix_size, 4*matrix_size);
348  viennacl::matrix_range<viennacl::matrix<NumericT, F_A> > vcl_range_A(vcl_big_range_A, range1_A, range2_A);
349  viennacl::copy(A, vcl_range_A);
350 
351  viennacl::matrix<NumericT, F_A> vcl_big_slice_A(4*matrix_size, 4*matrix_size);
352  viennacl::matrix_slice<viennacl::matrix<NumericT, F_A> > vcl_slice_A(vcl_big_slice_A, slice1_A, slice2_A);
353  viennacl::copy(A, vcl_slice_A);
354 
355 
356  // B
357  viennacl::range range1_B(matrix_size, 2*matrix_size);
358  viennacl::range range2_B(2*rhs_num, 3*rhs_num);
359  viennacl::slice slice1_B(matrix_size, 2, matrix_size);
360  viennacl::slice slice2_B(0, 3, rhs_num);
361 
362  viennacl::matrix<NumericT, F_B> vcl_B(matrix_size, rhs_num);
363  viennacl::copy(B_start, vcl_B);
364 
365  viennacl::matrix<NumericT, F_B> vcl_big_range_B(4*matrix_size, 4*rhs_num);
366  viennacl::matrix_range<viennacl::matrix<NumericT, F_B> > vcl_range_B(vcl_big_range_B, range1_B, range2_B);
367  viennacl::copy(B_start, vcl_range_B);
368 
369  viennacl::matrix<NumericT, F_B> vcl_big_slice_B(4*matrix_size, 4*rhs_num);
370  viennacl::matrix_slice<viennacl::matrix<NumericT, F_B> > vcl_slice_B(vcl_big_slice_B, slice1_B, slice2_B);
371  viennacl::copy(B_start, vcl_slice_B);
372 
373 
374  // C
375  viennacl::range range1_C(rhs_num, 2*rhs_num);
376  viennacl::range range2_C(2*matrix_size, 3*matrix_size);
377  viennacl::slice slice1_C(rhs_num, 2, rhs_num);
378  viennacl::slice slice2_C(0, 3, matrix_size);
379 
380  viennacl::matrix<NumericT, F_B> vcl_C(rhs_num, matrix_size);
381  viennacl::copy(C_start, vcl_C);
382 
383  viennacl::matrix<NumericT, F_B> vcl_big_range_C(4*rhs_num, 4*matrix_size);
384  viennacl::matrix_range<viennacl::matrix<NumericT, F_B> > vcl_range_C(vcl_big_range_C, range1_C, range2_C);
385  viennacl::copy(C_start, vcl_range_C);
386 
387  viennacl::matrix<NumericT, F_B> vcl_big_slice_C(4*rhs_num, 4*matrix_size);
388  viennacl::matrix_slice<viennacl::matrix<NumericT, F_B> > vcl_slice_C(vcl_big_slice_C, slice1_C, slice2_C);
389  viennacl::copy(C_start, vcl_slice_C);
390 
391 
392  std::cout << "Now using A=matrix, B=matrix" << std::endl;
393  ret = test_solve<NumericT>(epsilon,
394  A, B_start, C_start,
395  vcl_A, vcl_B, vcl_C, vcl_B
396  );
397  if (ret != EXIT_SUCCESS)
398  return ret;
399 
400  std::cout << "Now using A=matrix, B=range" << std::endl;
401  ret = test_solve<NumericT>(epsilon,
402  A, B_start, C_start,
403  vcl_A, vcl_range_B, vcl_range_C, vcl_B
404  );
405  if (ret != EXIT_SUCCESS)
406  return ret;
407 
408  std::cout << "Now using A=matrix, B=slice" << std::endl;
409  ret = test_solve<NumericT>(epsilon,
410  A, B_start, C_start,
411  vcl_A, vcl_slice_B, vcl_slice_C, vcl_B
412  );
413  if (ret != EXIT_SUCCESS)
414  return ret;
415 
416 
417 
418  std::cout << "Now using A=range, B=matrix" << std::endl;
419  ret = test_solve<NumericT>(epsilon,
420  A, B_start, C_start,
421  vcl_range_A, vcl_B, vcl_C, vcl_B
422  );
423  if (ret != EXIT_SUCCESS)
424  return ret;
425 
426  std::cout << "Now using A=range, B=range" << std::endl;
427  ret = test_solve<NumericT>(epsilon,
428  A, B_start, C_start,
429  vcl_range_A, vcl_range_B, vcl_range_C, vcl_B
430  );
431  if (ret != EXIT_SUCCESS)
432  return ret;
433 
434  std::cout << "Now using A=range, B=slice" << std::endl;
435  ret = test_solve<NumericT>(epsilon,
436  A, B_start, C_start,
437  vcl_range_A, vcl_slice_B, vcl_slice_C, vcl_B
438  );
439  if (ret != EXIT_SUCCESS)
440  return ret;
441 
442 
443 
444 
445  std::cout << "Now using A=slice, B=matrix" << std::endl;
446  ret = test_solve<NumericT>(epsilon,
447  A, B_start, C_start,
448  vcl_slice_A, vcl_B, vcl_C, vcl_B
449  );
450  if (ret != EXIT_SUCCESS)
451  return ret;
452 
453  std::cout << "Now using A=slice, B=range" << std::endl;
454  ret = test_solve<NumericT>(epsilon,
455  A, B_start, C_start,
456  vcl_slice_A, vcl_range_B, vcl_range_C, vcl_B
457  );
458  if (ret != EXIT_SUCCESS)
459  return ret;
460 
461  std::cout << "Now using A=slice, B=slice" << std::endl;
462  ret = test_solve<NumericT>(epsilon,
463  A, B_start, C_start,
464  vcl_slice_A, vcl_slice_B, vcl_slice_C, vcl_B
465  );
466  if (ret != EXIT_SUCCESS)
467  return ret;
468 
469 
470 
471 
472  return ret;
473 
474 }
475 
476 
477 
478 //
479 // Control functions
480 //
481 
482 
483 template< typename NumericT, typename Epsilon >
484 int test(Epsilon const& epsilon)
485 {
486  int ret;
487 
488  std::cout << "////////////////////////////////" << std::endl;
489  std::cout << "/// Now testing A=row, B=row ///" << std::endl;
490  std::cout << "////////////////////////////////" << std::endl;
491  ret = test_solve<NumericT, viennacl::row_major, viennacl::row_major>(epsilon);
492  if (ret != EXIT_SUCCESS)
493  return ret;
494 
495 
496  std::cout << "////////////////////////////////" << std::endl;
497  std::cout << "/// Now testing A=row, B=col ///" << std::endl;
498  std::cout << "////////////////////////////////" << std::endl;
499  ret = test_solve<NumericT, viennacl::row_major, viennacl::column_major>(epsilon);
500  if (ret != EXIT_SUCCESS)
501  return ret;
502 
503  std::cout << "////////////////////////////////" << std::endl;
504  std::cout << "/// Now testing A=col, B=row ///" << std::endl;
505  std::cout << "////////////////////////////////" << std::endl;
506  ret = test_solve<NumericT, viennacl::column_major, viennacl::row_major>(epsilon);
507  if (ret != EXIT_SUCCESS)
508  return ret;
509 
510  std::cout << "////////////////////////////////" << std::endl;
511  std::cout << "/// Now testing A=col, B=col ///" << std::endl;
512  std::cout << "////////////////////////////////" << std::endl;
513  ret = test_solve<NumericT, viennacl::column_major, viennacl::column_major>(epsilon);
514  if (ret != EXIT_SUCCESS)
515  return ret;
516 
517 
518 
519  return ret;
520 }
521 
522 //
523 // -------------------------------------------------------------
524 //
525 int main()
526 {
527  std::cout << std::endl;
528  std::cout << "----------------------------------------------" << std::endl;
529  std::cout << "----------------------------------------------" << std::endl;
530  std::cout << "## Test :: BLAS 3 routines" << std::endl;
531  std::cout << "----------------------------------------------" << std::endl;
532  std::cout << "----------------------------------------------" << std::endl;
533  std::cout << std::endl;
534 
535  int retval = EXIT_SUCCESS;
536 
537  std::cout << std::endl;
538  std::cout << "----------------------------------------------" << std::endl;
539  std::cout << std::endl;
540  {
541  typedef float NumericT;
542  NumericT epsilon = NumericT(1.0E-3);
543  std::cout << "# Testing setup:" << std::endl;
544  std::cout << " eps: " << epsilon << std::endl;
545  std::cout << " numeric: float" << std::endl;
546  retval = test<NumericT>(epsilon);
547  if ( retval == EXIT_SUCCESS )
548  std::cout << "# Test passed" << std::endl;
549  else
550  return retval;
551  }
552  std::cout << std::endl;
553  std::cout << "----------------------------------------------" << std::endl;
554  std::cout << std::endl;
555 #ifdef VIENNACL_WITH_OPENCL
557 #endif
558  {
559  {
560  typedef double NumericT;
561  NumericT epsilon = 1.0E-11;
562  std::cout << "# Testing setup:" << std::endl;
563  std::cout << " eps: " << epsilon << std::endl;
564  std::cout << " numeric: double" << std::endl;
565  retval = test<NumericT>(epsilon);
566  if ( retval == EXIT_SUCCESS )
567  std::cout << "# Test passed" << std::endl;
568  else
569  return retval;
570  }
571  std::cout << std::endl;
572  std::cout << "----------------------------------------------" << std::endl;
573  std::cout << std::endl;
574  }
575 
576  std::cout << std::endl;
577  std::cout << "------- Test completed --------" << std::endl;
578  std::cout << std::endl;
579 
580 
581  return retval;
582 }
void inplace_solve(matrix_base< NumericT > const &A, matrix_base< NumericT > &B, SolverTagT tag)
Direct inplace solver for triangular systems with multiple right hand sides, i.e. A \ B (MATLAB notat...
void inplace_solve(const matrix_base< NumericT > &A, matrix_base< NumericT > &B, SolverTagT)
Direct inplace solver for triangular systems with multiple right hand sides, i.e. A \ B (MATLAB notat...
int main()
This class represents a single scalar value on the GPU and behaves mostly like a built-in scalar type...
Definition: forwards.h:226
Generic interface for the l^2-norm. See viennacl/linalg/vector_operations.hpp for implementations...
Class for representing strided submatrices of a bigger matrix A.
Definition: forwards.h:442
void trans(matrix_expression< const matrix_base< NumericT, SizeT, DistanceT >, const matrix_base< NumericT, SizeT, DistanceT >, op_trans > const &proxy, matrix_base< NumericT > &temp_trans)
Generic interface for matrix-vector and matrix-matrix products. See viennacl/linalg/vector_operations...
Implementation of the dense matrix class.
A tag class representing a lower triangular matrix.
Definition: forwards.h:809
void finish()
Synchronizes the execution. finish() will only return after all compute kernels (CUDA, OpenCL) have completed.
Definition: memory.hpp:54
A dense matrix class.
Definition: forwards.h:374
viennacl::scalar< int > s2
viennacl::scalar< float > s1
T max(const T &lhs, const T &rhs)
Maximum.
Definition: util.hpp:59
viennacl::ocl::device const & current_device()
Convenience function for returning the active device in the current context.
Definition: backend.hpp:351
viennacl::vector< float > v1
iterator begin()
Returns an iterator pointing to the beginning of the vector (STL like)
Definition: vector.hpp:827
A tag class representing an upper triangular matrix.
Definition: forwards.h:814
bool double_support() const
ViennaCL convenience function: Returns true if the device supports double precision.
Definition: device.hpp:956
Implementations of dense direct solvers are found here.
Proxy classes for matrices.
int test_solve(Epsilon const &epsilon, ReferenceMatrixTypeA const &A, ReferenceMatrixTypeB const &B_start, ReferenceMatrixTypeC const &C_start, MatrixTypeA const &vcl_A, MatrixTypeB &vcl_B, MatrixTypeC &vcl_C, MatrixTypeResult const &)
viennacl::vector< int > v2
The vector type with operator-overloads and proxy classes is defined here. Linear algebra operations ...
T norm_inf(std::vector< T, A > const &v1)
Definition: norm_inf.hpp:60
void copy(std::vector< NumericT > &cpu_vec, circulant_matrix< NumericT, AlignmentV > &gpu_mat)
Copies a circulant matrix from the std::vector to the OpenCL device (either GPU or multi-core CPU) ...
size_type size() const
Returns the length of the vector (cf. std::vector)
Definition: vector_def.hpp:118
A range class that refers to an interval [start, stop), where 'start' is included, and 'stop' is excluded.
Definition: forwards.h:423
float ScalarType
Definition: fft_1d.cpp:42
A tag class representing a lower triangular matrix with unit diagonal.
Definition: forwards.h:819
int test(Epsilon const &epsilon)
Class for representing non-strided submatrices of a bigger matrix A.
Definition: forwards.h:439
void run_solver_check(RHSTypeRef &B_ref, RHSTypeCheck &B_check, int &retval, Epsilon const &epsilon)
iterator end()
Returns an iterator pointing to the end of the vector (STL like)
Definition: vector.hpp:834
A slice class that refers to an interval [start, stop), where 'start' is included, and 'stop' is excluded.
Definition: forwards.h:428
ScalarType diff(ScalarType &s1, viennacl::scalar< ScalarType > &s2)
Definition: blas3_solve.cpp:69
Implementation of the ViennaCL scalar class.
A tag class representing an upper triangular matrix with unit diagonal.
Definition: forwards.h:824
viennacl::vector< NumericT > solve(MatrixT const &A, viennacl::vector_base< NumericT > const &rhs, bicgstab_tag const &tag, viennacl::linalg::no_precond)
Implementation of a pipelined stabilized Bi-conjugate gradient solver.
Definition: bicgstab.hpp:88