/usr/include/trilinos/Kokkos_StandardNodeMemoryModel.hpp is in libtrilinos-dev 10.4.0.dfsg-1ubuntu2.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
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 | #ifndef KOKKOS_STANDARD_NODE_MEMORY_MODEL_HPP_
#define KOKKOS_STANDARD_NODE_MEMORY_MODEL_HPP_
#include "Kokkos_NodeAPIConfigDefs.hpp"
#include "Kokkos_BufferMacros.hpp"
#include <cstdlib>
#include <algorithm>
#include <Teuchos_ArrayRCP.hpp>
#include <Teuchos_ArrayView.hpp>
namespace Kokkos {
/*! A default implementation of the Node memory architecture for Node with a single memory space. */
class StandardNodeMemoryModel {
public:
typedef std::size_t size_t;
//@{ Memory management
/*! \brief Allocate a parallel buffer, returning it as a pointer ecnapsulated in an ArrayRCP.
Dereferencing the returned ArrayRCP or its underlying pointer in general results in undefined
behavior outside of parallel computations.
The buffer will be automatically freed by the Node when no more references remain.
@tparam T The data type of the allocate buffer. This is used to perform alignment and determine the number of bytes to allocate.
@param[in] size The size requested for the parallel buffer, greater than zero.
\post The method will return an ArrayRCP encapsulating a pointer. The underlying pointer may be used in parallel computation routines,
and is guaranteed to have size large enough to reference \c size number of entries of type \c T.
*/
template <class T> inline
Teuchos::ArrayRCP<T> allocBuffer(size_t size) {
Teuchos::ArrayRCP<T> buff;
if (size > 0) {
buff = Teuchos::arcp<T>(size);
}
MARK_COMPUTE_BUFFER(buff);
return buff;
}
/*! \brief Copy data to host memory from a parallel buffer.
@param[in] size The number of entries to copy from \c buffSrc to \c hostDest.
@param[in] buffSrc The parallel buffer from which to copy.
@param[out] hostDest The location in host memory where the data from \c buffSrc is copied to.
\pre \c size is non-negative.
\pre \c buffSrc has length at least <tt>size</tt>.
\pre \c hostDest has length equal to \c size.
\post On return, entries in the range <tt>[0 , size)</tt> of \c buffSrc have been copied to \c hostDest entries in the range <tt>[0 , size)</tt>.
*/
template <class T> inline
void copyFromBuffer(size_t size, const Teuchos::ArrayRCP<const T> &buffSrc, const Teuchos::ArrayView<T> &hostDest) {
CHECK_COMPUTE_BUFFER(buffSrc);
Teuchos::ArrayRCP<T> buffDest = Teuchos::arcpFromArrayView(hostDest);
copyBuffers(size,buffSrc,buffDest);
}
/*! \brief Copy data to host memory from a parallel buffer.
@param[in] size The number of entries to copy from \c hostSrc to \c buffDest.
@param[in] hostSrc The location in host memory from where the data is copied.
@param[out] buffDest The parallel buffer to which the data is copied.
\pre \c size is non-negative.
\pre \c hostSrc has length equal to \c size.
\pre \c buffSrc has length at least <tt>size</tt>.
\post On return, entries in the range <tt>[0 , size)</tt> of \c hostSrc are allowed to be written to. The data is guaranteed to be present in \c buffDest before it is used in a parallel computation.
*/
template <class T> inline
void copyToBuffer(size_t size, const Teuchos::ArrayView<const T> &hostSrc, const Teuchos::ArrayRCP<T> &buffDest) {
CHECK_COMPUTE_BUFFER(buffDest);
Teuchos::ArrayRCP<const T> buffSrc = Teuchos::arcpFromArrayView(hostSrc);
copyBuffers<T>(size,buffSrc,buffDest);
}
/*! \brief Copy data between buffers.
@param[in] size The size of the copy, greater than zero.
@param[in] buffSrc The source buffer, with length at least as large as \c size.
@param[in,out] buffDest The destination buffer, with length at least as large as \c size.
\post The data is guaranteed to have been copied before any other usage of buffSrc or buffDest occurs.
*/
template <class T> inline
void copyBuffers(size_t size, const Teuchos::ArrayRCP<const T> &buffSrc, const Teuchos::ArrayRCP<T> &buffDest) {
CHECK_COMPUTE_BUFFER(buffSrc);
CHECK_COMPUTE_BUFFER(buffDest);
Teuchos::ArrayView<const T> av_src = buffSrc(0,size);
Teuchos::ArrayView<T> av_dst = buffDest(0,size);
std::copy(av_src.begin(),av_src.end(),av_dst.begin());
}
template <class T> inline
Teuchos::ArrayRCP<const T> viewBuffer(size_t size, Teuchos::ArrayRCP<const T> buff) {
CHECK_COMPUTE_BUFFER(buff);
return buff.persistingView(0,size);
}
template <class T> inline
Teuchos::ArrayRCP<T> viewBufferNonConst(ReadWriteOption rw, size_t size, const Teuchos::ArrayRCP<T> &buff) {
CHECK_COMPUTE_BUFFER(buff);
return buff.persistingView(0,size);
}
inline void readyBuffers(Teuchos::ArrayView<Teuchos::ArrayRCP<const char> > buffers, Teuchos::ArrayView<Teuchos::ArrayRCP<char> > ncBuffers) {
#ifdef HAVE_KOKKOS_DEBUG
for (size_t i=0; i < buffers.size(); ++i) {
CHECK_COMPUTE_BUFFER(buffers[i]);
}
for (size_t i=0; i < ncBuffers.size(); ++i) {
CHECK_COMPUTE_BUFFER(ncBuffers[i]);
}
#endif
(void)buffers;
(void)ncBuffers;
}
//@}
};
} // end of namespace Kokkos
#endif
|