Go to the documentation of this file.00001 #ifndef _VIENNACL_MATRIX_PROD_ROW_COL_ROW_KERNELS_HPP_
00002 #define _VIENNACL_MATRIX_PROD_ROW_COL_ROW_KERNELS_HPP_
00003 #include "viennacl/tools/tools.hpp"
00004 #include "viennacl/ocl/kernel.hpp"
00005 #include "viennacl/ocl/platform.hpp"
00006 #include "viennacl/ocl/utils.hpp"
00007 #include "viennacl/linalg/kernels/matrix_prod_row_col_row_source.h"
00008
00009
00010 namespace viennacl
00011 {
00012 namespace linalg
00013 {
00014 namespace kernels
00015 {
00016 template<class TYPE, unsigned int alignment>
00017 struct matrix_prod_row_col_row;
00018
00019
00021 template <>
00022 struct matrix_prod_row_col_row<float, 1>
00023 {
00024 static std::string program_name()
00025 {
00026 return "f_matrix_prod_row_col_row_1";
00027 }
00028 static void init()
00029 {
00030 viennacl::ocl::DOUBLE_PRECISION_CHECKER<float>::apply();
00031 static std::map<cl_context, bool> init_done;
00032 viennacl::ocl::context & context_ = viennacl::ocl::current_context();
00033 if (!init_done[context_.handle()])
00034 {
00035 std::string source;
00036 source.append(matrix_prod_row_col_row_align1_prod_TT);
00037 source.append(matrix_prod_row_col_row_align1_prod_TA);
00038 source.append(matrix_prod_row_col_row_align1_prod_AA);
00039 source.append(matrix_prod_row_col_row_align1_prod_AT);
00040 std::string prog_name = program_name();
00041 #ifdef VIENNACL_BUILD_INFO
00042 std::cout << "Creating program " << prog_name << std::endl;
00043 #endif
00044 context_.add_program(source, prog_name);
00045 viennacl::ocl::program & prog_ = context_.get_program(prog_name);
00046 prog_.add_kernel("prod_TT");
00047 prog_.add_kernel("prod_TA");
00048 prog_.add_kernel("prod_AA");
00049 prog_.add_kernel("prod_AT");
00050 init_done[context_.handle()] = true;
00051 }
00052 }
00053 };
00054
00055
00056
00058 template <>
00059 struct matrix_prod_row_col_row<double, 1>
00060 {
00061 static std::string program_name()
00062 {
00063 return "d_matrix_prod_row_col_row_1";
00064 }
00065 static void init()
00066 {
00067 viennacl::ocl::DOUBLE_PRECISION_CHECKER<double>::apply();
00068 static std::map<cl_context, bool> init_done;
00069 viennacl::ocl::context & context_ = viennacl::ocl::current_context();
00070 if (!init_done[context_.handle()])
00071 {
00072 std::string source;
00073 std::string fp64_ext = viennacl::ocl::current_device().double_support_extension();
00074 source.append(viennacl::tools::make_double_kernel(matrix_prod_row_col_row_align1_prod_TT, fp64_ext));
00075 source.append(viennacl::tools::make_double_kernel(matrix_prod_row_col_row_align1_prod_TA, fp64_ext));
00076 source.append(viennacl::tools::make_double_kernel(matrix_prod_row_col_row_align1_prod_AA, fp64_ext));
00077 source.append(viennacl::tools::make_double_kernel(matrix_prod_row_col_row_align1_prod_AT, fp64_ext));
00078 std::string prog_name = program_name();
00079 #ifdef VIENNACL_BUILD_INFO
00080 std::cout << "Creating program " << prog_name << std::endl;
00081 #endif
00082 context_.add_program(source, prog_name);
00083 viennacl::ocl::program & prog_ = context_.get_program(prog_name);
00084 prog_.add_kernel("prod_TT");
00085 prog_.add_kernel("prod_TA");
00086 prog_.add_kernel("prod_AA");
00087 prog_.add_kernel("prod_AT");
00088 init_done[context_.handle()] = true;
00089 }
00090 }
00091 };
00092
00093
00094 }
00095 }
00096 }
00097 #endif