//! \brief Return a const view of a buffer for use on the host.
 template <class T> inline
 ArrayRCP<const T> viewBuffer(size_t size, ArrayRCP<const T> buff) {
   if (isHostNode == false) {
     CHECK_COMPUTE_BUFFER(buff);
   }
   return buff.persistingView(0,size);
 }
 //! \brief Return a non-const view of a buffer for use on the host.
 template <class T> inline
 ArrayRCP<T> viewBufferNonConst(ReadWriteOption rw, size_t size, const ArrayRCP<T> &buff) {
   (void) rw; // Silence "unused parameter" compiler warning
   if (isHostNode == false) {
     CHECK_COMPUTE_BUFFER(buff);
   }
   return buff.persistingView(0,size);
 }
  void setMap_PartsForRank(ArrayRCP<int> &idx, ArrayRCP<part_t> &parts) {
    nRanks = idx.size() - 1;
    nParts = parts.size();

    // Need data stored in unordered_map; create it
    rankForPart = rcp(new rankmap_t(idx[nRanks]));

    maxPart = 0;
    for (int i = 0; i < nRanks; i++) {
      for (part_t j = idx[i]; j < idx[i+1]; j++) {
        (*rankForPart)[parts[j]] = i;
        if (parts[j] > maxPart) maxPart = parts[j];
      }
    }

    // Parts for this rank are already contiguous in parts arcp.  
    // Keep a view of them.
    partsForRank = parts.persistingView(idx[myRank],idx[myRank+1]-idx[myRank]);
  }
Esempio n. 4
0
  template <class T> inline
  ArrayRCP<T> 
  CUDANodeMemoryModel::viewBufferNonConst(ReadWriteOption rw, size_t size, const ArrayRCP<T> &buff) {
    CHECK_COMPUTE_BUFFER(buff);
    // Create a copy-back deallocator that copies back to buff.
    CUDANodeCopyBackDeallocator<T> dealloc(buff.persistingView(0,size), rcpFromRef(*this));
    // It allocates a host buffer with the appropriate deallocator embedded.
    ArrayRCP<T> hostBuff = dealloc.alloc();
    if (rw == ReadWrite) {
#ifdef HAVE_KOKKOSCLASSIC_CUDA_NODE_MEMORY_TRACE
      std::cerr << "viewBufferNonConst(ReadWrite) -> ";
#endif
      this->template copyFromBuffer<T>(size, buff, hostBuff());
    }  
    else {
#ifdef HAVE_KOKKOSCLASSIC_CUDA_NODE_MEMORY_TRACE
      std::cerr << "viewBufferNonConst(WriteOnly)" << std::endl;
#endif
    }
    // else rw == WriteOnly, and we need no copy
    return hostBuff;
  }