void prod_impl(viennacl::vandermonde_matrix<NumericT, AlignmentV> const & A,
               viennacl::vector_base<NumericT> const & x,
               viennacl::vector_base<NumericT>       & y)
{
  viennacl::ocl::context & ctx = const_cast<viennacl::ocl::context &>(viennacl::traits::opencl_handle(A).context());
  viennacl::linalg::opencl::kernels::fft<NumericT>::init(ctx);

  viennacl::ocl::kernel & kernel = ctx.get_kernel(viennacl::linalg::opencl::kernels::fft<NumericT>::program_name(), "vandermonde_prod");
  viennacl::ocl::enqueue(kernel(viennacl::traits::opencl_handle(A),
                                viennacl::traits::opencl_handle(x),
                                viennacl::traits::opencl_handle(y),
                                static_cast<cl_uint>(A.size1())));
}
        void prod_impl(const viennacl::vandermonde_matrix<SCALARTYPE, ALIGNMENT> & mat,
                      const viennacl::vector_base<SCALARTYPE> & vec,
                            viennacl::vector_base<SCALARTYPE> & result)
        {
          viennacl::ocl::context & ctx = const_cast<viennacl::ocl::context &>(viennacl::traits::opencl_handle(mat).context());
          viennacl::linalg::opencl::kernels::fft<SCALARTYPE>::init(ctx);

          viennacl::ocl::kernel & kernel = ctx.get_kernel(viennacl::linalg::opencl::kernels::fft<SCALARTYPE>::program_name(), "vandermonde_prod");
          viennacl::ocl::enqueue(kernel(viennacl::traits::opencl_handle(mat),
                                        viennacl::traits::opencl_handle(vec),
                                        viennacl::traits::opencl_handle(result),
                                        static_cast<cl_uint>(mat.size1())));
        }
 void prod_impl(const viennacl::vandermonde_matrix<SCALARTYPE, ALIGNMENT> & mat, 
               const viennacl::vector<SCALARTYPE, VECTOR_ALIGNMENT> & vec,
                     viennacl::vector<SCALARTYPE, VECTOR_ALIGNMENT> & result)
 {
   viennacl::linalg::kernels::fft<SCALARTYPE, 1>::init();
   
   viennacl::ocl::kernel& kernel = viennacl::ocl::current_context()
                                     .get_program(viennacl::linalg::kernels::fft<SCALARTYPE, 1>::program_name())
                                     .get_kernel("vandermonde_prod");
   viennacl::ocl::enqueue(kernel(viennacl::traits::opencl_handle(mat),
                                 viennacl::traits::opencl_handle(vec),
                                 viennacl::traits::opencl_handle(result),
                                 static_cast<cl_uint>(mat.size1())));
 }