ViennaCL - The Vienna Computing Library
1.5.1
|
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