diff --git a/packages/stokhos/src/sacado/kokkos/vector/belos/Belos_TpetraAdapter_MP_Vector.hpp b/packages/stokhos/src/sacado/kokkos/vector/belos/Belos_TpetraAdapter_MP_Vector.hpp index 9987be272f92..549971d79fb2 100644 --- a/packages/stokhos/src/sacado/kokkos/vector/belos/Belos_TpetraAdapter_MP_Vector.hpp +++ b/packages/stokhos/src/sacado/kokkos/vector/belos/Belos_TpetraAdapter_MP_Vector.hpp @@ -324,6 +324,38 @@ namespace Belos { return mv.isConstantStride (); } + template + static void deep_copy_2d_view_with_intercessory_space( + const DstType& dst, + const SrcType& src + ) + { + if (std::is_same::value) + { + auto dst_i = Kokkos::create_mirror(dst); + for (size_t i = 0; i < src.extent(0); i++) + { + for (size_t j = 0; j < src.extent(1); j++) + { + dst_i(i, j) = src(i, j); + } + } + Kokkos::deep_copy(dst, dst_i); + } + else + { + auto src_i = Kokkos::create_mirror(src); + Kokkos::deep_copy(src_i, src); + for (size_t i = 0; i < src.extent(0); i++) + { + for (size_t j = 0; j < src.extent(1); j++) + { + dst(i, j) = src_i(i, j); + } + } + } + } + static void MvTimesMatAddMv (const dot_type& alpha, const Tpetra::MultiVector& A, @@ -372,7 +404,15 @@ namespace Belos { typedef Kokkos::View b_1d_view_type; b_1d_view_type B_1d_view_dev(Kokkos::ViewAllocateWithoutInitializing("B"), numRowsB*numColsB); b_view_type B_view_dev( B_1d_view_dev.data(), numRowsB, numColsB); - Kokkos::deep_copy(B_view_dev, B_view_host); + + if (Kokkos::SpaceAccessibility::accessible) + { + Kokkos::deep_copy(B_view_dev, B_view_host); + } + else + { + deep_copy_2d_view_with_intercessory_space(B_view_dev, B_view_host); + } // Do local multiply { @@ -499,16 +539,34 @@ namespace Belos { // reduce across processors -- could check for RDMA RCP > pcomm = A.getMap()->getComm (); if (pcomm->getSize () == 1) - Kokkos::deep_copy(C_view_host, C_view_dev); - else { + { + if (Kokkos::SpaceAccessibility::accessible) + { + Kokkos::deep_copy(C_view_host, C_view_dev); + } + else + { + deep_copy_2d_view_with_intercessory_space(C_view_host, C_view_dev); + } + } + else + { typedef Kokkos::View c_1d_host_view_type; c_1d_host_view_type C_1d_view_tmp(Kokkos::ViewAllocateWithoutInitializing("C_tmp"), strideC*numColsC); - c_host_view_type C_view_tmp( C_1d_view_tmp.data(), - strideC, numColsC); - Kokkos::deep_copy(Kokkos::subview(C_view_tmp, - Kokkos::pair(0,numRowsC), - Kokkos::pair(0,numColsC)) , - C_view_dev); + c_host_view_type C_view_tmp_input( C_1d_view_tmp.data(), strideC, numColsC); + auto C_view_tmp = Kokkos::subview(C_view_tmp_input, + Kokkos::pair(0,numRowsC), + Kokkos::pair(0,numColsC)); + + if (Kokkos::SpaceAccessibility::accessible) + { + Kokkos::deep_copy(C_view_tmp, C_view_dev); + } + else + { + deep_copy_2d_view_with_intercessory_space(C_view_tmp, C_view_dev); + } + reduceAll (*pcomm, REDUCE_SUM, strideC*numColsC, C_view_tmp.data(), C_view_host.data()); diff --git a/packages/stokhos/test/UnitTest/Stokhos_TpetraCrsMatrixMPVectorUnitTest.hpp b/packages/stokhos/test/UnitTest/Stokhos_TpetraCrsMatrixMPVectorUnitTest.hpp index deb7e1e7c528..fd920498f37e 100644 --- a/packages/stokhos/test/UnitTest/Stokhos_TpetraCrsMatrixMPVectorUnitTest.hpp +++ b/packages/stokhos/test/UnitTest/Stokhos_TpetraCrsMatrixMPVectorUnitTest.hpp @@ -156,20 +156,20 @@ TEUCHOS_UNIT_TEST_TEMPLATE_4_DECL( // Fill vectors RCP x1 = Tpetra::createVector(map); RCP x2 = Tpetra::createVector(map); - ArrayRCP x1_view = x1->get1dViewNonConst(); - ArrayRCP x2_view = x2->get1dViewNonConst(); - Scalar val1(VectorSize, BaseScalar(0.0)), val2(VectorSize, BaseScalar(0.0)); - for (size_t i=0; i(nrow, VectorSize, row, j); - val2.fastAccessCoeff(j) = 0.12345 * generate_vector_coefficient(nrow, VectorSize, row, j); + { + auto x1_view = x1->getLocalViewHost(Tpetra::Access::OverwriteAll); + auto x2_view = x2->getLocalViewHost(Tpetra::Access::OverwriteAll); + Scalar val1(VectorSize, BaseScalar(0.0)), val2(VectorSize, BaseScalar(0.0)); + for (size_t i=0; i(nrow, VectorSize, row, j); + val2.fastAccessCoeff(j) = 0.12345 * generate_vector_coefficient(nrow, VectorSize, row, j); + } + x1_view(i,0) = val1; + x2_view(i,0) = val2; } - x1_view[i] = val1; - x2_view[i] = val2; } - x1_view = Teuchos::null; - x2_view = Teuchos::null; // Add Scalar alpha = 2.1; @@ -181,7 +181,7 @@ TEUCHOS_UNIT_TEST_TEMPLATE_4_DECL( // Teuchos::VERB_EXTREME); // Check - ArrayRCP y_view = y->get1dViewNonConst(); + auto y_view = y->getLocalViewHost(Tpetra::Access::ReadOnly); Scalar val(VectorSize, BaseScalar(0.0)); BaseScalar tol = 1.0e-14; for (size_t i=0; i x1 = Tpetra::createVector(map); RCP x2 = Tpetra::createVector(map); - ArrayRCP x1_view = x1->get1dViewNonConst(); - ArrayRCP x2_view = x2->get1dViewNonConst(); - Scalar val1(VectorSize, BaseScalar(0.0)), val2(VectorSize, BaseScalar(0.0)); - for (size_t i=0; i(nrow, VectorSize, row, j); - val2.fastAccessCoeff(j) = 0.12345 * generate_vector_coefficient(nrow, VectorSize, row, j); + { + auto x1_view = x1->getLocalViewHost(Tpetra::Access::OverwriteAll); + auto x2_view = x2->getLocalViewHost(Tpetra::Access::OverwriteAll); + Scalar val1(VectorSize, BaseScalar(0.0)), val2(VectorSize, BaseScalar(0.0)); + for (size_t i=0; i(nrow, VectorSize, row, j); + val2.fastAccessCoeff(j) = 0.12345 * generate_vector_coefficient(nrow, VectorSize, row, j); + } + x1_view(i,0) = val1; + x2_view(i,0) = val2; } - x1_view[i] = val1; - x2_view[i] = val2; } - x1_view = Teuchos::null; - x2_view = Teuchos::null; // Dot product dot_type dot = x1->dot(*x2); @@ -337,26 +337,26 @@ TEUCHOS_UNIT_TEST_TEMPLATE_4_DECL( size_t ncol = 5; RCP x1 = Tpetra::createMultiVector(map, ncol); RCP x2 = Tpetra::createMultiVector(map, ncol); - ArrayRCP< ArrayRCP > x1_view = x1->get2dViewNonConst(); - ArrayRCP< ArrayRCP > x2_view = x2->get2dViewNonConst(); - Scalar val1(VectorSize, BaseScalar(0.0)), val2(VectorSize, BaseScalar(0.0)); - for (size_t i=0; i( - nrow, ncol, VectorSize, row, j, k); - val1.fastAccessCoeff(k) = v; - val2.fastAccessCoeff(k) = 0.12345 * v; + { + auto x1_view = x1->getLocalViewHost(Tpetra::Access::OverwriteAll); + auto x2_view = x2->getLocalViewHost(Tpetra::Access::OverwriteAll); + Scalar val1(VectorSize, BaseScalar(0.0)), val2(VectorSize, BaseScalar(0.0)); + for (size_t i=0; i( + nrow, ncol, VectorSize, row, j, k); + val1.fastAccessCoeff(k) = v; + val2.fastAccessCoeff(k) = 0.12345 * v; + } + x1_view(i,j) = val1; + x2_view(i,j) = val2; } - x1_view[j][i] = val1; - x2_view[j][i] = val2; } } - x1_view = Teuchos::null; - x2_view = Teuchos::null; - + // Add Scalar alpha = 2.1; Scalar beta = 3.7; @@ -367,7 +367,7 @@ TEUCHOS_UNIT_TEST_TEMPLATE_4_DECL( // Teuchos::VERB_EXTREME); // Check - ArrayRCP< ArrayRCP > y_view = y->get2dViewNonConst(); + auto y_view = y->getLocalViewHost(Tpetra::Access::ReadOnly); Scalar val(VectorSize, BaseScalar(0.0)); BaseScalar tol = 1.0e-14; for (size_t i=0; i x1 = Tpetra::createMultiVector(map, ncol); RCP x2 = Tpetra::createMultiVector(map, ncol); - ArrayRCP< ArrayRCP > x1_view = x1->get2dViewNonConst(); - ArrayRCP< ArrayRCP > x2_view = x2->get2dViewNonConst(); - Scalar val1(VectorSize, BaseScalar(0.0)), val2(VectorSize, BaseScalar(0.0)); - for (size_t i=0; i( - nrow, ncol, VectorSize, row, j, k); - val1.fastAccessCoeff(k) = v; - val2.fastAccessCoeff(k) = 0.12345 * v; + { + auto x1_view = x1->getLocalViewHost(Tpetra::Access::OverwriteAll); + auto x2_view = x2->getLocalViewHost(Tpetra::Access::OverwriteAll); + Scalar val1(VectorSize, BaseScalar(0.0)), val2(VectorSize, BaseScalar(0.0)); + for (size_t i=0; i( + nrow, ncol, VectorSize, row, j, k); + val1.fastAccessCoeff(k) = v; + val2.fastAccessCoeff(k) = 0.12345 * v; + } + x1_view(i,j) = val1; + x2_view(i,j) = val2; } - x1_view[j][i] = val1; - x2_view[j][i] = val2; } } - x1_view = Teuchos::null; - x2_view = Teuchos::null; // Dot product Array dots(ncol); @@ -540,25 +540,25 @@ TEUCHOS_UNIT_TEST_TEMPLATE_4_DECL( size_t ncol = 5; RCP x1 = Tpetra::createMultiVector(map, ncol); RCP x2 = Tpetra::createMultiVector(map, ncol); - ArrayRCP< ArrayRCP > x1_view = x1->get2dViewNonConst(); - ArrayRCP< ArrayRCP > x2_view = x2->get2dViewNonConst(); - Scalar val1(VectorSize, BaseScalar(0.0)), val2(VectorSize, BaseScalar(0.0)); - for (size_t i=0; i( - nrow, ncol, VectorSize, row, j, k); - val1.fastAccessCoeff(k) = v; - val2.fastAccessCoeff(k) = 0.12345 * v; + { + auto x1_view = x1->getLocalViewHost(Tpetra::Access::OverwriteAll); + auto x2_view = x2->getLocalViewHost(Tpetra::Access::OverwriteAll); + Scalar val1(VectorSize, BaseScalar(0.0)), val2(VectorSize, BaseScalar(0.0)); + for (size_t i=0; i( + nrow, ncol, VectorSize, row, j, k); + val1.fastAccessCoeff(k) = v; + val2.fastAccessCoeff(k) = 0.12345 * v; + } + x1_view(i,j) = val1; + x2_view(i,j) = val2; } - x1_view[j][i] = val1; - x2_view[j][i] = val2; } } - x1_view = Teuchos::null; - x2_view = Teuchos::null; // Get subviews size_t ncol_sub = 2; @@ -700,15 +700,16 @@ TEUCHOS_UNIT_TEST_TEMPLATE_4_DECL( // Fill vector RCP x = Tpetra::createVector(map); - ArrayRCP x_view = x->get1dViewNonConst(); - for (size_t i=0; i( - nrow, VectorSize, row, j); - x_view[i] = val; + { + auto x_view = x->getLocalViewHost(Tpetra::Access::OverwriteAll); + for (size_t i=0; i( + nrow, VectorSize, row, j); + x_view(i,0) = val; + } } - x_view = Teuchos::null; // matrix->describe(*(Teuchos::fancyOStream(rcp(&std::cout,false))), // Teuchos::VERB_EXTREME); @@ -724,7 +725,7 @@ TEUCHOS_UNIT_TEST_TEMPLATE_4_DECL( // Teuchos::VERB_EXTREME); // Check - ArrayRCP y_view = y->get1dViewNonConst(); + auto y_view = y->getLocalViewHost(Tpetra::Access::ReadOnly); BaseScalar tol = 1.0e-14; for (size_t i=0; i x = Tpetra::createMultiVector(map, ncol); - ArrayRCP< ArrayRCP > x_view = x->get2dViewNonConst(); - for (size_t i=0; i( - nrow, ncol, VectorSize, row, j, k); - val.fastAccessCoeff(k) = v; + { + auto x_view = x->getLocalViewHost(Tpetra::Access::OverwriteAll); + for (size_t i=0; i( + nrow, ncol, VectorSize, row, j, k); + val.fastAccessCoeff(k) = v; + } + x_view(i,j) = val; } - x_view[j][i] = val; } } - x_view = Teuchos::null; // matrix->describe(*(Teuchos::fancyOStream(rcp(&std::cout,false))), // Teuchos::VERB_EXTREME); @@ -851,7 +853,7 @@ TEUCHOS_UNIT_TEST_TEMPLATE_4_DECL( // Teuchos::VERB_EXTREME); // Check - ArrayRCP< ArrayRCP > y_view = y->get2dViewNonConst(); + auto y_view = y->getLocalViewHost(Tpetra::Access::ReadOnly); BaseScalar tol = 1.0e-14; for (size_t i=0; i x = Tpetra::createVector(map); - ArrayRCP x_view = x->get1dViewNonConst(); - for (size_t i=0; i( - nrow, VectorSize, row, j); - x_view[i] = val; + { + auto x_view = x->getLocalViewHost(Tpetra::Access::OverwriteAll); + for (size_t i=0; i( + nrow, VectorSize, row, j); + x_view(i,0) = val; + } } // Multiply @@ -980,25 +984,27 @@ TEUCHOS_UNIT_TEST_TEMPLATE_4_DECL( // Multiply with flattened matix RCP y2 = Tpetra::createVector(map); - RCP flat_x = - Stokhos::create_flat_vector_view(*x, flat_x_map); - RCP flat_y = - Stokhos::create_flat_vector_view(*y2, flat_y_map); - flat_matrix->apply(*flat_x, *flat_y); + { + RCP flat_x = + Stokhos::create_flat_vector_view(*x, flat_x_map); + RCP flat_y = + Stokhos::create_flat_vector_view(*y2, flat_y_map); + flat_matrix->apply(*flat_x, *flat_y); + } // flat_y->describe(*(Teuchos::fancyOStream(rcp(&std::cout,false))), // Teuchos::VERB_EXTREME); // Check BaseScalar tol = 1.0e-14; - ArrayRCP y_view = y->get1dViewNonConst(); - ArrayRCP y2_view = y2->get1dViewNonConst(); + auto y_view = y-> getLocalViewHost(Tpetra::Access::ReadOnly); + auto y2_view = y2->getLocalViewHost(Tpetra::Access::ReadOnly); for (size_t i=0; i b = Tpetra::createVector(map); - ArrayRCP b_view = b->get1dViewNonConst(); - Scalar b_val(VectorSize, BaseScalar(0.0)); - for (LocalOrdinal j=0; jgetLocalViewHost(Tpetra::Access::OverwriteAll); + b_val = Scalar(VectorSize, BaseScalar(0.0)); + for (LocalOrdinal j=0; j x_view = x->get1dViewNonConst(); + auto x_view = x->getLocalViewHost(Tpetra::Access::ReadOnly); Scalar val(VectorSize, BaseScalar(0.0)); for (size_t i=0; i b = Tpetra::createVector(map); - ArrayRCP b_view = b->get1dViewNonConst(); - Scalar b_val(VectorSize, BaseScalar(0.0)); - for (LocalOrdinal j=0; jgetLocalViewHost(Tpetra::Access::OverwriteAll); + b_val = Scalar(VectorSize, BaseScalar(0.0)); + for (LocalOrdinal j=0; j x_view = x->get1dViewNonConst(); + auto x_view = x->getLocalViewHost(Tpetra::Access::ReadOnly); Scalar val(VectorSize, BaseScalar(0.0)); for (size_t i=0; i b = Tpetra::createVector(map); - ArrayRCP b_view = b->get1dViewNonConst(); - for (size_t i=0; igetLocalViewHost(Tpetra::Access::OverwriteAll); + for (size_t i=0; i x_view = x->get1dViewNonConst(); + auto x_view = x->getLocalViewHost(Tpetra::Access::ReadOnly); for (size_t i=0; i b = Tpetra::createVector(map); - ArrayRCP b_view = b->get1dViewNonConst(); - for (size_t i=0; i 0) - b_view[i].fastAccessCoeff(j) = BaseScalar(row+1); + { + auto b_view = b->getLocalViewHost(Tpetra::Access::OverwriteAll); + for (size_t i=0; i 0) + b_view(i,0).fastAccessCoeff(j) = BaseScalar(row+1); + } } - + // Solve typedef Teuchos::ScalarTraits ST; #ifdef HAVE_STOKHOS_ENSEMBLE_REDUCT @@ -1617,10 +1633,10 @@ TEUCHOS_UNIT_TEST_TEMPLATE_4_DECL( // [ 0, 0, ..., 1, 1, 1] // ... tol = 1000*tol; - ArrayRCP x_view = x->get1dViewNonConst(); + auto x_view = x->getLocalViewHost(Tpetra::Access::ReadOnly); for (size_t i=0; i b = Tpetra::createVector(map); - ArrayRCP b_view = b->get1dViewNonConst(); - for (size_t i=0; i 0) - b_view[i].fastAccessCoeff(j) = BaseScalar(row+1); + { + auto b_view = b->getLocalViewHost(Tpetra::Access::OverwriteAll); + for (size_t i=0; i 0) + b_view(i,0).fastAccessCoeff(j) = BaseScalar(row+1); + } } // Solve @@ -1771,10 +1789,10 @@ TEUCHOS_UNIT_TEST_TEMPLATE_4_DECL( // [ 0, 0, ..., 1, 1, 1] // ... tol = 1000*tol; - ArrayRCP x_view = x->get1dViewNonConst(); + auto x_view = x->getLocalViewHost(Tpetra::Access::ReadOnly); for (size_t i=0; i b = Tpetra::createVector(map); - ArrayRCP b_view = b->get1dViewNonConst(); - for (size_t i=0; i 0) - b_view[i].fastAccessCoeff(j) = BaseScalar(row+1); + { + auto b_view = b->getLocalViewHost(Tpetra::Access::OverwriteAll); + for (size_t i=0; i 0) + b_view(i,0).fastAccessCoeff(j) = BaseScalar(row+1); + } } // Solve @@ -1925,10 +1945,10 @@ TEUCHOS_UNIT_TEST_TEMPLATE_4_DECL( // [ 0, 0, ..., 1, 1, 1] // ... tol = 1000*tol; - ArrayRCP x_view = x->get1dViewNonConst(); + auto x_view = x->getLocalViewHost(Tpetra::Access::ReadOnly); for (size_t i=0; i b = Tpetra::createVector(map); - ArrayRCP b_view = b->get1dViewNonConst(); - for (size_t i=0; igetLocalViewHost(Tpetra::Access::OverwriteAll); + for (size_t i=0; i x_view = x->get1dViewNonConst(); + auto x_view = x->getLocalViewHost(Tpetra::Access::ReadOnly); for (size_t i=0; i b = Tpetra::createVector(map); - ArrayRCP b_view = b->get1dViewNonConst(); - Scalar b_val(VectorSize, BaseScalar(0.0)); - for (LocalOrdinal j=0; jgetLocalViewHost(Tpetra::Access::OverwriteAll); + b_val = Scalar(VectorSize, BaseScalar(0.0)); + for (LocalOrdinal j=0; j x_view = x->get1dViewNonConst(); + auto x_view = x->getLocalViewHost(Tpetra::Access::ReadOnly); Scalar val(VectorSize, BaseScalar(0.0)); for (size_t i=0; i b = Tpetra::createVector(map); - ArrayRCP b_view = b->get1dViewNonConst(); - Scalar b_val(VectorSize, BaseScalar(0.0)); - for (LocalOrdinal j=0; jgetLocalViewHost(Tpetra::Access::OverwriteAll); + b_val = Scalar(VectorSize, BaseScalar(0.0)); + for (LocalOrdinal j=0; j ST; typename ST::magnitudeType tol = 1e-9; - ArrayRCP x_view = x->get1dViewNonConst(); + auto x_view = x->getLocalViewHost(Tpetra::Access::ReadOnly); Scalar val(VectorSize, BaseScalar(0.0)); for (size_t i=0; i