wavefront.cc revision 11639
111308Santhony.gutierrez@amd.com/* 211308Santhony.gutierrez@amd.com * Copyright (c) 2011-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: Lisa Hsu 3411308Santhony.gutierrez@amd.com */ 3511308Santhony.gutierrez@amd.com 3611308Santhony.gutierrez@amd.com#include "gpu-compute/wavefront.hh" 3711308Santhony.gutierrez@amd.com 3811308Santhony.gutierrez@amd.com#include "debug/GPUExec.hh" 3911308Santhony.gutierrez@amd.com#include "debug/WavefrontStack.hh" 4011308Santhony.gutierrez@amd.com#include "gpu-compute/code_enums.hh" 4111308Santhony.gutierrez@amd.com#include "gpu-compute/compute_unit.hh" 4211308Santhony.gutierrez@amd.com#include "gpu-compute/gpu_dyn_inst.hh" 4311308Santhony.gutierrez@amd.com#include "gpu-compute/shader.hh" 4411308Santhony.gutierrez@amd.com#include "gpu-compute/vector_register_file.hh" 4511308Santhony.gutierrez@amd.com 4611308Santhony.gutierrez@amd.comWavefront* 4711308Santhony.gutierrez@amd.comWavefrontParams::create() 4811308Santhony.gutierrez@amd.com{ 4911308Santhony.gutierrez@amd.com return new Wavefront(this); 5011308Santhony.gutierrez@amd.com} 5111308Santhony.gutierrez@amd.com 5211308Santhony.gutierrez@amd.comWavefront::Wavefront(const Params *p) 5311308Santhony.gutierrez@amd.com : SimObject(p), callArgMem(nullptr) 5411308Santhony.gutierrez@amd.com{ 5511639Salexandru.dutu@amd.com lastTrace = 0; 5611308Santhony.gutierrez@amd.com simdId = p->simdId; 5711308Santhony.gutierrez@amd.com wfSlotId = p->wf_slot_id; 5811308Santhony.gutierrez@amd.com status = S_STOPPED; 5911308Santhony.gutierrez@amd.com reservedVectorRegs = 0; 6011308Santhony.gutierrez@amd.com startVgprIndex = 0; 6111639Salexandru.dutu@amd.com outstandingReqs = 0; 6211639Salexandru.dutu@amd.com memReqsInPipe = 0; 6311639Salexandru.dutu@amd.com outstandingReqsWrGm = 0; 6411639Salexandru.dutu@amd.com outstandingReqsWrLm = 0; 6511639Salexandru.dutu@amd.com outstandingReqsRdGm = 0; 6611639Salexandru.dutu@amd.com outstandingReqsRdLm = 0; 6711639Salexandru.dutu@amd.com rdLmReqsInPipe = 0; 6811639Salexandru.dutu@amd.com rdGmReqsInPipe = 0; 6911639Salexandru.dutu@amd.com wrLmReqsInPipe = 0; 7011639Salexandru.dutu@amd.com wrGmReqsInPipe = 0; 7111308Santhony.gutierrez@amd.com 7211639Salexandru.dutu@amd.com barrierCnt = 0; 7311639Salexandru.dutu@amd.com oldBarrierCnt = 0; 7411308Santhony.gutierrez@amd.com stalledAtBarrier = false; 7511308Santhony.gutierrez@amd.com 7611639Salexandru.dutu@amd.com memTraceBusy = 0; 7711639Salexandru.dutu@amd.com oldVgprTcnt = 0xffffffffffffffffll; 7811639Salexandru.dutu@amd.com oldDgprTcnt = 0xffffffffffffffffll; 7911639Salexandru.dutu@amd.com oldVgpr.resize(p->wfSize); 8011308Santhony.gutierrez@amd.com 8111308Santhony.gutierrez@amd.com pendingFetch = false; 8211308Santhony.gutierrez@amd.com dropFetch = false; 8311308Santhony.gutierrez@amd.com condRegState = new ConditionRegisterState(); 8411308Santhony.gutierrez@amd.com maxSpVgprs = 0; 8511308Santhony.gutierrez@amd.com maxDpVgprs = 0; 8611639Salexandru.dutu@amd.com lastAddr.resize(p->wfSize); 8711639Salexandru.dutu@amd.com workItemFlatId.resize(p->wfSize); 8811639Salexandru.dutu@amd.com oldDgpr.resize(p->wfSize); 8911639Salexandru.dutu@amd.com barCnt.resize(p->wfSize); 9011534Sjohn.kalamatianos@amd.com for (int i = 0; i < 3; ++i) { 9111639Salexandru.dutu@amd.com workItemId[i].resize(p->wfSize); 9211534Sjohn.kalamatianos@amd.com } 9311308Santhony.gutierrez@amd.com} 9411308Santhony.gutierrez@amd.com 9511308Santhony.gutierrez@amd.comvoid 9611308Santhony.gutierrez@amd.comWavefront::regStats() 9711308Santhony.gutierrez@amd.com{ 9811523Sdavid.guillen@arm.com SimObject::regStats(); 9911523Sdavid.guillen@arm.com 10011308Santhony.gutierrez@amd.com srcRegOpDist 10111308Santhony.gutierrez@amd.com .init(0, 4, 2) 10211308Santhony.gutierrez@amd.com .name(name() + ".src_reg_operand_dist") 10311308Santhony.gutierrez@amd.com .desc("number of executed instructions with N source register operands") 10411308Santhony.gutierrez@amd.com ; 10511308Santhony.gutierrez@amd.com 10611308Santhony.gutierrez@amd.com dstRegOpDist 10711308Santhony.gutierrez@amd.com .init(0, 3, 2) 10811308Santhony.gutierrez@amd.com .name(name() + ".dst_reg_operand_dist") 10911308Santhony.gutierrez@amd.com .desc("number of executed instructions with N destination register " 11011308Santhony.gutierrez@amd.com "operands") 11111308Santhony.gutierrez@amd.com ; 11211308Santhony.gutierrez@amd.com 11311308Santhony.gutierrez@amd.com // FIXME: the name of the WF needs to be unique 11411308Santhony.gutierrez@amd.com numTimesBlockedDueWAXDependencies 11511308Santhony.gutierrez@amd.com .name(name() + ".timesBlockedDueWAXDependencies") 11611308Santhony.gutierrez@amd.com .desc("number of times the wf's instructions are blocked due to WAW " 11711308Santhony.gutierrez@amd.com "or WAR dependencies") 11811308Santhony.gutierrez@amd.com ; 11911308Santhony.gutierrez@amd.com 12011308Santhony.gutierrez@amd.com // FIXME: the name of the WF needs to be unique 12111308Santhony.gutierrez@amd.com numTimesBlockedDueRAWDependencies 12211308Santhony.gutierrez@amd.com .name(name() + ".timesBlockedDueRAWDependencies") 12311308Santhony.gutierrez@amd.com .desc("number of times the wf's instructions are blocked due to RAW " 12411308Santhony.gutierrez@amd.com "dependencies") 12511308Santhony.gutierrez@amd.com ; 12611308Santhony.gutierrez@amd.com 12711308Santhony.gutierrez@amd.com // FIXME: the name of the WF needs to be unique 12811308Santhony.gutierrez@amd.com numTimesBlockedDueVrfPortAvail 12911308Santhony.gutierrez@amd.com .name(name() + ".timesBlockedDueVrfPortAvail") 13011308Santhony.gutierrez@amd.com .desc("number of times instructions are blocked due to VRF port " 13111308Santhony.gutierrez@amd.com "availability") 13211308Santhony.gutierrez@amd.com ; 13311308Santhony.gutierrez@amd.com} 13411308Santhony.gutierrez@amd.com 13511308Santhony.gutierrez@amd.comvoid 13611308Santhony.gutierrez@amd.comWavefront::init() 13711308Santhony.gutierrez@amd.com{ 13811308Santhony.gutierrez@amd.com reservedVectorRegs = 0; 13911308Santhony.gutierrez@amd.com startVgprIndex = 0; 14011308Santhony.gutierrez@amd.com} 14111308Santhony.gutierrez@amd.com 14211308Santhony.gutierrez@amd.comvoid 14311308Santhony.gutierrez@amd.comWavefront::resizeRegFiles(int num_cregs, int num_sregs, int num_dregs) 14411308Santhony.gutierrez@amd.com{ 14511308Santhony.gutierrez@amd.com condRegState->init(num_cregs); 14611308Santhony.gutierrez@amd.com maxSpVgprs = num_sregs; 14711308Santhony.gutierrez@amd.com maxDpVgprs = num_dregs; 14811308Santhony.gutierrez@amd.com} 14911308Santhony.gutierrez@amd.com 15011308Santhony.gutierrez@amd.comWavefront::~Wavefront() 15111308Santhony.gutierrez@amd.com{ 15211308Santhony.gutierrez@amd.com if (callArgMem) 15311308Santhony.gutierrez@amd.com delete callArgMem; 15411534Sjohn.kalamatianos@amd.com delete condRegState; 15511308Santhony.gutierrez@amd.com} 15611308Santhony.gutierrez@amd.com 15711308Santhony.gutierrez@amd.comvoid 15811308Santhony.gutierrez@amd.comWavefront::start(uint64_t _wfDynId,uint64_t _base_ptr) 15911308Santhony.gutierrez@amd.com{ 16011308Santhony.gutierrez@amd.com wfDynId = _wfDynId; 16111639Salexandru.dutu@amd.com basePtr = _base_ptr; 16211308Santhony.gutierrez@amd.com status = S_RUNNING; 16311308Santhony.gutierrez@amd.com} 16411308Santhony.gutierrez@amd.com 16511308Santhony.gutierrez@amd.combool 16611308Santhony.gutierrez@amd.comWavefront::isGmInstruction(GPUDynInstPtr ii) 16711308Santhony.gutierrez@amd.com{ 16811308Santhony.gutierrez@amd.com if (IS_OT_READ_PM(ii->opType()) || IS_OT_WRITE_PM(ii->opType()) || 16911308Santhony.gutierrez@amd.com IS_OT_ATOMIC_PM(ii->opType())) { 17011308Santhony.gutierrez@amd.com return true; 17111308Santhony.gutierrez@amd.com } 17211308Santhony.gutierrez@amd.com 17311308Santhony.gutierrez@amd.com if (IS_OT_READ_GM(ii->opType()) || IS_OT_WRITE_GM(ii->opType()) || 17411308Santhony.gutierrez@amd.com IS_OT_ATOMIC_GM(ii->opType())) { 17511308Santhony.gutierrez@amd.com return true; 17611308Santhony.gutierrez@amd.com } 17711308Santhony.gutierrez@amd.com 17811308Santhony.gutierrez@amd.com if (IS_OT_FLAT(ii->opType())) { 17911308Santhony.gutierrez@amd.com return true; 18011308Santhony.gutierrez@amd.com } 18111308Santhony.gutierrez@amd.com 18211308Santhony.gutierrez@amd.com return false; 18311308Santhony.gutierrez@amd.com} 18411308Santhony.gutierrez@amd.com 18511308Santhony.gutierrez@amd.combool 18611308Santhony.gutierrez@amd.comWavefront::isLmInstruction(GPUDynInstPtr ii) 18711308Santhony.gutierrez@amd.com{ 18811308Santhony.gutierrez@amd.com if (IS_OT_READ_LM(ii->opType()) || IS_OT_WRITE_LM(ii->opType()) || 18911308Santhony.gutierrez@amd.com IS_OT_ATOMIC_LM(ii->opType())) { 19011308Santhony.gutierrez@amd.com return true; 19111308Santhony.gutierrez@amd.com } 19211308Santhony.gutierrez@amd.com 19311308Santhony.gutierrez@amd.com return false; 19411308Santhony.gutierrez@amd.com} 19511308Santhony.gutierrez@amd.com 19611308Santhony.gutierrez@amd.combool 19711308Santhony.gutierrez@amd.comWavefront::isOldestInstALU() 19811308Santhony.gutierrez@amd.com{ 19911308Santhony.gutierrez@amd.com assert(!instructionBuffer.empty()); 20011308Santhony.gutierrez@amd.com GPUDynInstPtr ii = instructionBuffer.front(); 20111308Santhony.gutierrez@amd.com 20211308Santhony.gutierrez@amd.com if (status != S_STOPPED && (ii->opType() == Enums::OT_NOP || 20311308Santhony.gutierrez@amd.com ii->opType() == Enums::OT_RET || ii->opType() == Enums::OT_BRANCH || 20411308Santhony.gutierrez@amd.com ii->opType() == Enums::OT_ALU || IS_OT_LDAS(ii->opType()) || 20511308Santhony.gutierrez@amd.com ii->opType() == Enums::OT_KERN_READ)) { 20611308Santhony.gutierrez@amd.com return true; 20711308Santhony.gutierrez@amd.com } 20811308Santhony.gutierrez@amd.com 20911308Santhony.gutierrez@amd.com return false; 21011308Santhony.gutierrez@amd.com} 21111308Santhony.gutierrez@amd.com 21211308Santhony.gutierrez@amd.combool 21311308Santhony.gutierrez@amd.comWavefront::isOldestInstBarrier() 21411308Santhony.gutierrez@amd.com{ 21511308Santhony.gutierrez@amd.com assert(!instructionBuffer.empty()); 21611308Santhony.gutierrez@amd.com GPUDynInstPtr ii = instructionBuffer.front(); 21711308Santhony.gutierrez@amd.com 21811308Santhony.gutierrez@amd.com if (status != S_STOPPED && ii->opType() == Enums::OT_BARRIER) { 21911308Santhony.gutierrez@amd.com return true; 22011308Santhony.gutierrez@amd.com } 22111308Santhony.gutierrez@amd.com 22211308Santhony.gutierrez@amd.com return false; 22311308Santhony.gutierrez@amd.com} 22411308Santhony.gutierrez@amd.com 22511308Santhony.gutierrez@amd.combool 22611308Santhony.gutierrez@amd.comWavefront::isOldestInstGMem() 22711308Santhony.gutierrez@amd.com{ 22811308Santhony.gutierrez@amd.com assert(!instructionBuffer.empty()); 22911308Santhony.gutierrez@amd.com GPUDynInstPtr ii = instructionBuffer.front(); 23011308Santhony.gutierrez@amd.com 23111308Santhony.gutierrez@amd.com if (status != S_STOPPED && (IS_OT_READ_GM(ii->opType()) || 23211308Santhony.gutierrez@amd.com IS_OT_WRITE_GM(ii->opType()) || IS_OT_ATOMIC_GM(ii->opType()))) { 23311308Santhony.gutierrez@amd.com 23411308Santhony.gutierrez@amd.com return true; 23511308Santhony.gutierrez@amd.com } 23611308Santhony.gutierrez@amd.com 23711308Santhony.gutierrez@amd.com return false; 23811308Santhony.gutierrez@amd.com} 23911308Santhony.gutierrez@amd.com 24011308Santhony.gutierrez@amd.combool 24111308Santhony.gutierrez@amd.comWavefront::isOldestInstLMem() 24211308Santhony.gutierrez@amd.com{ 24311308Santhony.gutierrez@amd.com assert(!instructionBuffer.empty()); 24411308Santhony.gutierrez@amd.com GPUDynInstPtr ii = instructionBuffer.front(); 24511308Santhony.gutierrez@amd.com 24611308Santhony.gutierrez@amd.com if (status != S_STOPPED && (IS_OT_READ_LM(ii->opType()) || 24711308Santhony.gutierrez@amd.com IS_OT_WRITE_LM(ii->opType()) || IS_OT_ATOMIC_LM(ii->opType()))) { 24811308Santhony.gutierrez@amd.com 24911308Santhony.gutierrez@amd.com return true; 25011308Santhony.gutierrez@amd.com } 25111308Santhony.gutierrez@amd.com 25211308Santhony.gutierrez@amd.com return false; 25311308Santhony.gutierrez@amd.com} 25411308Santhony.gutierrez@amd.com 25511308Santhony.gutierrez@amd.combool 25611308Santhony.gutierrez@amd.comWavefront::isOldestInstPrivMem() 25711308Santhony.gutierrez@amd.com{ 25811308Santhony.gutierrez@amd.com assert(!instructionBuffer.empty()); 25911308Santhony.gutierrez@amd.com GPUDynInstPtr ii = instructionBuffer.front(); 26011308Santhony.gutierrez@amd.com 26111308Santhony.gutierrez@amd.com if (status != S_STOPPED && (IS_OT_READ_PM(ii->opType()) || 26211308Santhony.gutierrez@amd.com IS_OT_WRITE_PM(ii->opType()) || IS_OT_ATOMIC_PM(ii->opType()))) { 26311308Santhony.gutierrez@amd.com 26411308Santhony.gutierrez@amd.com return true; 26511308Santhony.gutierrez@amd.com } 26611308Santhony.gutierrez@amd.com 26711308Santhony.gutierrez@amd.com return false; 26811308Santhony.gutierrez@amd.com} 26911308Santhony.gutierrez@amd.com 27011308Santhony.gutierrez@amd.combool 27111308Santhony.gutierrez@amd.comWavefront::isOldestInstFlatMem() 27211308Santhony.gutierrez@amd.com{ 27311308Santhony.gutierrez@amd.com assert(!instructionBuffer.empty()); 27411308Santhony.gutierrez@amd.com GPUDynInstPtr ii = instructionBuffer.front(); 27511308Santhony.gutierrez@amd.com 27611308Santhony.gutierrez@amd.com if (status != S_STOPPED && IS_OT_FLAT(ii->opType())) { 27711308Santhony.gutierrez@amd.com 27811308Santhony.gutierrez@amd.com return true; 27911308Santhony.gutierrez@amd.com } 28011308Santhony.gutierrez@amd.com 28111308Santhony.gutierrez@amd.com return false; 28211308Santhony.gutierrez@amd.com} 28311308Santhony.gutierrez@amd.com 28411308Santhony.gutierrez@amd.com// Return true if the Wavefront's instruction 28511308Santhony.gutierrez@amd.com// buffer has branch instruction. 28611308Santhony.gutierrez@amd.combool 28711308Santhony.gutierrez@amd.comWavefront::instructionBufferHasBranch() 28811308Santhony.gutierrez@amd.com{ 28911308Santhony.gutierrez@amd.com for (auto it : instructionBuffer) { 29011308Santhony.gutierrez@amd.com GPUDynInstPtr ii = it; 29111308Santhony.gutierrez@amd.com 29211308Santhony.gutierrez@amd.com if (ii->opType() == Enums::OT_RET || ii->opType() == Enums::OT_BRANCH) { 29311308Santhony.gutierrez@amd.com return true; 29411308Santhony.gutierrez@amd.com } 29511308Santhony.gutierrez@amd.com } 29611308Santhony.gutierrez@amd.com 29711308Santhony.gutierrez@amd.com return false; 29811308Santhony.gutierrez@amd.com} 29911308Santhony.gutierrez@amd.com 30011308Santhony.gutierrez@amd.com// Remap HSAIL register to physical VGPR. 30111308Santhony.gutierrez@amd.com// HSAIL register = virtual register assigned to an operand by HLC compiler 30211308Santhony.gutierrez@amd.comuint32_t 30311308Santhony.gutierrez@amd.comWavefront::remap(uint32_t vgprIndex, uint32_t size, uint8_t mode) 30411308Santhony.gutierrez@amd.com{ 30511308Santhony.gutierrez@amd.com assert((vgprIndex < reservedVectorRegs) && (reservedVectorRegs > 0)); 30611308Santhony.gutierrez@amd.com // add the offset from where the VGPRs of the wavefront have been assigned 30711308Santhony.gutierrez@amd.com uint32_t physicalVgprIndex = startVgprIndex + vgprIndex; 30811308Santhony.gutierrez@amd.com // HSAIL double precision (DP) register: calculate the physical VGPR index 30911308Santhony.gutierrez@amd.com // assuming that DP registers are placed after SP ones in the VRF. The DP 31011308Santhony.gutierrez@amd.com // and SP VGPR name spaces in HSAIL mode are separate so we need to adjust 31111308Santhony.gutierrez@amd.com // the DP VGPR index before mapping it to the physical VRF address space 31211308Santhony.gutierrez@amd.com if (mode == 1 && size > 4) { 31311308Santhony.gutierrez@amd.com physicalVgprIndex = startVgprIndex + maxSpVgprs + (2 * vgprIndex); 31411308Santhony.gutierrez@amd.com } 31511308Santhony.gutierrez@amd.com 31611308Santhony.gutierrez@amd.com assert((startVgprIndex <= physicalVgprIndex) && 31711308Santhony.gutierrez@amd.com (startVgprIndex + reservedVectorRegs - 1) >= physicalVgprIndex); 31811308Santhony.gutierrez@amd.com 31911308Santhony.gutierrez@amd.com // calculate absolute physical VGPR index 32011308Santhony.gutierrez@amd.com return physicalVgprIndex % computeUnit->vrf[simdId]->numRegs(); 32111308Santhony.gutierrez@amd.com} 32211308Santhony.gutierrez@amd.com 32311308Santhony.gutierrez@amd.com// Return true if this wavefront is ready 32411308Santhony.gutierrez@amd.com// to execute an instruction of the specified type. 32511308Santhony.gutierrez@amd.comint 32611308Santhony.gutierrez@amd.comWavefront::ready(itype_e type) 32711308Santhony.gutierrez@amd.com{ 32811308Santhony.gutierrez@amd.com // Check to make sure wave is running 32911308Santhony.gutierrez@amd.com if (status == S_STOPPED || status == S_RETURNING || 33011308Santhony.gutierrez@amd.com instructionBuffer.empty()) { 33111308Santhony.gutierrez@amd.com return 0; 33211308Santhony.gutierrez@amd.com } 33311308Santhony.gutierrez@amd.com 33411308Santhony.gutierrez@amd.com // Is the wave waiting at a barrier 33511308Santhony.gutierrez@amd.com if (stalledAtBarrier) { 33611639Salexandru.dutu@amd.com if (!computeUnit->AllAtBarrier(barrierId,barrierCnt, 33711639Salexandru.dutu@amd.com computeUnit->getRefCounter(dispatchId, wgId))) { 33811308Santhony.gutierrez@amd.com // Are all threads at barrier? 33911308Santhony.gutierrez@amd.com return 0; 34011308Santhony.gutierrez@amd.com } 34111639Salexandru.dutu@amd.com oldBarrierCnt = barrierCnt; 34211308Santhony.gutierrez@amd.com stalledAtBarrier = false; 34311308Santhony.gutierrez@amd.com } 34411308Santhony.gutierrez@amd.com 34511308Santhony.gutierrez@amd.com // Read instruction 34611308Santhony.gutierrez@amd.com GPUDynInstPtr ii = instructionBuffer.front(); 34711308Santhony.gutierrez@amd.com 34811308Santhony.gutierrez@amd.com bool ready_inst M5_VAR_USED = false; 34911308Santhony.gutierrez@amd.com bool glbMemBusRdy = false; 35011308Santhony.gutierrez@amd.com bool glbMemIssueRdy = false; 35111308Santhony.gutierrez@amd.com if (type == I_GLOBAL || type == I_FLAT || type == I_PRIVATE) { 35211308Santhony.gutierrez@amd.com for (int j=0; j < computeUnit->numGlbMemUnits; ++j) { 35311308Santhony.gutierrez@amd.com if (computeUnit->vrfToGlobalMemPipeBus[j].prerdy()) 35411308Santhony.gutierrez@amd.com glbMemBusRdy = true; 35511308Santhony.gutierrez@amd.com if (computeUnit->wfWait[j].prerdy()) 35611308Santhony.gutierrez@amd.com glbMemIssueRdy = true; 35711308Santhony.gutierrez@amd.com } 35811308Santhony.gutierrez@amd.com } 35911308Santhony.gutierrez@amd.com bool locMemBusRdy = false; 36011308Santhony.gutierrez@amd.com bool locMemIssueRdy = false; 36111345Sjohn.kalamatianos@amd.com if (type == I_SHARED || type == I_FLAT) { 36211308Santhony.gutierrez@amd.com for (int j=0; j < computeUnit->numLocMemUnits; ++j) { 36311308Santhony.gutierrez@amd.com if (computeUnit->vrfToLocalMemPipeBus[j].prerdy()) 36411308Santhony.gutierrez@amd.com locMemBusRdy = true; 36511308Santhony.gutierrez@amd.com if (computeUnit->wfWait[j].prerdy()) 36611308Santhony.gutierrez@amd.com locMemIssueRdy = true; 36711308Santhony.gutierrez@amd.com } 36811308Santhony.gutierrez@amd.com } 36911308Santhony.gutierrez@amd.com 37011308Santhony.gutierrez@amd.com // The following code is very error prone and the entire process for 37111308Santhony.gutierrez@amd.com // checking readiness will be fixed eventually. In the meantime, let's 37211308Santhony.gutierrez@amd.com // make sure that we do not silently let an instruction type slip 37311308Santhony.gutierrez@amd.com // through this logic and always return not ready. 37411308Santhony.gutierrez@amd.com if (!(ii->opType() == Enums::OT_BARRIER || ii->opType() == Enums::OT_NOP || 37511308Santhony.gutierrez@amd.com ii->opType() == Enums::OT_RET || ii->opType() == Enums::OT_BRANCH || 37611308Santhony.gutierrez@amd.com ii->opType() == Enums::OT_ALU || IS_OT_LDAS(ii->opType()) || 37711308Santhony.gutierrez@amd.com ii->opType() == Enums::OT_KERN_READ || 37811308Santhony.gutierrez@amd.com ii->opType() == Enums::OT_ARG || 37911308Santhony.gutierrez@amd.com IS_OT_READ_GM(ii->opType()) || IS_OT_WRITE_GM(ii->opType()) || 38011308Santhony.gutierrez@amd.com IS_OT_ATOMIC_GM(ii->opType()) || IS_OT_READ_LM(ii->opType()) || 38111308Santhony.gutierrez@amd.com IS_OT_WRITE_LM(ii->opType()) || IS_OT_ATOMIC_LM(ii->opType()) || 38211308Santhony.gutierrez@amd.com IS_OT_READ_PM(ii->opType()) || IS_OT_WRITE_PM(ii->opType()) || 38311308Santhony.gutierrez@amd.com IS_OT_ATOMIC_PM(ii->opType()) || IS_OT_FLAT(ii->opType()))) { 38411308Santhony.gutierrez@amd.com panic("next instruction: %s is of unknown type\n", ii->disassemble()); 38511308Santhony.gutierrez@amd.com } 38611308Santhony.gutierrez@amd.com 38711308Santhony.gutierrez@amd.com DPRINTF(GPUExec, "CU%d: WF[%d][%d]: Checking Read for Inst : %s\n", 38811308Santhony.gutierrez@amd.com computeUnit->cu_id, simdId, wfSlotId, ii->disassemble()); 38911308Santhony.gutierrez@amd.com 39011308Santhony.gutierrez@amd.com if (type == I_ALU && ii->opType() == Enums::OT_BARRIER) { 39111308Santhony.gutierrez@amd.com // Here for ALU instruction (barrier) 39211308Santhony.gutierrez@amd.com if (!computeUnit->wfWait[simdId].prerdy()) { 39311308Santhony.gutierrez@amd.com // Is wave slot free? 39411308Santhony.gutierrez@amd.com return 0; 39511308Santhony.gutierrez@amd.com } 39611308Santhony.gutierrez@amd.com 39711308Santhony.gutierrez@amd.com // Are there in pipe or outstanding memory requests? 39811639Salexandru.dutu@amd.com if ((outstandingReqs + memReqsInPipe) > 0) { 39911308Santhony.gutierrez@amd.com return 0; 40011308Santhony.gutierrez@amd.com } 40111308Santhony.gutierrez@amd.com 40211308Santhony.gutierrez@amd.com ready_inst = true; 40311308Santhony.gutierrez@amd.com } else if (type == I_ALU && ii->opType() == Enums::OT_NOP) { 40411308Santhony.gutierrez@amd.com // Here for ALU instruction (nop) 40511308Santhony.gutierrez@amd.com if (!computeUnit->wfWait[simdId].prerdy()) { 40611308Santhony.gutierrez@amd.com // Is wave slot free? 40711308Santhony.gutierrez@amd.com return 0; 40811308Santhony.gutierrez@amd.com } 40911308Santhony.gutierrez@amd.com 41011308Santhony.gutierrez@amd.com ready_inst = true; 41111308Santhony.gutierrez@amd.com } else if (type == I_ALU && ii->opType() == Enums::OT_RET) { 41211308Santhony.gutierrez@amd.com // Here for ALU instruction (return) 41311308Santhony.gutierrez@amd.com if (!computeUnit->wfWait[simdId].prerdy()) { 41411308Santhony.gutierrez@amd.com // Is wave slot free? 41511308Santhony.gutierrez@amd.com return 0; 41611308Santhony.gutierrez@amd.com } 41711308Santhony.gutierrez@amd.com 41811308Santhony.gutierrez@amd.com // Are there in pipe or outstanding memory requests? 41911639Salexandru.dutu@amd.com if ((outstandingReqs + memReqsInPipe) > 0) { 42011308Santhony.gutierrez@amd.com return 0; 42111308Santhony.gutierrez@amd.com } 42211308Santhony.gutierrez@amd.com 42311308Santhony.gutierrez@amd.com ready_inst = true; 42411308Santhony.gutierrez@amd.com } else if (type == I_ALU && (ii->opType() == Enums::OT_BRANCH || 42511308Santhony.gutierrez@amd.com ii->opType() == Enums::OT_ALU || IS_OT_LDAS(ii->opType()) || 42611308Santhony.gutierrez@amd.com ii->opType() == Enums::OT_KERN_READ || 42711308Santhony.gutierrez@amd.com ii->opType() == Enums::OT_ARG)) { 42811308Santhony.gutierrez@amd.com // Here for ALU instruction (all others) 42911308Santhony.gutierrez@amd.com if (!computeUnit->wfWait[simdId].prerdy()) { 43011308Santhony.gutierrez@amd.com // Is alu slot free? 43111308Santhony.gutierrez@amd.com return 0; 43211308Santhony.gutierrez@amd.com } 43311308Santhony.gutierrez@amd.com if (!computeUnit->vrf[simdId]->vrfOperandAccessReady(this, ii, 43411308Santhony.gutierrez@amd.com VrfAccessType::RD_WR)) { 43511308Santhony.gutierrez@amd.com return 0; 43611308Santhony.gutierrez@amd.com } 43711308Santhony.gutierrez@amd.com 43811308Santhony.gutierrez@amd.com if (!computeUnit->vrf[simdId]->operandsReady(this, ii)) { 43911308Santhony.gutierrez@amd.com return 0; 44011308Santhony.gutierrez@amd.com } 44111308Santhony.gutierrez@amd.com ready_inst = true; 44211308Santhony.gutierrez@amd.com } else if (type == I_GLOBAL && (IS_OT_READ_GM(ii->opType()) || 44311308Santhony.gutierrez@amd.com IS_OT_WRITE_GM(ii->opType()) || IS_OT_ATOMIC_GM(ii->opType()))) { 44411308Santhony.gutierrez@amd.com // Here Global memory instruction 44511308Santhony.gutierrez@amd.com if (IS_OT_READ_GM(ii->opType()) || IS_OT_ATOMIC_GM(ii->opType())) { 44611308Santhony.gutierrez@amd.com // Are there in pipe or outstanding global memory write requests? 44711639Salexandru.dutu@amd.com if ((outstandingReqsWrGm + wrGmReqsInPipe) > 0) { 44811308Santhony.gutierrez@amd.com return 0; 44911308Santhony.gutierrez@amd.com } 45011308Santhony.gutierrez@amd.com } 45111308Santhony.gutierrez@amd.com 45211308Santhony.gutierrez@amd.com if (IS_OT_WRITE_GM(ii->opType()) || IS_OT_ATOMIC_GM(ii->opType()) || 45311308Santhony.gutierrez@amd.com IS_OT_HIST_GM(ii->opType())) { 45411308Santhony.gutierrez@amd.com // Are there in pipe or outstanding global memory read requests? 45511639Salexandru.dutu@amd.com if ((outstandingReqsRdGm + rdGmReqsInPipe) > 0) 45611308Santhony.gutierrez@amd.com return 0; 45711308Santhony.gutierrez@amd.com } 45811308Santhony.gutierrez@amd.com 45911308Santhony.gutierrez@amd.com if (!glbMemIssueRdy) { 46011308Santhony.gutierrez@amd.com // Is WV issue slot free? 46111308Santhony.gutierrez@amd.com return 0; 46211308Santhony.gutierrez@amd.com } 46311308Santhony.gutierrez@amd.com 46411308Santhony.gutierrez@amd.com if (!glbMemBusRdy) { 46511308Santhony.gutierrez@amd.com // Is there an available VRF->Global memory read bus? 46611308Santhony.gutierrez@amd.com return 0; 46711308Santhony.gutierrez@amd.com } 46811308Santhony.gutierrez@amd.com 46911308Santhony.gutierrez@amd.com if (!computeUnit->globalMemoryPipe. 47011639Salexandru.dutu@amd.com isGMReqFIFOWrRdy(rdGmReqsInPipe + wrGmReqsInPipe)) { 47111308Santhony.gutierrez@amd.com // Can we insert a new request to the Global Mem Request FIFO? 47211308Santhony.gutierrez@amd.com return 0; 47311308Santhony.gutierrez@amd.com } 47411308Santhony.gutierrez@amd.com // can we schedule source & destination operands on the VRF? 47511308Santhony.gutierrez@amd.com if (!computeUnit->vrf[simdId]->vrfOperandAccessReady(this, ii, 47611308Santhony.gutierrez@amd.com VrfAccessType::RD_WR)) { 47711308Santhony.gutierrez@amd.com return 0; 47811308Santhony.gutierrez@amd.com } 47911308Santhony.gutierrez@amd.com if (!computeUnit->vrf[simdId]->operandsReady(this, ii)) { 48011308Santhony.gutierrez@amd.com return 0; 48111308Santhony.gutierrez@amd.com } 48211308Santhony.gutierrez@amd.com ready_inst = true; 48311308Santhony.gutierrez@amd.com } else if (type == I_SHARED && (IS_OT_READ_LM(ii->opType()) || 48411308Santhony.gutierrez@amd.com IS_OT_WRITE_LM(ii->opType()) || IS_OT_ATOMIC_LM(ii->opType()))) { 48511308Santhony.gutierrez@amd.com // Here for Shared memory instruction 48611308Santhony.gutierrez@amd.com if (IS_OT_READ_LM(ii->opType()) || IS_OT_ATOMIC_LM(ii->opType())) { 48711639Salexandru.dutu@amd.com if ((outstandingReqsWrLm + wrLmReqsInPipe) > 0) { 48811308Santhony.gutierrez@amd.com return 0; 48911308Santhony.gutierrez@amd.com } 49011308Santhony.gutierrez@amd.com } 49111308Santhony.gutierrez@amd.com 49211308Santhony.gutierrez@amd.com if (IS_OT_WRITE_LM(ii->opType()) || IS_OT_ATOMIC_LM(ii->opType()) || 49311308Santhony.gutierrez@amd.com IS_OT_HIST_LM(ii->opType())) { 49411639Salexandru.dutu@amd.com if ((outstandingReqsRdLm + rdLmReqsInPipe) > 0) { 49511308Santhony.gutierrez@amd.com return 0; 49611308Santhony.gutierrez@amd.com } 49711308Santhony.gutierrez@amd.com } 49811308Santhony.gutierrez@amd.com 49911308Santhony.gutierrez@amd.com if (!locMemBusRdy) { 50011308Santhony.gutierrez@amd.com // Is there an available VRF->LDS read bus? 50111308Santhony.gutierrez@amd.com return 0; 50211308Santhony.gutierrez@amd.com } 50311308Santhony.gutierrez@amd.com if (!locMemIssueRdy) { 50411308Santhony.gutierrez@amd.com // Is wave slot free? 50511308Santhony.gutierrez@amd.com return 0; 50611308Santhony.gutierrez@amd.com } 50711308Santhony.gutierrez@amd.com 50811308Santhony.gutierrez@amd.com if (!computeUnit->localMemoryPipe. 50911639Salexandru.dutu@amd.com isLMReqFIFOWrRdy(rdLmReqsInPipe + wrLmReqsInPipe)) { 51011308Santhony.gutierrez@amd.com // Can we insert a new request to the LDS Request FIFO? 51111308Santhony.gutierrez@amd.com return 0; 51211308Santhony.gutierrez@amd.com } 51311308Santhony.gutierrez@amd.com // can we schedule source & destination operands on the VRF? 51411308Santhony.gutierrez@amd.com if (!computeUnit->vrf[simdId]->vrfOperandAccessReady(this, ii, 51511308Santhony.gutierrez@amd.com VrfAccessType::RD_WR)) { 51611308Santhony.gutierrez@amd.com return 0; 51711308Santhony.gutierrez@amd.com } 51811308Santhony.gutierrez@amd.com if (!computeUnit->vrf[simdId]->operandsReady(this, ii)) { 51911308Santhony.gutierrez@amd.com return 0; 52011308Santhony.gutierrez@amd.com } 52111308Santhony.gutierrez@amd.com ready_inst = true; 52211308Santhony.gutierrez@amd.com } else if (type == I_PRIVATE && (IS_OT_READ_PM(ii->opType()) || 52311308Santhony.gutierrez@amd.com IS_OT_WRITE_PM(ii->opType()) || IS_OT_ATOMIC_PM(ii->opType()))) { 52411308Santhony.gutierrez@amd.com // Here for Private memory instruction ------------------------ // 52511308Santhony.gutierrez@amd.com if (IS_OT_READ_PM(ii->opType()) || IS_OT_ATOMIC_PM(ii->opType())) { 52611639Salexandru.dutu@amd.com if ((outstandingReqsWrGm + wrGmReqsInPipe) > 0) { 52711308Santhony.gutierrez@amd.com return 0; 52811308Santhony.gutierrez@amd.com } 52911308Santhony.gutierrez@amd.com } 53011308Santhony.gutierrez@amd.com 53111308Santhony.gutierrez@amd.com if (IS_OT_WRITE_PM(ii->opType()) || IS_OT_ATOMIC_PM(ii->opType()) || 53211308Santhony.gutierrez@amd.com IS_OT_HIST_PM(ii->opType())) { 53311639Salexandru.dutu@amd.com if ((outstandingReqsRdGm + rdGmReqsInPipe) > 0) { 53411308Santhony.gutierrez@amd.com return 0; 53511308Santhony.gutierrez@amd.com } 53611308Santhony.gutierrez@amd.com } 53711308Santhony.gutierrez@amd.com 53811308Santhony.gutierrez@amd.com if (!glbMemBusRdy) { 53911308Santhony.gutierrez@amd.com // Is there an available VRF->Global memory read bus? 54011308Santhony.gutierrez@amd.com return 0; 54111308Santhony.gutierrez@amd.com } 54211308Santhony.gutierrez@amd.com 54311308Santhony.gutierrez@amd.com if (!glbMemIssueRdy) { 54411308Santhony.gutierrez@amd.com // Is wave slot free? 54511308Santhony.gutierrez@amd.com return 0; 54611308Santhony.gutierrez@amd.com } 54711308Santhony.gutierrez@amd.com 54811308Santhony.gutierrez@amd.com if (!computeUnit->globalMemoryPipe. 54911639Salexandru.dutu@amd.com isGMReqFIFOWrRdy(rdGmReqsInPipe + wrGmReqsInPipe)) { 55011308Santhony.gutierrez@amd.com // Can we insert a new request to the Global Mem Request FIFO? 55111308Santhony.gutierrez@amd.com return 0; 55211308Santhony.gutierrez@amd.com } 55311308Santhony.gutierrez@amd.com // can we schedule source & destination operands on the VRF? 55411308Santhony.gutierrez@amd.com if (!computeUnit->vrf[simdId]->vrfOperandAccessReady(this, ii, 55511308Santhony.gutierrez@amd.com VrfAccessType::RD_WR)) { 55611308Santhony.gutierrez@amd.com return 0; 55711308Santhony.gutierrez@amd.com } 55811308Santhony.gutierrez@amd.com if (!computeUnit->vrf[simdId]->operandsReady(this, ii)) { 55911308Santhony.gutierrez@amd.com return 0; 56011308Santhony.gutierrez@amd.com } 56111308Santhony.gutierrez@amd.com ready_inst = true; 56211308Santhony.gutierrez@amd.com } else if (type == I_FLAT && IS_OT_FLAT(ii->opType())) { 56311308Santhony.gutierrez@amd.com if (!glbMemBusRdy) { 56411308Santhony.gutierrez@amd.com // Is there an available VRF->Global memory read bus? 56511308Santhony.gutierrez@amd.com return 0; 56611308Santhony.gutierrez@amd.com } 56711308Santhony.gutierrez@amd.com 56811308Santhony.gutierrez@amd.com if (!locMemBusRdy) { 56911308Santhony.gutierrez@amd.com // Is there an available VRF->LDS read bus? 57011308Santhony.gutierrez@amd.com return 0; 57111308Santhony.gutierrez@amd.com } 57211308Santhony.gutierrez@amd.com 57311308Santhony.gutierrez@amd.com if (!glbMemIssueRdy) { 57411308Santhony.gutierrez@amd.com // Is wave slot free? 57511308Santhony.gutierrez@amd.com return 0; 57611308Santhony.gutierrez@amd.com } 57711308Santhony.gutierrez@amd.com 57811308Santhony.gutierrez@amd.com if (!locMemIssueRdy) { 57911308Santhony.gutierrez@amd.com return 0; 58011308Santhony.gutierrez@amd.com } 58111308Santhony.gutierrez@amd.com if (!computeUnit->globalMemoryPipe. 58211639Salexandru.dutu@amd.com isGMReqFIFOWrRdy(rdGmReqsInPipe + wrGmReqsInPipe)) { 58311308Santhony.gutierrez@amd.com // Can we insert a new request to the Global Mem Request FIFO? 58411308Santhony.gutierrez@amd.com return 0; 58511308Santhony.gutierrez@amd.com } 58611308Santhony.gutierrez@amd.com 58711308Santhony.gutierrez@amd.com if (!computeUnit->localMemoryPipe. 58811639Salexandru.dutu@amd.com isLMReqFIFOWrRdy(rdLmReqsInPipe + wrLmReqsInPipe)) { 58911308Santhony.gutierrez@amd.com // Can we insert a new request to the LDS Request FIFO? 59011308Santhony.gutierrez@amd.com return 0; 59111308Santhony.gutierrez@amd.com } 59211308Santhony.gutierrez@amd.com // can we schedule source & destination operands on the VRF? 59311308Santhony.gutierrez@amd.com if (!computeUnit->vrf[simdId]->vrfOperandAccessReady(this, ii, 59411308Santhony.gutierrez@amd.com VrfAccessType::RD_WR)) { 59511308Santhony.gutierrez@amd.com return 0; 59611308Santhony.gutierrez@amd.com } 59711308Santhony.gutierrez@amd.com // are all the operands ready? (RAW, WAW and WAR depedencies met?) 59811308Santhony.gutierrez@amd.com if (!computeUnit->vrf[simdId]->operandsReady(this, ii)) { 59911308Santhony.gutierrez@amd.com return 0; 60011308Santhony.gutierrez@amd.com } 60111308Santhony.gutierrez@amd.com ready_inst = true; 60211308Santhony.gutierrez@amd.com } else { 60311308Santhony.gutierrez@amd.com return 0; 60411308Santhony.gutierrez@amd.com } 60511308Santhony.gutierrez@amd.com 60611308Santhony.gutierrez@amd.com assert(ready_inst); 60711308Santhony.gutierrez@amd.com 60811308Santhony.gutierrez@amd.com DPRINTF(GPUExec, "CU%d: WF[%d][%d]: Ready Inst : %s\n", computeUnit->cu_id, 60911308Santhony.gutierrez@amd.com simdId, wfSlotId, ii->disassemble()); 61011308Santhony.gutierrez@amd.com return 1; 61111308Santhony.gutierrez@amd.com} 61211308Santhony.gutierrez@amd.com 61311308Santhony.gutierrez@amd.comvoid 61411308Santhony.gutierrez@amd.comWavefront::updateResources() 61511308Santhony.gutierrez@amd.com{ 61611308Santhony.gutierrez@amd.com // Get current instruction 61711308Santhony.gutierrez@amd.com GPUDynInstPtr ii = instructionBuffer.front(); 61811308Santhony.gutierrez@amd.com assert(ii); 61911308Santhony.gutierrez@amd.com computeUnit->vrf[simdId]->updateResources(this, ii); 62011308Santhony.gutierrez@amd.com // Single precision ALU or Branch or Return or Special instruction 62111308Santhony.gutierrez@amd.com if (ii->opType() == Enums::OT_ALU || ii->opType() == Enums::OT_SPECIAL || 62211308Santhony.gutierrez@amd.com ii->opType() == Enums::OT_BRANCH || IS_OT_LDAS(ii->opType()) || 62311308Santhony.gutierrez@amd.com // FIXME: Kernel argument loads are currently treated as ALU operations 62411308Santhony.gutierrez@amd.com // since we don't send memory packets at execution. If we fix that then 62511308Santhony.gutierrez@amd.com // we should map them to one of the memory pipelines 62611308Santhony.gutierrez@amd.com ii->opType()==Enums::OT_KERN_READ || 62711308Santhony.gutierrez@amd.com ii->opType()==Enums::OT_ARG || 62811308Santhony.gutierrez@amd.com ii->opType()==Enums::OT_RET) { 62911308Santhony.gutierrez@amd.com computeUnit->aluPipe[simdId].preset(computeUnit->shader-> 63011308Santhony.gutierrez@amd.com ticks(computeUnit->spBypassLength())); 63111308Santhony.gutierrez@amd.com // this is to enforce a fixed number of cycles per issue slot per SIMD 63211308Santhony.gutierrez@amd.com computeUnit->wfWait[simdId].preset(computeUnit->shader-> 63311308Santhony.gutierrez@amd.com ticks(computeUnit->issuePeriod)); 63411308Santhony.gutierrez@amd.com } else if (ii->opType() == Enums::OT_BARRIER) { 63511308Santhony.gutierrez@amd.com computeUnit->wfWait[simdId].preset(computeUnit->shader-> 63611308Santhony.gutierrez@amd.com ticks(computeUnit->issuePeriod)); 63711308Santhony.gutierrez@amd.com } else if (ii->opType() == Enums::OT_FLAT_READ) { 63811308Santhony.gutierrez@amd.com assert(Enums::SC_NONE != ii->executedAs()); 63911639Salexandru.dutu@amd.com memReqsInPipe++; 64011639Salexandru.dutu@amd.com rdGmReqsInPipe++; 64111308Santhony.gutierrez@amd.com if ( Enums::SC_SHARED == ii->executedAs() ) { 64211308Santhony.gutierrez@amd.com computeUnit->vrfToLocalMemPipeBus[computeUnit->nextLocRdBus()]. 64311308Santhony.gutierrez@amd.com preset(computeUnit->shader->ticks(4)); 64411308Santhony.gutierrez@amd.com computeUnit->wfWait[computeUnit->ShrMemUnitId()]. 64511308Santhony.gutierrez@amd.com preset(computeUnit->shader->ticks(computeUnit->issuePeriod)); 64611308Santhony.gutierrez@amd.com } else { 64711308Santhony.gutierrez@amd.com computeUnit->vrfToGlobalMemPipeBus[computeUnit->nextGlbRdBus()]. 64811308Santhony.gutierrez@amd.com preset(computeUnit->shader->ticks(4)); 64911308Santhony.gutierrez@amd.com computeUnit->wfWait[computeUnit->GlbMemUnitId()]. 65011308Santhony.gutierrez@amd.com preset(computeUnit->shader->ticks(computeUnit->issuePeriod)); 65111308Santhony.gutierrez@amd.com } 65211308Santhony.gutierrez@amd.com } else if (ii->opType() == Enums::OT_FLAT_WRITE) { 65311308Santhony.gutierrez@amd.com assert(Enums::SC_NONE != ii->executedAs()); 65411639Salexandru.dutu@amd.com memReqsInPipe++; 65511639Salexandru.dutu@amd.com wrGmReqsInPipe++; 65611308Santhony.gutierrez@amd.com if (Enums::SC_SHARED == ii->executedAs()) { 65711308Santhony.gutierrez@amd.com computeUnit->vrfToLocalMemPipeBus[computeUnit->nextLocRdBus()]. 65811308Santhony.gutierrez@amd.com preset(computeUnit->shader->ticks(8)); 65911308Santhony.gutierrez@amd.com computeUnit->wfWait[computeUnit->ShrMemUnitId()]. 66011308Santhony.gutierrez@amd.com preset(computeUnit->shader->ticks(computeUnit->issuePeriod)); 66111308Santhony.gutierrez@amd.com } else { 66211308Santhony.gutierrez@amd.com computeUnit->vrfToGlobalMemPipeBus[computeUnit->nextGlbRdBus()]. 66311308Santhony.gutierrez@amd.com preset(computeUnit->shader->ticks(8)); 66411308Santhony.gutierrez@amd.com computeUnit->wfWait[computeUnit->GlbMemUnitId()]. 66511308Santhony.gutierrez@amd.com preset(computeUnit->shader->ticks(computeUnit->issuePeriod)); 66611308Santhony.gutierrez@amd.com } 66711308Santhony.gutierrez@amd.com } else if (IS_OT_READ_GM(ii->opType())) { 66811639Salexandru.dutu@amd.com memReqsInPipe++; 66911639Salexandru.dutu@amd.com rdGmReqsInPipe++; 67011308Santhony.gutierrez@amd.com computeUnit->vrfToGlobalMemPipeBus[computeUnit->nextGlbRdBus()]. 67111308Santhony.gutierrez@amd.com preset(computeUnit->shader->ticks(4)); 67211308Santhony.gutierrez@amd.com computeUnit->wfWait[computeUnit->GlbMemUnitId()]. 67311308Santhony.gutierrez@amd.com preset(computeUnit->shader->ticks(computeUnit->issuePeriod)); 67411308Santhony.gutierrez@amd.com } else if (IS_OT_WRITE_GM(ii->opType())) { 67511639Salexandru.dutu@amd.com memReqsInPipe++; 67611639Salexandru.dutu@amd.com wrGmReqsInPipe++; 67711308Santhony.gutierrez@amd.com computeUnit->vrfToGlobalMemPipeBus[computeUnit->nextGlbRdBus()]. 67811308Santhony.gutierrez@amd.com preset(computeUnit->shader->ticks(8)); 67911308Santhony.gutierrez@amd.com computeUnit->wfWait[computeUnit->GlbMemUnitId()]. 68011308Santhony.gutierrez@amd.com preset(computeUnit->shader->ticks(computeUnit->issuePeriod)); 68111308Santhony.gutierrez@amd.com } else if (IS_OT_ATOMIC_GM(ii->opType())) { 68211639Salexandru.dutu@amd.com memReqsInPipe++; 68311639Salexandru.dutu@amd.com wrGmReqsInPipe++; 68411639Salexandru.dutu@amd.com rdGmReqsInPipe++; 68511308Santhony.gutierrez@amd.com computeUnit->vrfToGlobalMemPipeBus[computeUnit->nextGlbRdBus()]. 68611308Santhony.gutierrez@amd.com preset(computeUnit->shader->ticks(8)); 68711308Santhony.gutierrez@amd.com computeUnit->wfWait[computeUnit->GlbMemUnitId()]. 68811308Santhony.gutierrez@amd.com preset(computeUnit->shader->ticks(computeUnit->issuePeriod)); 68911308Santhony.gutierrez@amd.com } else if (IS_OT_READ_LM(ii->opType())) { 69011639Salexandru.dutu@amd.com memReqsInPipe++; 69111639Salexandru.dutu@amd.com rdLmReqsInPipe++; 69211308Santhony.gutierrez@amd.com computeUnit->vrfToLocalMemPipeBus[computeUnit->nextLocRdBus()]. 69311308Santhony.gutierrez@amd.com preset(computeUnit->shader->ticks(4)); 69411308Santhony.gutierrez@amd.com computeUnit->wfWait[computeUnit->ShrMemUnitId()]. 69511308Santhony.gutierrez@amd.com preset(computeUnit->shader->ticks(computeUnit->issuePeriod)); 69611308Santhony.gutierrez@amd.com } else if (IS_OT_WRITE_LM(ii->opType())) { 69711639Salexandru.dutu@amd.com memReqsInPipe++; 69811639Salexandru.dutu@amd.com wrLmReqsInPipe++; 69911308Santhony.gutierrez@amd.com computeUnit->vrfToLocalMemPipeBus[computeUnit->nextLocRdBus()]. 70011308Santhony.gutierrez@amd.com preset(computeUnit->shader->ticks(8)); 70111308Santhony.gutierrez@amd.com computeUnit->wfWait[computeUnit->ShrMemUnitId()]. 70211308Santhony.gutierrez@amd.com preset(computeUnit->shader->ticks(computeUnit->issuePeriod)); 70311308Santhony.gutierrez@amd.com } else if (IS_OT_ATOMIC_LM(ii->opType())) { 70411639Salexandru.dutu@amd.com memReqsInPipe++; 70511639Salexandru.dutu@amd.com wrLmReqsInPipe++; 70611639Salexandru.dutu@amd.com rdLmReqsInPipe++; 70711308Santhony.gutierrez@amd.com computeUnit->vrfToLocalMemPipeBus[computeUnit->nextLocRdBus()]. 70811308Santhony.gutierrez@amd.com preset(computeUnit->shader->ticks(8)); 70911308Santhony.gutierrez@amd.com computeUnit->wfWait[computeUnit->ShrMemUnitId()]. 71011308Santhony.gutierrez@amd.com preset(computeUnit->shader->ticks(computeUnit->issuePeriod)); 71111308Santhony.gutierrez@amd.com } else if (IS_OT_READ_PM(ii->opType())) { 71211639Salexandru.dutu@amd.com memReqsInPipe++; 71311639Salexandru.dutu@amd.com rdGmReqsInPipe++; 71411308Santhony.gutierrez@amd.com computeUnit->vrfToGlobalMemPipeBus[computeUnit->nextGlbRdBus()]. 71511308Santhony.gutierrez@amd.com preset(computeUnit->shader->ticks(4)); 71611308Santhony.gutierrez@amd.com computeUnit->wfWait[computeUnit->GlbMemUnitId()]. 71711308Santhony.gutierrez@amd.com preset(computeUnit->shader->ticks(computeUnit->issuePeriod)); 71811308Santhony.gutierrez@amd.com } else if (IS_OT_WRITE_PM(ii->opType())) { 71911639Salexandru.dutu@amd.com memReqsInPipe++; 72011639Salexandru.dutu@amd.com wrGmReqsInPipe++; 72111308Santhony.gutierrez@amd.com computeUnit->vrfToGlobalMemPipeBus[computeUnit->nextGlbRdBus()]. 72211308Santhony.gutierrez@amd.com preset(computeUnit->shader->ticks(8)); 72311308Santhony.gutierrez@amd.com computeUnit->wfWait[computeUnit->GlbMemUnitId()]. 72411308Santhony.gutierrez@amd.com preset(computeUnit->shader->ticks(computeUnit->issuePeriod)); 72511308Santhony.gutierrez@amd.com } else if (IS_OT_ATOMIC_PM(ii->opType())) { 72611639Salexandru.dutu@amd.com memReqsInPipe++; 72711639Salexandru.dutu@amd.com wrGmReqsInPipe++; 72811639Salexandru.dutu@amd.com rdGmReqsInPipe++; 72911308Santhony.gutierrez@amd.com computeUnit->vrfToGlobalMemPipeBus[computeUnit->nextGlbRdBus()]. 73011308Santhony.gutierrez@amd.com preset(computeUnit->shader->ticks(8)); 73111308Santhony.gutierrez@amd.com computeUnit->wfWait[computeUnit->GlbMemUnitId()]. 73211308Santhony.gutierrez@amd.com preset(computeUnit->shader->ticks(computeUnit->issuePeriod)); 73311308Santhony.gutierrez@amd.com } 73411308Santhony.gutierrez@amd.com} 73511308Santhony.gutierrez@amd.com 73611308Santhony.gutierrez@amd.comvoid 73711308Santhony.gutierrez@amd.comWavefront::exec() 73811308Santhony.gutierrez@amd.com{ 73911308Santhony.gutierrez@amd.com // ---- Exit if wavefront is inactive ----------------------------- // 74011308Santhony.gutierrez@amd.com 74111308Santhony.gutierrez@amd.com if (status == S_STOPPED || status == S_RETURNING || 74211308Santhony.gutierrez@amd.com instructionBuffer.empty()) { 74311308Santhony.gutierrez@amd.com return; 74411308Santhony.gutierrez@amd.com } 74511308Santhony.gutierrez@amd.com 74611308Santhony.gutierrez@amd.com // Get current instruction 74711308Santhony.gutierrez@amd.com 74811308Santhony.gutierrez@amd.com GPUDynInstPtr ii = instructionBuffer.front(); 74911308Santhony.gutierrez@amd.com 75011308Santhony.gutierrez@amd.com const uint32_t old_pc = pc(); 75111308Santhony.gutierrez@amd.com DPRINTF(GPUExec, "CU%d: WF[%d][%d]: wave[%d] Executing inst: %s " 75211308Santhony.gutierrez@amd.com "(pc: %i)\n", computeUnit->cu_id, simdId, wfSlotId, wfDynId, 75311308Santhony.gutierrez@amd.com ii->disassemble(), old_pc); 75411308Santhony.gutierrez@amd.com ii->execute(); 75511308Santhony.gutierrez@amd.com // access the VRF 75611308Santhony.gutierrez@amd.com computeUnit->vrf[simdId]->exec(ii, this); 75711308Santhony.gutierrez@amd.com srcRegOpDist.sample(ii->numSrcRegOperands()); 75811308Santhony.gutierrez@amd.com dstRegOpDist.sample(ii->numDstRegOperands()); 75911308Santhony.gutierrez@amd.com computeUnit->numInstrExecuted++; 76011308Santhony.gutierrez@amd.com computeUnit->execRateDist.sample(computeUnit->totalCycles.value() - 76111308Santhony.gutierrez@amd.com computeUnit->lastExecCycle[simdId]); 76211308Santhony.gutierrez@amd.com computeUnit->lastExecCycle[simdId] = computeUnit->totalCycles.value(); 76311308Santhony.gutierrez@amd.com if (pc() == old_pc) { 76411308Santhony.gutierrez@amd.com uint32_t new_pc = old_pc + 1; 76511308Santhony.gutierrez@amd.com // PC not modified by instruction, proceed to next or pop frame 76611308Santhony.gutierrez@amd.com pc(new_pc); 76711308Santhony.gutierrez@amd.com if (new_pc == rpc()) { 76811308Santhony.gutierrez@amd.com popFromReconvergenceStack(); 76911308Santhony.gutierrez@amd.com discardFetch(); 77011308Santhony.gutierrez@amd.com } else { 77111308Santhony.gutierrez@amd.com instructionBuffer.pop_front(); 77211308Santhony.gutierrez@amd.com } 77311308Santhony.gutierrez@amd.com } 77411308Santhony.gutierrez@amd.com 77511308Santhony.gutierrez@amd.com if (computeUnit->shader->hsail_mode==Shader::SIMT) { 77611308Santhony.gutierrez@amd.com const int num_active_lanes = execMask().count(); 77711308Santhony.gutierrez@amd.com computeUnit->controlFlowDivergenceDist.sample(num_active_lanes); 77811308Santhony.gutierrez@amd.com computeUnit->numVecOpsExecuted += num_active_lanes; 77911308Santhony.gutierrez@amd.com if (isGmInstruction(ii)) { 78011308Santhony.gutierrez@amd.com computeUnit->activeLanesPerGMemInstrDist.sample(num_active_lanes); 78111308Santhony.gutierrez@amd.com } else if (isLmInstruction(ii)) { 78211308Santhony.gutierrez@amd.com computeUnit->activeLanesPerLMemInstrDist.sample(num_active_lanes); 78311308Santhony.gutierrez@amd.com } 78411308Santhony.gutierrez@amd.com } 78511308Santhony.gutierrez@amd.com 78611308Santhony.gutierrez@amd.com // ---- Update Vector ALU pipeline and other resources ------------------ // 78711308Santhony.gutierrez@amd.com // Single precision ALU or Branch or Return or Special instruction 78811308Santhony.gutierrez@amd.com if (ii->opType() == Enums::OT_ALU || ii->opType() == Enums::OT_SPECIAL || 78911308Santhony.gutierrez@amd.com ii->opType() == Enums::OT_BRANCH || IS_OT_LDAS(ii->opType()) || 79011308Santhony.gutierrez@amd.com // FIXME: Kernel argument loads are currently treated as ALU operations 79111308Santhony.gutierrez@amd.com // since we don't send memory packets at execution. If we fix that then 79211308Santhony.gutierrez@amd.com // we should map them to one of the memory pipelines 79311308Santhony.gutierrez@amd.com ii->opType() == Enums::OT_KERN_READ || 79411308Santhony.gutierrez@amd.com ii->opType() == Enums::OT_ARG || 79511308Santhony.gutierrez@amd.com ii->opType() == Enums::OT_RET) { 79611308Santhony.gutierrez@amd.com computeUnit->aluPipe[simdId].set(computeUnit->shader-> 79711308Santhony.gutierrez@amd.com ticks(computeUnit->spBypassLength())); 79811308Santhony.gutierrez@amd.com 79911308Santhony.gutierrez@amd.com // this is to enforce a fixed number of cycles per issue slot per SIMD 80011308Santhony.gutierrez@amd.com computeUnit->wfWait[simdId].set(computeUnit->shader-> 80111308Santhony.gutierrez@amd.com ticks(computeUnit->issuePeriod)); 80211308Santhony.gutierrez@amd.com } else if (ii->opType() == Enums::OT_BARRIER) { 80311308Santhony.gutierrez@amd.com computeUnit->wfWait[simdId].set(computeUnit->shader-> 80411308Santhony.gutierrez@amd.com ticks(computeUnit->issuePeriod)); 80511308Santhony.gutierrez@amd.com } else if (ii->opType() == Enums::OT_FLAT_READ) { 80611308Santhony.gutierrez@amd.com assert(Enums::SC_NONE != ii->executedAs()); 80711308Santhony.gutierrez@amd.com 80811308Santhony.gutierrez@amd.com if (Enums::SC_SHARED == ii->executedAs()) { 80911308Santhony.gutierrez@amd.com computeUnit->vrfToLocalMemPipeBus[computeUnit->nextLocRdBus()]. 81011308Santhony.gutierrez@amd.com set(computeUnit->shader->ticks(4)); 81111308Santhony.gutierrez@amd.com computeUnit->wfWait[computeUnit->ShrMemUnitId()]. 81211308Santhony.gutierrez@amd.com set(computeUnit->shader->ticks(computeUnit->issuePeriod)); 81311308Santhony.gutierrez@amd.com } else { 81411308Santhony.gutierrez@amd.com computeUnit->vrfToGlobalMemPipeBus[computeUnit->nextGlbRdBus()]. 81511308Santhony.gutierrez@amd.com set(computeUnit->shader->ticks(4)); 81611308Santhony.gutierrez@amd.com computeUnit->wfWait[computeUnit->GlbMemUnitId()]. 81711308Santhony.gutierrez@amd.com set(computeUnit->shader->ticks(computeUnit->issuePeriod)); 81811308Santhony.gutierrez@amd.com } 81911308Santhony.gutierrez@amd.com } else if (ii->opType() == Enums::OT_FLAT_WRITE) { 82011308Santhony.gutierrez@amd.com assert(Enums::SC_NONE != ii->executedAs()); 82111308Santhony.gutierrez@amd.com if (Enums::SC_SHARED == ii->executedAs()) { 82211308Santhony.gutierrez@amd.com computeUnit->vrfToLocalMemPipeBus[computeUnit->nextLocRdBus()]. 82311308Santhony.gutierrez@amd.com set(computeUnit->shader->ticks(8)); 82411308Santhony.gutierrez@amd.com computeUnit->wfWait[computeUnit->ShrMemUnitId()]. 82511308Santhony.gutierrez@amd.com set(computeUnit->shader->ticks(computeUnit->issuePeriod)); 82611308Santhony.gutierrez@amd.com } else { 82711308Santhony.gutierrez@amd.com computeUnit->vrfToGlobalMemPipeBus[computeUnit->nextGlbRdBus()]. 82811308Santhony.gutierrez@amd.com set(computeUnit->shader->ticks(8)); 82911308Santhony.gutierrez@amd.com computeUnit->wfWait[computeUnit->GlbMemUnitId()]. 83011308Santhony.gutierrez@amd.com set(computeUnit->shader->ticks(computeUnit->issuePeriod)); 83111308Santhony.gutierrez@amd.com } 83211308Santhony.gutierrez@amd.com } else if (IS_OT_READ_GM(ii->opType())) { 83311308Santhony.gutierrez@amd.com computeUnit->vrfToGlobalMemPipeBus[computeUnit->nextGlbRdBus()]. 83411308Santhony.gutierrez@amd.com set(computeUnit->shader->ticks(4)); 83511308Santhony.gutierrez@amd.com computeUnit->wfWait[computeUnit->GlbMemUnitId()]. 83611308Santhony.gutierrez@amd.com set(computeUnit->shader->ticks(computeUnit->issuePeriod)); 83711308Santhony.gutierrez@amd.com } else if (IS_OT_WRITE_GM(ii->opType())) { 83811308Santhony.gutierrez@amd.com computeUnit->vrfToGlobalMemPipeBus[computeUnit->nextGlbRdBus()]. 83911308Santhony.gutierrez@amd.com set(computeUnit->shader->ticks(8)); 84011308Santhony.gutierrez@amd.com computeUnit->wfWait[computeUnit->GlbMemUnitId()]. 84111308Santhony.gutierrez@amd.com set(computeUnit->shader->ticks(computeUnit->issuePeriod)); 84211308Santhony.gutierrez@amd.com } else if (IS_OT_ATOMIC_GM(ii->opType())) { 84311308Santhony.gutierrez@amd.com computeUnit->vrfToGlobalMemPipeBus[computeUnit->nextGlbRdBus()]. 84411308Santhony.gutierrez@amd.com set(computeUnit->shader->ticks(8)); 84511308Santhony.gutierrez@amd.com computeUnit->wfWait[computeUnit->GlbMemUnitId()]. 84611308Santhony.gutierrez@amd.com set(computeUnit->shader->ticks(computeUnit->issuePeriod)); 84711308Santhony.gutierrez@amd.com } else if (IS_OT_READ_LM(ii->opType())) { 84811308Santhony.gutierrez@amd.com computeUnit->vrfToLocalMemPipeBus[computeUnit->nextLocRdBus()]. 84911308Santhony.gutierrez@amd.com set(computeUnit->shader->ticks(4)); 85011308Santhony.gutierrez@amd.com computeUnit->wfWait[computeUnit->ShrMemUnitId()]. 85111308Santhony.gutierrez@amd.com set(computeUnit->shader->ticks(computeUnit->issuePeriod)); 85211308Santhony.gutierrez@amd.com } else if (IS_OT_WRITE_LM(ii->opType())) { 85311308Santhony.gutierrez@amd.com computeUnit->vrfToLocalMemPipeBus[computeUnit->nextLocRdBus()]. 85411308Santhony.gutierrez@amd.com set(computeUnit->shader->ticks(8)); 85511308Santhony.gutierrez@amd.com computeUnit->wfWait[computeUnit->ShrMemUnitId()]. 85611308Santhony.gutierrez@amd.com set(computeUnit->shader->ticks(computeUnit->issuePeriod)); 85711308Santhony.gutierrez@amd.com } else if (IS_OT_ATOMIC_LM(ii->opType())) { 85811308Santhony.gutierrez@amd.com computeUnit->vrfToLocalMemPipeBus[computeUnit->nextLocRdBus()]. 85911308Santhony.gutierrez@amd.com set(computeUnit->shader->ticks(8)); 86011308Santhony.gutierrez@amd.com computeUnit->wfWait[computeUnit->ShrMemUnitId()]. 86111308Santhony.gutierrez@amd.com set(computeUnit->shader->ticks(computeUnit->issuePeriod)); 86211308Santhony.gutierrez@amd.com } 86311308Santhony.gutierrez@amd.com} 86411308Santhony.gutierrez@amd.com 86511308Santhony.gutierrez@amd.combool 86611308Santhony.gutierrez@amd.comWavefront::waitingAtBarrier(int lane) 86711308Santhony.gutierrez@amd.com{ 86811639Salexandru.dutu@amd.com return barCnt[lane] < maxBarCnt; 86911308Santhony.gutierrez@amd.com} 87011308Santhony.gutierrez@amd.com 87111308Santhony.gutierrez@amd.comvoid 87211308Santhony.gutierrez@amd.comWavefront::pushToReconvergenceStack(uint32_t pc, uint32_t rpc, 87311308Santhony.gutierrez@amd.com const VectorMask& mask) 87411308Santhony.gutierrez@amd.com{ 87511308Santhony.gutierrez@amd.com assert(mask.count()); 87611308Santhony.gutierrez@amd.com reconvergenceStack.emplace(new ReconvergenceStackEntry(pc, rpc, mask)); 87711308Santhony.gutierrez@amd.com} 87811308Santhony.gutierrez@amd.com 87911308Santhony.gutierrez@amd.comvoid 88011308Santhony.gutierrez@amd.comWavefront::popFromReconvergenceStack() 88111308Santhony.gutierrez@amd.com{ 88211308Santhony.gutierrez@amd.com assert(!reconvergenceStack.empty()); 88311308Santhony.gutierrez@amd.com 88411308Santhony.gutierrez@amd.com DPRINTF(WavefrontStack, "[%2d, %2d, %2d, %2d] %s %3i => ", 88511308Santhony.gutierrez@amd.com computeUnit->cu_id, simdId, wfSlotId, wfDynId, 88611308Santhony.gutierrez@amd.com execMask().to_string<char, std::string::traits_type, 88711308Santhony.gutierrez@amd.com std::string::allocator_type>().c_str(), pc()); 88811308Santhony.gutierrez@amd.com 88911308Santhony.gutierrez@amd.com reconvergenceStack.pop(); 89011308Santhony.gutierrez@amd.com 89111308Santhony.gutierrez@amd.com DPRINTF(WavefrontStack, "%3i %s\n", pc(), 89211308Santhony.gutierrez@amd.com execMask().to_string<char, std::string::traits_type, 89311308Santhony.gutierrez@amd.com std::string::allocator_type>().c_str()); 89411308Santhony.gutierrez@amd.com 89511308Santhony.gutierrez@amd.com} 89611308Santhony.gutierrez@amd.com 89711308Santhony.gutierrez@amd.comvoid 89811308Santhony.gutierrez@amd.comWavefront::discardFetch() 89911308Santhony.gutierrez@amd.com{ 90011308Santhony.gutierrez@amd.com instructionBuffer.clear(); 90111308Santhony.gutierrez@amd.com dropFetch |=pendingFetch; 90211308Santhony.gutierrez@amd.com} 90311308Santhony.gutierrez@amd.com 90411308Santhony.gutierrez@amd.comuint32_t 90511308Santhony.gutierrez@amd.comWavefront::pc() const 90611308Santhony.gutierrez@amd.com{ 90711308Santhony.gutierrez@amd.com return reconvergenceStack.top()->pc; 90811308Santhony.gutierrez@amd.com} 90911308Santhony.gutierrez@amd.com 91011308Santhony.gutierrez@amd.comuint32_t 91111308Santhony.gutierrez@amd.comWavefront::rpc() const 91211308Santhony.gutierrez@amd.com{ 91311308Santhony.gutierrez@amd.com return reconvergenceStack.top()->rpc; 91411308Santhony.gutierrez@amd.com} 91511308Santhony.gutierrez@amd.com 91611308Santhony.gutierrez@amd.comVectorMask 91711308Santhony.gutierrez@amd.comWavefront::execMask() const 91811308Santhony.gutierrez@amd.com{ 91911308Santhony.gutierrez@amd.com return reconvergenceStack.top()->execMask; 92011308Santhony.gutierrez@amd.com} 92111308Santhony.gutierrez@amd.com 92211308Santhony.gutierrez@amd.combool 92311308Santhony.gutierrez@amd.comWavefront::execMask(int lane) const 92411308Santhony.gutierrez@amd.com{ 92511308Santhony.gutierrez@amd.com return reconvergenceStack.top()->execMask[lane]; 92611308Santhony.gutierrez@amd.com} 92711308Santhony.gutierrez@amd.com 92811308Santhony.gutierrez@amd.com 92911308Santhony.gutierrez@amd.comvoid 93011308Santhony.gutierrez@amd.comWavefront::pc(uint32_t new_pc) 93111308Santhony.gutierrez@amd.com{ 93211308Santhony.gutierrez@amd.com reconvergenceStack.top()->pc = new_pc; 93311308Santhony.gutierrez@amd.com} 934