KokkosBlas::dot¶
Defined in header: KokkosBlas1_dot.hpp
template <class execution_space, class XVector, class YVector>
typename Kokkos::Details::InnerProductSpaceTraits<typename XVector::non_const_value_type>::dot_type
dot(const execution_space& space, const XVector& x, const YVector& y);
template <class XVector, class YVector>
typename Kokkos::Details::InnerProductSpaceTraits<typename XVector::non_const_value_type>::dot_type
dot(const XVector& x, const YVector& y);
template <class execution_space, class RV, class XMV, class YMV>
void dot(const execution_space& space, const RV& R, const XMV& X, const YMV& Y);
template <class RV, class XMV, class YMV>
void dot(const RV& R, const XMV& X, const YMV& Y);
Computes the inner product of vector(s) X with vector(s) Y.
Iterate over the entries of
Xand multiply them (or their conjugate) by the corresponding entry inY, accumulate the results and fencespaceIterate over the entries of
Xand multiply them (or their conjugate) by the corresponding entry inY, accumulate the results and fence the default instance oftypename XVector::execution_spaceIterate over the entries of
Xand multiply them (or their conjugate) by the corresponding entry inY, accumulate the results inRusing the resources specified byspaceIterate over the entries of
Xand multiply them (or their conjugate) by the corresponding entry inY, accumulate the results inRusing the resources specified by the default instance oftypename XVector::execution_space
- The function will throw a runtime exception if any of the following conditions are not met
X.extent(0) == Y.extent(0)X.extent(1) = 1 || Y.extent(1) || X.extent(1) == Y.extent(1)R.extent(0) = max(X.extent(1), Y.extent(1))
The result (returned or stored value) is undefined if X has no entries.
Parameters¶
- space:
execution space instance that specifies the resources and stream/queue used to execute this kernel
- R:
computed inner products
- X, Y:
vectors used to compute the inner products
Type Requirements¶
execution_space must be a Kokkos execution space
XVector must be a Kokkos View of rank 1 that satisfies
Kokkos::SpaceAccessibility<execution_space, typename XVector::memory_space>::accessible == true
YVector must be a Kokkos View of rank 1 that satisfies
Kokkos::SpaceAccessibility<execution_space, typename YVector::memory_space>::accessible == true
XMV must be a Kokkos View of rank 1 or 2 that satisfies
Kokkos::SpaceAccessibility<execution_space, typename XMV::memory_space>::accessible == true
YMV must be a Kokkos View of rank 1 or 2 that satisfies
Kokkos::SpaceAccessibility<execution_space, typename YMV::memory_space>::accessible == true
RV must be a Kokkos View of rank 0 or 1 that satisfies
Kokkos::SpaceAccessibility<execution_space, typename RV::memory_space>::accessible == truestd::is_same_v<typename RV::value_type, typename RV::non_const_value_type> == true
Example¶
#include <iostream>
#include <Kokkos_Core.hpp>
#include <KokkosBlas1_dot.hpp>
int main(int argc, char* argv[]) {
Kokkos::initialize();
{
int N = 100;
if (argc >= 2) {
N = atoi(argv[1]);
}
Kokkos::View<double*> x("X", N);
Kokkos::View<double*> y("Y", N);
Kokkos::deep_copy(x, 3.0);
Kokkos::deep_copy(y, 2.0);
double x_y = KokkosBlas::dot(x, y);
std::cout << "X_dot_Y: " << x_y << " Expected: " << 1.0 * N * (3.0 * 2.0)
<< " Diff: " << x_y - 1.0 * N * (3.0 * 2.0) << std::endl;
}
Kokkos::finalize();
}
output:
X_dot_Y: 600 Expected: 600 Diff: 0