ViennaCL - The Vienna Computing Library  1.5.0
viennacl/linalg/misc_operations.hpp
Go to the documentation of this file.
00001 #ifndef VIENNACL_LINALG_MISC_OPERATIONS_HPP_
00002 #define VIENNACL_LINALG_MISC_OPERATIONS_HPP_
00003 
00004 /* =========================================================================
00005    Copyright (c) 2010-2013, Institute for Microelectronics,
00006                             Institute for Analysis and Scientific Computing,
00007                             TU Wien.
00008    Portions of this software are copyright by UChicago Argonne, LLC.
00009 
00010                             -----------------
00011                   ViennaCL - The Vienna Computing Library
00012                             -----------------
00013 
00014    Project Head:    Karl Rupp                   rupp@iue.tuwien.ac.at
00015 
00016    (A list of authors and contributors can be found in the PDF manual)
00017 
00018    License:         MIT (X11), see file LICENSE in the base directory
00019 ============================================================================= */
00020 
00025 #include "viennacl/forwards.h"
00026 #include "viennacl/scalar.hpp"
00027 #include "viennacl/vector.hpp"
00028 #include "viennacl/matrix.hpp"
00029 #include "viennacl/tools/tools.hpp"
00030 #include "viennacl/linalg/host_based/misc_operations.hpp"
00031 
00032 #ifdef VIENNACL_WITH_OPENCL
00033   #include "viennacl/linalg/opencl/misc_operations.hpp"
00034 #endif
00035 
00036 #ifdef VIENNACL_WITH_CUDA
00037   #include "viennacl/linalg/cuda/misc_operations.hpp"
00038 #endif
00039 
00040 namespace viennacl
00041 {
00042   namespace linalg
00043   {
00044 
00045     namespace detail
00046     {
00047 
00048       template <typename ScalarType>
00049       void level_scheduling_substitute(vector<ScalarType> & vec,
00050                                   viennacl::backend::mem_handle const & row_index_array,
00051                                   viennacl::backend::mem_handle const & row_buffer,
00052                                   viennacl::backend::mem_handle const & col_buffer,
00053                                   viennacl::backend::mem_handle const & element_buffer,
00054                                   vcl_size_t num_rows
00055                                   )
00056       {
00057         assert( viennacl::traits::handle(vec).get_active_handle_id() == row_index_array.get_active_handle_id() && bool("Incompatible memory domains"));
00058         assert( viennacl::traits::handle(vec).get_active_handle_id() ==      row_buffer.get_active_handle_id() && bool("Incompatible memory domains"));
00059         assert( viennacl::traits::handle(vec).get_active_handle_id() ==      col_buffer.get_active_handle_id() && bool("Incompatible memory domains"));
00060         assert( viennacl::traits::handle(vec).get_active_handle_id() ==  element_buffer.get_active_handle_id() && bool("Incompatible memory domains"));
00061 
00062         switch (viennacl::traits::handle(vec).get_active_handle_id())
00063         {
00064           case viennacl::MAIN_MEMORY:
00065             viennacl::linalg::host_based::detail::level_scheduling_substitute(vec, row_index_array, row_buffer, col_buffer, element_buffer, num_rows);
00066             break;
00067 #ifdef VIENNACL_WITH_OPENCL
00068           case viennacl::OPENCL_MEMORY:
00069             viennacl::linalg::opencl::detail::level_scheduling_substitute(vec, row_index_array, row_buffer, col_buffer, element_buffer, num_rows);
00070             break;
00071 #endif
00072 #ifdef VIENNACL_WITH_CUDA
00073           case viennacl::CUDA_MEMORY:
00074             viennacl::linalg::cuda::detail::level_scheduling_substitute(vec, row_index_array, row_buffer, col_buffer, element_buffer, num_rows);
00075             break;
00076 #endif
00077           case viennacl::MEMORY_NOT_INITIALIZED:
00078             throw memory_exception("not initialised!");
00079           default:
00080             throw memory_exception("not implemented");
00081         }
00082       }
00083 
00084 
00085 
00086 
00087     } //namespace detail
00088 
00089 
00090   } //namespace linalg
00091 } //namespace viennacl
00092 
00093 
00094 #endif