gpu_dyn_inst.cc revision 11534
111308Santhony.gutierrez@amd.com/* 211308Santhony.gutierrez@amd.com * Copyright (c) 2015 Advanced Micro Devices, Inc. 311308Santhony.gutierrez@amd.com * All rights reserved. 411308Santhony.gutierrez@amd.com * 511308Santhony.gutierrez@amd.com * For use for simulation and test purposes only 611308Santhony.gutierrez@amd.com * 711308Santhony.gutierrez@amd.com * Redistribution and use in source and binary forms, with or without 811308Santhony.gutierrez@amd.com * modification, are permitted provided that the following conditions are met: 911308Santhony.gutierrez@amd.com * 1011308Santhony.gutierrez@amd.com * 1. Redistributions of source code must retain the above copyright notice, 1111308Santhony.gutierrez@amd.com * this list of conditions and the following disclaimer. 1211308Santhony.gutierrez@amd.com * 1311308Santhony.gutierrez@amd.com * 2. Redistributions in binary form must reproduce the above copyright notice, 1411308Santhony.gutierrez@amd.com * this list of conditions and the following disclaimer in the documentation 1511308Santhony.gutierrez@amd.com * and/or other materials provided with the distribution. 1611308Santhony.gutierrez@amd.com * 1711308Santhony.gutierrez@amd.com * 3. Neither the name of the copyright holder nor the names of its contributors 1811308Santhony.gutierrez@amd.com * may be used to endorse or promote products derived from this software 1911308Santhony.gutierrez@amd.com * without specific prior written permission. 2011308Santhony.gutierrez@amd.com * 2111308Santhony.gutierrez@amd.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 2211308Santhony.gutierrez@amd.com * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 2311308Santhony.gutierrez@amd.com * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 2411308Santhony.gutierrez@amd.com * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 2511308Santhony.gutierrez@amd.com * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 2611308Santhony.gutierrez@amd.com * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 2711308Santhony.gutierrez@amd.com * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 2811308Santhony.gutierrez@amd.com * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 2911308Santhony.gutierrez@amd.com * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 3011308Santhony.gutierrez@amd.com * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 3111308Santhony.gutierrez@amd.com * POSSIBILITY OF SUCH DAMAGE. 3211308Santhony.gutierrez@amd.com * 3311308Santhony.gutierrez@amd.com * Author: Anthony Gutierrez 3411308Santhony.gutierrez@amd.com */ 3511308Santhony.gutierrez@amd.com 3611308Santhony.gutierrez@amd.com#include "gpu-compute/gpu_dyn_inst.hh" 3711308Santhony.gutierrez@amd.com 3811308Santhony.gutierrez@amd.com#include "debug/GPUMem.hh" 3911308Santhony.gutierrez@amd.com#include "gpu-compute/gpu_static_inst.hh" 4011308Santhony.gutierrez@amd.com#include "gpu-compute/shader.hh" 4111308Santhony.gutierrez@amd.com#include "gpu-compute/wavefront.hh" 4211308Santhony.gutierrez@amd.com 4311308Santhony.gutierrez@amd.comGPUDynInst::GPUDynInst(ComputeUnit *_cu, Wavefront *_wf, 4411308Santhony.gutierrez@amd.com GPUStaticInst *_staticInst, uint64_t instSeqNum) 4511534Sjohn.kalamatianos@amd.com : GPUExecContext(_cu, _wf), addr(computeUnit()->wfSize(), (Addr)0), 4611534Sjohn.kalamatianos@amd.com m_op(Enums::MO_UNDEF), 4711473Santhony.gutierrez@amd.com memoryOrder(Enums::MEMORY_ORDER_NONE), n_reg(0), useContinuation(false), 4811308Santhony.gutierrez@amd.com statusBitVector(0), staticInst(_staticInst), _seqNum(instSeqNum) 4911308Santhony.gutierrez@amd.com{ 5011534Sjohn.kalamatianos@amd.com tlbHitLevel.assign(computeUnit()->wfSize(), -1); 5111534Sjohn.kalamatianos@amd.com d_data = new uint8_t[computeUnit()->wfSize() * 16]; 5211534Sjohn.kalamatianos@amd.com a_data = new uint8_t[computeUnit()->wfSize() * 8]; 5311534Sjohn.kalamatianos@amd.com x_data = new uint8_t[computeUnit()->wfSize() * 8]; 5411534Sjohn.kalamatianos@amd.com for (int i = 0; i < (computeUnit()->wfSize() * 8); ++i) { 5511534Sjohn.kalamatianos@amd.com a_data[i] = 0; 5611534Sjohn.kalamatianos@amd.com x_data[i] = 0; 5711534Sjohn.kalamatianos@amd.com } 5811534Sjohn.kalamatianos@amd.com for (int i = 0; i < (computeUnit()->wfSize() * 16); ++i) { 5911534Sjohn.kalamatianos@amd.com d_data[i] = 0; 6011534Sjohn.kalamatianos@amd.com } 6111534Sjohn.kalamatianos@amd.com} 6211534Sjohn.kalamatianos@amd.com 6311534Sjohn.kalamatianos@amd.comGPUDynInst::~GPUDynInst() 6411534Sjohn.kalamatianos@amd.com{ 6511534Sjohn.kalamatianos@amd.com delete[] d_data; 6611534Sjohn.kalamatianos@amd.com delete[] a_data; 6711534Sjohn.kalamatianos@amd.com delete[] x_data; 6811308Santhony.gutierrez@amd.com} 6911308Santhony.gutierrez@amd.com 7011308Santhony.gutierrez@amd.comvoid 7111308Santhony.gutierrez@amd.comGPUDynInst::execute() 7211308Santhony.gutierrez@amd.com{ 7311308Santhony.gutierrez@amd.com GPUDynInstPtr gpuDynInst = std::make_shared<GPUDynInst>(cu, wf, staticInst, 7411308Santhony.gutierrez@amd.com _seqNum); 7511308Santhony.gutierrez@amd.com staticInst->execute(gpuDynInst); 7611308Santhony.gutierrez@amd.com} 7711308Santhony.gutierrez@amd.com 7811308Santhony.gutierrez@amd.comint 7911308Santhony.gutierrez@amd.comGPUDynInst::numSrcRegOperands() 8011308Santhony.gutierrez@amd.com{ 8111308Santhony.gutierrez@amd.com return staticInst->numSrcRegOperands(); 8211308Santhony.gutierrez@amd.com} 8311308Santhony.gutierrez@amd.com 8411308Santhony.gutierrez@amd.comint 8511308Santhony.gutierrez@amd.comGPUDynInst::numDstRegOperands() 8611308Santhony.gutierrez@amd.com{ 8711308Santhony.gutierrez@amd.com return staticInst->numDstRegOperands(); 8811308Santhony.gutierrez@amd.com} 8911308Santhony.gutierrez@amd.com 9011308Santhony.gutierrez@amd.comint 9111308Santhony.gutierrez@amd.comGPUDynInst::getNumOperands() 9211308Santhony.gutierrez@amd.com{ 9311308Santhony.gutierrez@amd.com return staticInst->getNumOperands(); 9411308Santhony.gutierrez@amd.com} 9511308Santhony.gutierrez@amd.com 9611308Santhony.gutierrez@amd.combool 9711308Santhony.gutierrez@amd.comGPUDynInst::isVectorRegister(int operandIdx) 9811308Santhony.gutierrez@amd.com{ 9911308Santhony.gutierrez@amd.com return staticInst->isVectorRegister(operandIdx); 10011308Santhony.gutierrez@amd.com} 10111308Santhony.gutierrez@amd.com 10211308Santhony.gutierrez@amd.combool 10311308Santhony.gutierrez@amd.comGPUDynInst::isScalarRegister(int operandIdx) 10411308Santhony.gutierrez@amd.com{ 10511477Santhony.gutierrez@amd.com return staticInst->isScalarRegister(operandIdx); 10611308Santhony.gutierrez@amd.com} 10711308Santhony.gutierrez@amd.com 10811308Santhony.gutierrez@amd.comint 10911308Santhony.gutierrez@amd.comGPUDynInst::getRegisterIndex(int operandIdx) 11011308Santhony.gutierrez@amd.com{ 11111308Santhony.gutierrez@amd.com return staticInst->getRegisterIndex(operandIdx); 11211308Santhony.gutierrez@amd.com} 11311308Santhony.gutierrez@amd.com 11411308Santhony.gutierrez@amd.comint 11511308Santhony.gutierrez@amd.comGPUDynInst::getOperandSize(int operandIdx) 11611308Santhony.gutierrez@amd.com{ 11711308Santhony.gutierrez@amd.com return staticInst->getOperandSize(operandIdx); 11811308Santhony.gutierrez@amd.com} 11911308Santhony.gutierrez@amd.com 12011308Santhony.gutierrez@amd.combool 12111308Santhony.gutierrez@amd.comGPUDynInst::isDstOperand(int operandIdx) 12211308Santhony.gutierrez@amd.com{ 12311308Santhony.gutierrez@amd.com return staticInst->isDstOperand(operandIdx); 12411308Santhony.gutierrez@amd.com} 12511308Santhony.gutierrez@amd.com 12611308Santhony.gutierrez@amd.combool 12711308Santhony.gutierrez@amd.comGPUDynInst::isSrcOperand(int operandIdx) 12811308Santhony.gutierrez@amd.com{ 12911308Santhony.gutierrez@amd.com return staticInst->isSrcOperand(operandIdx); 13011308Santhony.gutierrez@amd.com} 13111308Santhony.gutierrez@amd.com 13211308Santhony.gutierrez@amd.combool 13311308Santhony.gutierrez@amd.comGPUDynInst::isArgLoad() 13411308Santhony.gutierrez@amd.com{ 13511308Santhony.gutierrez@amd.com return staticInst->isArgLoad(); 13611308Santhony.gutierrez@amd.com} 13711308Santhony.gutierrez@amd.com 13811308Santhony.gutierrez@amd.comconst std::string& 13911308Santhony.gutierrez@amd.comGPUDynInst::disassemble() const 14011308Santhony.gutierrez@amd.com{ 14111308Santhony.gutierrez@amd.com return staticInst->disassemble(); 14211308Santhony.gutierrez@amd.com} 14311308Santhony.gutierrez@amd.com 14411308Santhony.gutierrez@amd.comuint64_t 14511308Santhony.gutierrez@amd.comGPUDynInst::seqNum() const 14611308Santhony.gutierrez@amd.com{ 14711308Santhony.gutierrez@amd.com return _seqNum; 14811308Santhony.gutierrez@amd.com} 14911308Santhony.gutierrez@amd.com 15011308Santhony.gutierrez@amd.comEnums::OpType 15111308Santhony.gutierrez@amd.comGPUDynInst::opType() 15211308Santhony.gutierrez@amd.com{ 15311308Santhony.gutierrez@amd.com return staticInst->o_type; 15411308Santhony.gutierrez@amd.com} 15511308Santhony.gutierrez@amd.com 15611308Santhony.gutierrez@amd.comEnums::StorageClassType 15711308Santhony.gutierrez@amd.comGPUDynInst::executedAs() 15811308Santhony.gutierrez@amd.com{ 15911308Santhony.gutierrez@amd.com return staticInst->executed_as; 16011308Santhony.gutierrez@amd.com} 16111308Santhony.gutierrez@amd.com 16211308Santhony.gutierrez@amd.com// Process a memory instruction and (if necessary) submit timing request 16311308Santhony.gutierrez@amd.comvoid 16411308Santhony.gutierrez@amd.comGPUDynInst::initiateAcc(GPUDynInstPtr gpuDynInst) 16511308Santhony.gutierrez@amd.com{ 16611308Santhony.gutierrez@amd.com DPRINTF(GPUMem, "CU%d: WF[%d][%d]: mempacket status bitvector=%#x\n", 16711308Santhony.gutierrez@amd.com cu->cu_id, simdId, wfSlotId, exec_mask); 16811308Santhony.gutierrez@amd.com 16911308Santhony.gutierrez@amd.com staticInst->initiateAcc(gpuDynInst); 17011308Santhony.gutierrez@amd.com time = 0; 17111308Santhony.gutierrez@amd.com} 17211308Santhony.gutierrez@amd.com 17311308Santhony.gutierrez@amd.combool 17411308Santhony.gutierrez@amd.comGPUDynInst::scalarOp() const 17511308Santhony.gutierrez@amd.com{ 17611308Santhony.gutierrez@amd.com return staticInst->scalarOp(); 17711308Santhony.gutierrez@amd.com} 17811308Santhony.gutierrez@amd.com 17911308Santhony.gutierrez@amd.comvoid 18011308Santhony.gutierrez@amd.comGPUDynInst::updateStats() 18111308Santhony.gutierrez@amd.com{ 18211308Santhony.gutierrez@amd.com if (staticInst->isLocalMem()) { 18311308Santhony.gutierrez@amd.com // access to LDS (shared) memory 18411308Santhony.gutierrez@amd.com cu->dynamicLMemInstrCnt++; 18511308Santhony.gutierrez@amd.com } else { 18611308Santhony.gutierrez@amd.com // access to global memory 18711308Santhony.gutierrez@amd.com 18811308Santhony.gutierrez@amd.com // update PageDivergence histogram 18911308Santhony.gutierrez@amd.com int number_pages_touched = cu->pagesTouched.size(); 19011308Santhony.gutierrez@amd.com assert(number_pages_touched); 19111308Santhony.gutierrez@amd.com cu->pageDivergenceDist.sample(number_pages_touched); 19211308Santhony.gutierrez@amd.com 19311308Santhony.gutierrez@amd.com std::pair<ComputeUnit::pageDataStruct::iterator, bool> ret; 19411308Santhony.gutierrez@amd.com 19511308Santhony.gutierrez@amd.com for (auto it : cu->pagesTouched) { 19611308Santhony.gutierrez@amd.com // see if this page has been touched before. if not, this also 19711308Santhony.gutierrez@amd.com // inserts the page into the table. 19811308Santhony.gutierrez@amd.com ret = cu->pageAccesses 19911308Santhony.gutierrez@amd.com .insert(ComputeUnit::pageDataStruct::value_type(it.first, 20011308Santhony.gutierrez@amd.com std::make_pair(1, it.second))); 20111308Santhony.gutierrez@amd.com 20211308Santhony.gutierrez@amd.com // if yes, then update the stats 20311308Santhony.gutierrez@amd.com if (!ret.second) { 20411308Santhony.gutierrez@amd.com ret.first->second.first++; 20511308Santhony.gutierrez@amd.com ret.first->second.second += it.second; 20611308Santhony.gutierrez@amd.com } 20711308Santhony.gutierrez@amd.com } 20811308Santhony.gutierrez@amd.com 20911308Santhony.gutierrez@amd.com cu->pagesTouched.clear(); 21011308Santhony.gutierrez@amd.com 21111308Santhony.gutierrez@amd.com // total number of memory instructions (dynamic) 21211308Santhony.gutierrez@amd.com // Atomics are counted as a single memory instruction. 21311308Santhony.gutierrez@amd.com // this is # memory instructions per wavefronts, not per workitem 21411308Santhony.gutierrez@amd.com cu->dynamicGMemInstrCnt++; 21511308Santhony.gutierrez@amd.com } 21611308Santhony.gutierrez@amd.com} 217