1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247
|
/*
//@HEADER
// ************************************************************************
//
// Kokkos v. 3.0
// Copyright (2020) National Technology & Engineering
// Solutions of Sandia, LLC (NTESS).
//
// Under the terms of Contract DE-NA0003525 with NTESS,
// the U.S. Government retains certain rights in this software.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
// 1. Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
//
// 2. Redistributions in binary form must reproduce the above copyright
// notice, this list of conditions and the following disclaimer in the
// documentation and/or other materials provided with the distribution.
//
// 3. Neither the name of the Corporation nor the names of the
// contributors may be used to endorse or promote products derived from
// this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY NTESS "AS IS" AND ANY
// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL NTESS OR THE
// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//
// Questions? Contact Seher Acer (sacer@sandia.gov)
//
// ************************************************************************
//@HEADER
*/
#ifndef _KOKKOS_SPGEMM_JACOBI_HPP
#define _KOKKOS_SPGEMM_JACOBI_HPP
#include "KokkosKernels_helpers.hpp"
#include "KokkosSparse_spgemm_jacobi_spec.hpp"
namespace KokkosSparse{
namespace Experimental{
template <typename KernelHandle,
typename alno_row_view_t_,
typename alno_nnz_view_t_,
typename ascalar_nnz_view_t_,
typename blno_row_view_t_,
typename blno_nnz_view_t_,
typename bscalar_nnz_view_t_,
typename clno_row_view_t_,
typename clno_nnz_view_t_,
typename cscalar_nnz_view_t_,
typename dinv_view_t_>
void spgemm_jacobi(KernelHandle *handle,
typename KernelHandle::const_nnz_lno_t m,
typename KernelHandle::const_nnz_lno_t n,
typename KernelHandle::const_nnz_lno_t k,
alno_row_view_t_ row_mapA,
alno_nnz_view_t_ entriesA,
ascalar_nnz_view_t_ valuesA,
bool transposeA,
blno_row_view_t_ row_mapB,
blno_nnz_view_t_ entriesB,
bscalar_nnz_view_t_ valuesB,
bool transposeB,
clno_row_view_t_ row_mapC,
clno_nnz_view_t_ &entriesC,
cscalar_nnz_view_t_ &valuesC,
typename cscalar_nnz_view_t_::const_value_type omega,
dinv_view_t_ dinv){
static_assert (std::is_same<typename clno_row_view_t_::value_type,
typename clno_row_view_t_::non_const_value_type>::value,
"KokkosSparse::spgemm_jacobi: Output matrix rowmap must be non-const.");
static_assert (std::is_same<typename clno_nnz_view_t_::value_type,
typename clno_nnz_view_t_::non_const_value_type>::value,
"KokkosSparse::spgemm_jacobi: Output matrix entriesView must be non-const.");
static_assert (std::is_same<typename cscalar_nnz_view_t_::value_type,
typename cscalar_nnz_view_t_::non_const_value_type>::value,
"KokkosSparse::spgemm_jacobi: Output matrix scalar view must be non-const.");
static_assert (std::is_same<typename KernelHandle::const_size_type,
typename alno_row_view_t_::const_value_type>::value,
"KokkosSparse::spgemm_jacobi: Size type of left handside matrix should be same as kernelHandle sizetype.");
static_assert (std::is_same<typename KernelHandle::const_size_type,
typename blno_row_view_t_::const_value_type>::value,
"KokkosSparse::spgemm_jacobi: Size type of right handside matrix should be same as kernelHandle sizetype.");
static_assert (std::is_same<typename KernelHandle::const_size_type,
typename clno_row_view_t_::const_value_type>::value,
"KokkosSparse::spgemm_jacobi: Size type of output matrix should be same as kernelHandle sizetype.");
static_assert (std::is_same<typename KernelHandle::const_nnz_lno_t,
typename alno_nnz_view_t_::const_value_type>::value,
"KokkosSparse::spgemm_jacobi: lno type of left handside matrix should be same as kernelHandle lno_t.");
static_assert (std::is_same<typename KernelHandle::const_nnz_lno_t,
typename blno_nnz_view_t_::const_value_type>::value,
"KokkosSparse::spgemm_jacobi: lno type of right handside matrix should be same as kernelHandle lno_t.");
static_assert (std::is_same<typename KernelHandle::const_nnz_lno_t,
typename clno_nnz_view_t_::const_value_type>::value,
"KokkosSparse::spgemm_jacobi: lno type of output matrix should be same as kernelHandle lno_t.");
static_assert (std::is_same<typename KernelHandle::const_nnz_scalar_t,
typename ascalar_nnz_view_t_::const_value_type>::value,
"KokkosSparse::spgemm_jacobi: scalar type of left handside matrix should be same as kernelHandle scalar.");
static_assert (std::is_same<typename KernelHandle::const_nnz_scalar_t,
typename bscalar_nnz_view_t_::const_value_type>::value,
"KokkosSparse::spgemm_jacobi: scalar type of right handside matrix should be same as kernelHandle scalar.");
static_assert (std::is_same<typename KernelHandle::const_nnz_scalar_t,
typename cscalar_nnz_view_t_::const_value_type>::value,
"KokkosSparse::spgemm_jacobi: scalar type of output matrix should be same as kernelHandle scalar.");
if (transposeA || transposeB){
throw std::runtime_error ("spgemm-jacobi does not support transposed multiply. "
"If you need this case please let kokkos-kernels developers know.\n");
}
typedef typename KernelHandle::const_size_type c_size_t;
typedef typename KernelHandle::const_nnz_lno_t c_lno_t;
typedef typename KernelHandle::const_nnz_scalar_t c_scalar_t;
typedef typename KernelHandle::HandleExecSpace c_exec_t;
typedef typename KernelHandle::HandleTempMemorySpace c_temp_t;
typedef typename KernelHandle::HandlePersistentMemorySpace c_persist_t;
typedef typename Kokkos::Device<c_exec_t, c_temp_t> UniformDevice_t;
typedef typename KokkosKernels::Experimental::KokkosKernelsHandle<c_size_t, c_lno_t, c_scalar_t, c_exec_t, c_temp_t, c_persist_t> const_handle_type;
const_handle_type tmp_handle (*handle);
typedef Kokkos::View<
typename alno_row_view_t_::const_value_type*,
typename KokkosKernels::Impl::GetUnifiedLayout<alno_row_view_t_>::array_layout,
UniformDevice_t,
Kokkos::MemoryTraits<Kokkos::Unmanaged> > Internal_alno_row_view_t_;
typedef Kokkos::View<
typename alno_nnz_view_t_::const_value_type*,
typename KokkosKernels::Impl::GetUnifiedLayout<alno_nnz_view_t_>::array_layout,
UniformDevice_t,
Kokkos::MemoryTraits<Kokkos::Unmanaged> > Internal_alno_nnz_view_t_;
typedef Kokkos::View<
typename ascalar_nnz_view_t_::const_value_type*,
typename KokkosKernels::Impl::GetUnifiedLayout<ascalar_nnz_view_t_>::array_layout,
UniformDevice_t,
Kokkos::MemoryTraits<Kokkos::Unmanaged> > Internal_ascalar_nnz_view_t_;
typedef Kokkos::View<
typename blno_row_view_t_::const_value_type*,
typename KokkosKernels::Impl::GetUnifiedLayout<blno_row_view_t_>::array_layout,
UniformDevice_t,
Kokkos::MemoryTraits<Kokkos::Unmanaged> > Internal_blno_row_view_t_;
typedef Kokkos::View<
typename blno_nnz_view_t_::const_value_type*,
typename KokkosKernels::Impl::GetUnifiedLayout<blno_nnz_view_t_>::array_layout,
UniformDevice_t,
Kokkos::MemoryTraits<Kokkos::Unmanaged> > Internal_blno_nnz_view_t_;
typedef Kokkos::View<
typename bscalar_nnz_view_t_::const_value_type*,
typename KokkosKernels::Impl::GetUnifiedLayout<bscalar_nnz_view_t_>::array_layout,
UniformDevice_t,
Kokkos::MemoryTraits<Kokkos::Unmanaged> > Internal_bscalar_nnz_view_t_;
typedef Kokkos::View<
typename clno_row_view_t_::non_const_value_type*,
typename KokkosKernels::Impl::GetUnifiedLayout<clno_row_view_t_>::array_layout,
UniformDevice_t,
Kokkos::MemoryTraits<Kokkos::Unmanaged> > Internal_clno_row_view_t_;
typedef Kokkos::View<
typename clno_nnz_view_t_::non_const_value_type*,
typename KokkosKernels::Impl::GetUnifiedLayout<clno_nnz_view_t_>::array_layout,
UniformDevice_t,
Kokkos::MemoryTraits<Kokkos::Unmanaged> > Internal_clno_nnz_view_t_;
typedef Kokkos::View<
typename cscalar_nnz_view_t_::non_const_value_type*,
typename KokkosKernels::Impl::GetUnifiedLayout<cscalar_nnz_view_t_>::array_layout,
UniformDevice_t,
Kokkos::MemoryTraits<Kokkos::Unmanaged> > Internal_cscalar_nnz_view_t_;
typedef Kokkos::View<
typename dinv_view_t_::const_value_type**,
typename KokkosKernels::Impl::GetUnifiedLayout<dinv_view_t_>::array_layout,
UniformDevice_t,
Kokkos::MemoryTraits<Kokkos::Unmanaged> > Internal_dinv_view_t_;
Internal_alno_row_view_t_ const_a_r (row_mapA.data(), row_mapA.extent(0));
Internal_alno_nnz_view_t_ const_a_l (entriesA.data(), entriesA.extent(0));
Internal_ascalar_nnz_view_t_ const_a_s (valuesA.data(), valuesA.extent(0));
Internal_blno_row_view_t_ const_b_r (row_mapB.data(), row_mapB.extent(0));
Internal_blno_nnz_view_t_ const_b_l (entriesB.data(), entriesB.extent(0));
Internal_bscalar_nnz_view_t_ const_b_s (valuesB.data(), valuesB.extent(0));
Internal_clno_row_view_t_ nonconst_c_r (row_mapC.data(), row_mapC.extent(0));
Internal_clno_nnz_view_t_ nonconst_c_l (entriesC.data(), entriesC.extent(0));
Internal_cscalar_nnz_view_t_ nonconst_c_s (valuesC.data(), valuesC.extent(0));
Internal_dinv_view_t_ const_d_s (dinv.data(), dinv.extent(0), dinv.extent(1));
KokkosSparse::Impl::SPGEMM_JACOBI<
const_handle_type,
Internal_alno_row_view_t_, Internal_alno_nnz_view_t_, Internal_ascalar_nnz_view_t_,
Internal_blno_row_view_t_, Internal_blno_nnz_view_t_, Internal_bscalar_nnz_view_t_,
Internal_clno_row_view_t_, Internal_clno_nnz_view_t_, Internal_cscalar_nnz_view_t_,
Internal_dinv_view_t_>::
spgemm_jacobi(&tmp_handle, m, n, k,
const_a_r, const_a_l, const_a_s, transposeA,
const_b_r, const_b_l, const_b_s, transposeB,
nonconst_c_r, nonconst_c_l, nonconst_c_s,
omega, const_d_s);
}
}
}
#endif
|