本文整理汇总了C++中VectorType::handle方法的典型用法代码示例。如果您正苦于以下问题:C++ VectorType::handle方法的具体用法?C++ VectorType::handle怎么用?C++ VectorType::handle使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类VectorType
的用法示例。
在下文中一共展示了VectorType::handle方法的2个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1:
vector_slice(VectorType & v, slice const & entry_slice)
: base_type(v.handle(), entry_slice.size(), v.start() + v.stride() * entry_slice.start(), v.stride() * entry_slice.stride()) {}
示例2: solve
VectorType solve(const MatrixType & matrix, VectorType const & rhs, mixed_precision_cg_tag const & tag)
{
//typedef typename VectorType::value_type ScalarType;
typedef typename viennacl::result_of::value_type<VectorType>::type ScalarType;
typedef typename viennacl::result_of::cpu_value_type<ScalarType>::type CPU_ScalarType;
//TODO: Assert CPU_ScalarType == double
//std::cout << "Starting CG" << std::endl;
vcl_size_t problem_size = viennacl::traits::size(rhs);
VectorType result(rhs);
viennacl::traits::clear(result);
VectorType residual = rhs;
CPU_ScalarType ip_rr = viennacl::linalg::inner_prod(rhs, rhs);
CPU_ScalarType new_ip_rr = 0;
CPU_ScalarType norm_rhs_squared = ip_rr;
if (norm_rhs_squared == 0) //solution is zero if RHS norm is zero
return result;
static bool first = true;
viennacl::ocl::context & ctx = const_cast<viennacl::ocl::context &>(viennacl::traits::opencl_handle(matrix).context());
if (first)
{
ctx.add_program(double_float_conversion_program, "double_float_conversion_program");
}
viennacl::vector<float> residual_low_precision(problem_size, viennacl::traits::context(rhs));
viennacl::vector<float> result_low_precision(problem_size, viennacl::traits::context(rhs));
viennacl::vector<float> p_low_precision(problem_size, viennacl::traits::context(rhs));
viennacl::vector<float> tmp_low_precision(problem_size, viennacl::traits::context(rhs));
float inner_ip_rr = static_cast<float>(ip_rr);
float new_inner_ip_rr = 0;
float initial_inner_rhs_norm_squared = static_cast<float>(ip_rr);
float alpha;
float beta;
viennacl::ocl::kernel & assign_double_to_float = ctx.get_kernel("double_float_conversion_program", "assign_double_to_float");
viennacl::ocl::kernel & inplace_add_float_to_double = ctx.get_kernel("double_float_conversion_program", "inplace_add_float_to_double");
// transfer rhs to single precision:
viennacl::ocl::enqueue( assign_double_to_float(p_low_precision.handle().opencl_handle(),
rhs.handle().opencl_handle(),
cl_uint(rhs.size())
) );
//std::cout << "copying p_low_precision..." << std::endl;
//assign_double_to_float(p_low_precision.handle(), residual.handle(), residual.size());
residual_low_precision = p_low_precision;
// transfer matrix to single precision:
viennacl::compressed_matrix<float> matrix_low_precision(matrix.size1(), matrix.size2(), matrix.nnz(), viennacl::traits::context(rhs));
viennacl::backend::memory_copy(matrix.handle1(), const_cast<viennacl::backend::mem_handle &>(matrix_low_precision.handle1()), 0, 0, sizeof(cl_uint) * (matrix.size1() + 1) );
viennacl::backend::memory_copy(matrix.handle2(), const_cast<viennacl::backend::mem_handle &>(matrix_low_precision.handle2()), 0, 0, sizeof(cl_uint) * (matrix.nnz()) );
viennacl::ocl::enqueue( assign_double_to_float(matrix_low_precision.handle().opencl_handle(),
matrix.handle().opencl_handle(),
cl_uint(matrix.nnz())
) );
//std::cout << "copying matrix_low_precision..." << std::endl;
//assign_double_to_float(const_cast<viennacl::backend::mem_handle &>(matrix_low_precision.handle()), matrix.handle(), matrix.nnz());
//std::cout << "Starting CG solver iterations... " << std::endl;
for (unsigned int i = 0; i < tag.max_iterations(); ++i)
{
tag.iters(i+1);
// lower precision 'inner iteration'
tmp_low_precision = viennacl::linalg::prod(matrix_low_precision, p_low_precision);
alpha = inner_ip_rr / viennacl::linalg::inner_prod(tmp_low_precision, p_low_precision);
result_low_precision += alpha * p_low_precision;
residual_low_precision -= alpha * tmp_low_precision;
new_inner_ip_rr = viennacl::linalg::inner_prod(residual_low_precision, residual_low_precision);
beta = new_inner_ip_rr / inner_ip_rr;
inner_ip_rr = new_inner_ip_rr;
p_low_precision = residual_low_precision + beta * p_low_precision;
if (new_inner_ip_rr < tag.inner_tolerance() * initial_inner_rhs_norm_squared || i == tag.max_iterations()-1)
{
//std::cout << "outer correction at i=" << i << std::endl;
//result += result_low_precision;
viennacl::ocl::enqueue( inplace_add_float_to_double(result.handle().opencl_handle(),
result_low_precision.handle().opencl_handle(),
cl_uint(result.size())
) );
// residual = b - Ax (without introducing a temporary)
residual = viennacl::linalg::prod(matrix, result);
residual = rhs - residual;
//.........这里部分代码省略.........