//! \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]); }
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; }