| 769 | } |
| 770 | |
| 771 | void seissol::initializer::MemoryManager::initializeMemoryLayout() |
| 772 | { |
| 773 | // correct LTS-information in the ghost layer |
| 774 | correctGhostRegionSetups(); |
| 775 | |
| 776 | // derive the layouts of the layers |
| 777 | deriveLayerLayouts(); |
| 778 | |
| 779 | for (unsigned tc = 0; tc < m_ltsTree.numChildren(); ++tc) { |
| 780 | TimeCluster& cluster = m_ltsTree.child(tc); |
| 781 | |
| 782 | size_t l_ghostSize = 0; |
| 783 | size_t l_copySize = 0; |
| 784 | size_t l_interiorSize = 0; |
| 785 | #ifdef USE_MPI |
| 786 | for( unsigned int l_region = 0; l_region < m_meshStructure[tc].numberOfRegions; l_region++ ) { |
| 787 | l_ghostSize += sizeof(real) * tensor::Q::size() * m_numberOfGhostRegionBuffers[tc][l_region]; |
| 788 | l_ghostSize += sizeof(real) * yateto::computeFamilySize<tensor::dQ>() * m_numberOfGhostRegionDerivatives[tc][l_region]; |
| 789 | |
| 790 | l_copySize += sizeof(real) * tensor::Q::size() * m_numberOfCopyRegionBuffers[tc][l_region]; |
| 791 | l_copySize += sizeof(real) * yateto::computeFamilySize<tensor::dQ>() * m_numberOfCopyRegionDerivatives[tc][l_region]; |
| 792 | } |
| 793 | #endif // USE_MPI |
| 794 | l_interiorSize += sizeof(real) * tensor::Q::size() * m_numberOfInteriorBuffers[tc]; |
| 795 | l_interiorSize += sizeof(real) * yateto::computeFamilySize<tensor::dQ>() * m_numberOfInteriorDerivatives[tc]; |
| 796 | |
| 797 | cluster.child<Ghost>().setBucketSize(m_lts.buffersDerivatives, l_ghostSize); |
| 798 | cluster.child<Copy>().setBucketSize(m_lts.buffersDerivatives, l_copySize); |
| 799 | cluster.child<Interior>().setBucketSize(m_lts.buffersDerivatives, l_interiorSize); |
| 800 | } |
| 801 | |
| 802 | deriveFaceDisplacementsBucket(); |
| 803 | |
| 804 | m_ltsTree.allocateBuckets(); |
| 805 | |
| 806 | // initialize the internal state |
| 807 | initializeBuffersDerivatives(); |
| 808 | |
| 809 | // initialize face neighbors |
| 810 | for (unsigned tc = 0; tc < m_ltsTree.numChildren(); ++tc) { |
| 811 | TimeCluster& cluster = m_ltsTree.child(tc); |
| 812 | #ifdef USE_MPI |
| 813 | initializeFaceNeighbors(tc, cluster.child<Copy>()); |
| 814 | #endif |
| 815 | initializeFaceNeighbors(tc, cluster.child<Interior>()); |
| 816 | } |
| 817 | |
| 818 | #ifdef ACL_DEVICE |
| 819 | void* stream = device::DeviceInstance::getInstance().api->getDefaultStream(); |
| 820 | for (auto& layer : m_ltsTree.leaves()) { |
| 821 | if (layer.getBucketSize(m_lts.buffersDerivatives) > 0) { |
| 822 | void* data = layer.bucket(m_lts.buffersDerivatives, seissol::initializer::AllocationPlace::Device); |
| 823 | device::DeviceInstance::getInstance().algorithms.touchMemory( |
| 824 | reinterpret_cast<real*>(data), |
| 825 | layer.getBucketSize(m_lts.buffersDerivatives) / sizeof(real), |
| 826 | true, stream); |
| 827 | } |
| 828 | } |
no test coverage detected