ViennaCL - The Vienna Computing Library
1.5.2
|
00001 #ifndef VIENNACL_LINALG_MISC_OPERATIONS_HPP_ 00002 #define VIENNACL_LINALG_MISC_OPERATIONS_HPP_ 00003 00004 /* ========================================================================= 00005 Copyright (c) 2010-2014, 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