ViennaCL - The Vienna Computing Library  1.5.0
viennacl/linalg/opencl/kernels/compressed_compressed_matrix.hpp
Go to the documentation of this file.
00001 #ifndef VIENNACL_LINALG_OPENCL_KERNELS_COMPRESSED_COMPRESSED_MATRIX_HPP
00002 #define VIENNACL_LINALG_OPENCL_KERNELS_COMPRESSED_COMPRESSED_MATRIX_HPP
00003 
00004 #include "viennacl/tools/tools.hpp"
00005 #include "viennacl/ocl/kernel.hpp"
00006 #include "viennacl/ocl/platform.hpp"
00007 #include "viennacl/ocl/utils.hpp"
00008 
00011 namespace viennacl
00012 {
00013   namespace linalg
00014   {
00015     namespace opencl
00016     {
00017       namespace kernels
00018       {
00019 
00021 
00022         template <typename StringType>
00023         void generate_vec_mul(StringType & source, std::string const & numeric_string)
00024         {
00025           source.append("__kernel void vec_mul( \n");
00026           source.append("          __global const unsigned int * row_jumper, \n");
00027           source.append("          __global const unsigned int * row_indices, \n");
00028           source.append("          __global const unsigned int * column_indices, \n");
00029           source.append("          __global const "); source.append(numeric_string); source.append(" * elements, \n");
00030           source.append("          uint nonzero_rows, \n");
00031           source.append("          __global const "); source.append(numeric_string); source.append(" * x, \n");
00032           source.append("          uint4 layout_x, \n");
00033           source.append("          __global "); source.append(numeric_string); source.append(" * result, \n");
00034           source.append("          uint4 layout_result) \n");
00035           source.append("{ \n");
00036           source.append("  for (unsigned int i = get_global_id(0); i < nonzero_rows; i += get_global_size(0)) \n");
00037           source.append("  { \n");
00038           source.append("    "); source.append(numeric_string); source.append(" dot_prod = 0; \n");
00039           source.append("    unsigned int row_end = row_jumper[i+1]; \n");
00040           source.append("    for (unsigned int j = row_jumper[i]; j < row_end; ++j) \n");
00041           source.append("      dot_prod += elements[j] * x[column_indices[j] * layout_x.y + layout_x.x]; \n");
00042           source.append("    result[row_indices[i] * layout_result.y + layout_result.x] = dot_prod; \n");
00043           source.append("  } \n");
00044           source.append(" } \n");
00045         }
00046 
00048 
00050         template <typename NumericT>
00051         struct compressed_compressed_matrix
00052         {
00053           static std::string program_name()
00054           {
00055             return viennacl::ocl::type_to_string<NumericT>::apply() + "_compressed_compressed_matrix";
00056           }
00057 
00058           static void init(viennacl::ocl::context & ctx)
00059           {
00060             viennacl::ocl::DOUBLE_PRECISION_CHECKER<NumericT>::apply(ctx);
00061             std::string numeric_string = viennacl::ocl::type_to_string<NumericT>::apply();
00062 
00063             static std::map<cl_context, bool> init_done;
00064             if (!init_done[ctx.handle().get()])
00065             {
00066               std::string source;
00067               source.reserve(8192);
00068 
00069               viennacl::ocl::append_double_precision_pragma<NumericT>(ctx, source);
00070 
00071               // fully parametrized kernels:
00072               generate_vec_mul(source, numeric_string);
00073 
00074               std::string prog_name = program_name();
00075               #ifdef VIENNACL_BUILD_INFO
00076               std::cout << "Creating program " << prog_name << std::endl;
00077               #endif
00078               ctx.add_program(source, prog_name);
00079               init_done[ctx.handle().get()] = true;
00080             } //if
00081           } //init
00082         };
00083 
00084       }  // namespace kernels
00085     }  // namespace opencl
00086   }  // namespace linalg
00087 }  // namespace viennacl
00088 #endif
00089