105 const RTOpT<Scalar> &op,
110 char reduct_obj_ext[]
113 using Teuchos::arrayView;
115 typedef Teuchos::SerializationTraits<Ordinal, primitive_value_type> PVTST;
116 typedef Teuchos::SerializationTraits<Ordinal, index_type> ITST;
117 typedef Teuchos::SerializationTraits<Ordinal, char_type> CTST;
119 prim_value_type_size = PVTST::fromCountToDirectBytes(1),
120 index_type_size = ITST::fromCountToDirectBytes(1);
124 num_indexes_off = num_values_off + index_type_size,
125 num_chars_off = num_indexes_off + index_type_size,
126 values_off = num_chars_off + index_type_size,
127 indexes_off = values_off + num_values * prim_value_type_size,
128 chars_off = indexes_off + num_indexes * index_type_size;
129 ITST::serialize(1, &num_values, index_type_size, &reduct_obj_ext[num_values_off]);
130 ITST::serialize(1, &num_indexes, index_type_size, &reduct_obj_ext[num_indexes_off]);
131 ITST::serialize(1, &num_chars, index_type_size, &reduct_obj_ext[num_chars_off]);
132 op.extract_reduct_obj_state(
134 arrayView(PVTST::convertFromCharPtr(&reduct_obj_ext[values_off]), num_values),
135 arrayView(ITST::convertFromCharPtr(&reduct_obj_ext[indexes_off]), num_indexes),
136 arrayView(CTST::convertFromCharPtr(&reduct_obj_ext[chars_off]), num_chars)
144 const RTOpT<Scalar> &op,
148 const char reduct_obj_ext[],
152 using Teuchos::arrayView;
154 typedef Teuchos::SerializationTraits<int,primitive_value_type> PVTST;
155 typedef Teuchos::SerializationTraits<int,index_type> ITST;
156 typedef Teuchos::SerializationTraits<int,char_type> CTST;
158 prim_value_type_size = PVTST::fromCountToDirectBytes(1),
159 index_type_size = ITST::fromCountToDirectBytes(1);
163 num_indexes_off = num_values_off + index_type_size,
164 num_chars_off = num_indexes_off + index_type_size,
165 values_off = num_chars_off + index_type_size,
166 indexes_off = values_off + num_values_in * prim_value_type_size,
167 chars_off = indexes_off + num_indexes_in * index_type_size;
169 Ordinal num_values = -1, num_indexes = -1, num_chars = -1;
170 ITST::deserialize(index_type_size, &reduct_obj_ext[num_values_off], 1, &num_values);
171 ITST::deserialize(index_type_size, &reduct_obj_ext[num_indexes_off], 1, &num_indexes);
172 ITST::deserialize(index_type_size, &reduct_obj_ext[num_chars_off], 1, &num_chars);
173 TEUCHOS_TEST_FOR_EXCEPTION(
175 num_values==num_values_in && num_indexes==num_indexes_in
176 && num_chars==num_chars_in ),
178 "Error: RTOp="<<op.op_name()
179 <<
", num_values="<<num_values<<
", num_values_in="<<num_values_in
180 <<
", num_indexes="<<num_indexes<<
", num_indexes_in="<<num_indexes_in
181 <<
", num_chars="<<num_chars<<
", num_chars_in="<<num_chars_in
184 op.load_reduct_obj_state(
185 arrayView(PVTST::convertFromCharPtr(&reduct_obj_ext[values_off]), num_values_in),
186 arrayView(ITST::convertFromCharPtr(&reduct_obj_ext[indexes_off]), num_indexes_in),
187 arrayView(CTST::convertFromCharPtr(&reduct_obj_ext[chars_off]), num_chars_in),
188 Teuchos::ptr(reduct_obj)
315 const RTOpT<Scalar> &op,
321 using Teuchos::Workspace;
322 using Teuchos::reduceAll;
323 Teuchos::WorkspaceStore* wss = Teuchos::get_default_workspace_store().get();
324 Workspace<Teuchos::RCP<ReductTarget> >
325 i_i_reduct_objs( wss, num_cols );
326 Workspace<ReductTarget*>
327 _i_i_reduct_objs( wss, num_cols );
328 for(
int kc = 0; kc < num_cols; ++kc ) {
329 i_i_reduct_objs[kc] = op.reduct_obj_create();
330 _i_i_reduct_objs[kc] = &*i_i_reduct_objs[kc];
332 ReductTargetSerializer<Scalar>
333 serializer(Teuchos::rcpFromRef(op));
334 ReductTargetReductionOp<Scalar>
335 reductOp(Teuchos::rcpFromRef(op));
337 *comm, serializer, reductOp,
338 num_cols, &i_reduct_objs[0], &_i_i_reduct_objs[0]);
339 for(
int kc = 0; kc < num_cols; ++kc ) {
340 op.reduce_reduct_objs(*_i_i_reduct_objs[kc], Teuchos::ptr(reduct_objs[kc]));
368 const RTOpT<Scalar> &op,
370 const int num_multi_vecs,
371 const RTOpPack::ConstSubMultiVectorView<Scalar> sub_multi_vecs[],
372 const int num_targ_multi_vecs,
373 const RTOpPack::SubMultiVectorView<Scalar> targ_sub_multi_vecs[],
378 using Teuchos::Workspace;
379 Teuchos::WorkspaceStore* wss = Teuchos::get_default_workspace_store().get();
381 Workspace<ConstSubVectorView<Scalar> > c_sub_vecs(wss,num_multi_vecs*num_cols);
383 for( off = 0, j = 0; j < num_cols; ++j ) {
384 for( k = 0; k < num_multi_vecs; ++k ) {
385 const ConstSubMultiVectorView<Scalar> &mv = sub_multi_vecs[k];
387 c_sub_vecs[off++].initialize(mv.globalOffset(), mv.subDim(),
388 arcp(&mv(0,j), 0, mv.subDim(),
false), 1);
391 c_sub_vecs[off++].initialize(mv.globalOffset(), mv.subDim(),
397 Workspace<SubVectorView<Scalar> > c_targ_sub_vecs(wss,num_targ_multi_vecs*num_cols);
398 if(targ_sub_multi_vecs) {
399 for( off = 0, j = 0; j < num_cols; ++j ) {
400 for( k = 0; k < num_targ_multi_vecs; ++k ) {
401 const SubMultiVectorView<Scalar> &mv = targ_sub_multi_vecs[k];
402 ArrayRCP<Scalar> mv_j = Teuchos::null;
403 if (mv.subDim()) { mv_j = arcp(&mv(0,j), 0, mv.subDim(),
false); }
404 c_targ_sub_vecs[off++].initialize(mv.globalOffset(), mv.subDim(), mv_j, 1);
410 ,num_multi_vecs, num_multi_vecs && sub_multi_vecs ? &c_sub_vecs[0] : NULL
411 ,num_targ_multi_vecs, num_targ_multi_vecs && targ_sub_multi_vecs ? &c_targ_sub_vecs[0] : NULL
420 const RTOpT<Scalar> &op,
423 const ConstSubVectorView<Scalar> sub_vecs[],
424 const int num_targ_vecs,
425 const SubVectorView<Scalar> sub_targ_vecs[],
429 using Teuchos::arrayView;
431 Teuchos::OSTab tab(out);
433 *out <<
"\nEntering RTOpPack::SPMD_apply_op(...) ...\n";
435 <<
"\ncomm = " << (comm?comm->description():
"NULL")
436 <<
"\nop = " << op.description()
437 <<
"\nnum_cols = " << num_cols
438 <<
"\nnum_vecs = " << num_vecs
439 <<
"\nnum_targ_vecs = " << num_targ_vecs
441 if( num_vecs && sub_vecs ) {
442 *out <<
"\nInput vectors:\n";
443 Teuchos::OSTab tab2(out);
444 for(
int kc = 0; kc < num_cols; ++kc ) {
445 for(
int k = 0; k < num_vecs; ++k ) {
446 *out <<
"\nvecs["<<kc<<
","<<k<<
"] =\n";
447 print(sub_vecs[kc*num_vecs+k],*out);
451 if( num_targ_vecs && sub_targ_vecs ) {
452 *out <<
"\nInput/output vectors *before* transforamtion:\n";
453 Teuchos::OSTab tab2(out);
454 for(
int kc = 0; kc < num_cols; ++kc ) {
455 for(
int k = 0; k < num_targ_vecs; ++k ) {
456 *out <<
"\nvecs["<<kc<<
","<<k<<
"] =\n";
457 print(sub_targ_vecs[kc*num_targ_vecs+k],*out);
462 *out <<
"\nInput/output reduction objects *before* reduction:\n";
463 Teuchos::OSTab tab2(out);
464 for(
int kc = 0; kc < num_cols; ++kc ) {
466 <<
"\nreduct_objs["<<kc<<
"] =\n"
467 << describe(*reduct_objs[kc],Teuchos::VERB_EXTREME);
471 using Teuchos::Workspace;
472 Teuchos::WorkspaceStore* wss = Teuchos::get_default_workspace_store().get();
473 if( reduct_objs == NULL && sub_vecs == NULL && sub_targ_vecs == NULL ) {
478 const int localSubDim =
480 ? ( sub_vecs ? sub_vecs[0].subDim() : 0 )
481 : ( sub_targ_vecs ? sub_targ_vecs[0].subDim() : 0 )
484 if( comm==NULL || reduct_objs == NULL ) {
485 if( ( sub_vecs || sub_targ_vecs ) && localSubDim ) {
486 for(
int kc = 0; kc < num_cols; ++kc ) {
488 arrayView(sub_vecs+kc*num_vecs, num_vecs),
489 arrayView(sub_targ_vecs+kc*num_targ_vecs, num_targ_vecs),
490 reduct_objs ? Teuchos::ptr(reduct_objs[kc]) : Teuchos::null
497 TEUCHOS_TEST_FOR_EXCEPTION(
498 ( ( num_vecs && !sub_vecs) || ( num_targ_vecs && !sub_targ_vecs) ) && !( !sub_vecs && !sub_targ_vecs )
500 ,
"SPMD_apply_op(...): Error, invalid arguments num_vecs = " << num_vecs
501 <<
", sub_vecs = " << sub_vecs <<
", num_targ_vecs = " << num_targ_vecs
502 <<
", sub_targ_vecs = " << sub_targ_vecs
511 Workspace<Teuchos::RCP<ReductTarget> >
512 i_reduct_objs( wss, num_cols );
513 for(
int kc = 0; kc < num_cols; ++kc ) {
514 i_reduct_objs[kc] = op.reduct_obj_create();
515 if( ( sub_vecs || sub_targ_vecs ) && localSubDim ) {
517 arrayView(sub_vecs+kc*num_vecs, num_vecs),
518 arrayView(sub_targ_vecs+kc*num_targ_vecs, num_targ_vecs),
519 i_reduct_objs[kc].ptr()
525 *out <<
"\nIntermediate reduction objects in this process before global reduction:\n";
526 Teuchos::OSTab tab2(out);
527 for(
int kc = 0; kc < num_cols; ++kc ) {
529 <<
"\ni_reduct_objs["<<kc<<
"] =\n"
530 << describe(*i_reduct_objs[kc],Teuchos::VERB_EXTREME);
537 Workspace<const ReductTarget*>
538 _i_reduct_objs( wss, num_cols );
539 for(
int kc = 0; kc < num_cols; ++kc ) {
540 _i_reduct_objs[kc] = &*i_reduct_objs[kc];
544 *out <<
"\nPerforming global reduction ...\n";
551 if( num_targ_vecs && sub_targ_vecs ) {
552 *out <<
"\nInput/output vectors *after* transforamtion:\n";
553 Teuchos::OSTab tab2(out);
554 for(
int kc = 0; kc < num_cols; ++kc ) {
555 for(
int k = 0; k < num_targ_vecs; ++k ) {
556 *out <<
"\nvecs["<<kc<<
","<<k<<
"] =\n";
557 print(sub_targ_vecs[kc*num_targ_vecs+k],*out);
562 *out <<
"\nInput/output reduction objects *after* reduction:\n";
563 Teuchos::OSTab tab2(out);
564 for(
int kc = 0; kc < num_cols; ++kc ) {
566 <<
"\nreduct_objs["<<kc<<
"] =\n"
567 << describe(*reduct_objs[kc],Teuchos::VERB_EXTREME);
570 *out <<
"\nLeaving RTOpPack::SPMD_apply_op(...) ...\n";
void SPMD_apply_op(const Teuchos::Comm< index_type > *comm, const RTOpT< Scalar > &op, const int num_vecs, const ConstSubVectorView< Scalar > sub_vecs[], const int num_targ_vecs, const SubVectorView< Scalar > targ_sub_vecs[], ReductTarget *reduct_obj)
Apply an RTOp in SMPD mode to a set of vectors with contiguous storage per process.