local_memory_pipeline.cc revision 11693
111308Santhony.gutierrez@amd.com/* 211308Santhony.gutierrez@amd.com * Copyright (c) 2014-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: Sooraj Puthoor 3411308Santhony.gutierrez@amd.com */ 3511308Santhony.gutierrez@amd.com 3611308Santhony.gutierrez@amd.com#include "gpu-compute/local_memory_pipeline.hh" 3711308Santhony.gutierrez@amd.com 3811308Santhony.gutierrez@amd.com#include "debug/GPUPort.hh" 3911308Santhony.gutierrez@amd.com#include "gpu-compute/compute_unit.hh" 4011308Santhony.gutierrez@amd.com#include "gpu-compute/gpu_dyn_inst.hh" 4111308Santhony.gutierrez@amd.com#include "gpu-compute/shader.hh" 4211308Santhony.gutierrez@amd.com#include "gpu-compute/vector_register_file.hh" 4311308Santhony.gutierrez@amd.com#include "gpu-compute/wavefront.hh" 4411308Santhony.gutierrez@amd.com 4511308Santhony.gutierrez@amd.comLocalMemPipeline::LocalMemPipeline(const ComputeUnitParams* p) : 4611308Santhony.gutierrez@amd.com computeUnit(nullptr), lmQueueSize(p->local_mem_queue_size) 4711308Santhony.gutierrez@amd.com{ 4811308Santhony.gutierrez@amd.com} 4911308Santhony.gutierrez@amd.com 5011308Santhony.gutierrez@amd.comvoid 5111308Santhony.gutierrez@amd.comLocalMemPipeline::init(ComputeUnit *cu) 5211308Santhony.gutierrez@amd.com{ 5311308Santhony.gutierrez@amd.com computeUnit = cu; 5411308Santhony.gutierrez@amd.com _name = computeUnit->name() + ".LocalMemPipeline"; 5511308Santhony.gutierrez@amd.com} 5611308Santhony.gutierrez@amd.com 5711308Santhony.gutierrez@amd.comvoid 5811308Santhony.gutierrez@amd.comLocalMemPipeline::exec() 5911308Santhony.gutierrez@amd.com{ 6011308Santhony.gutierrez@amd.com // apply any returned shared (LDS) memory operations 6111308Santhony.gutierrez@amd.com GPUDynInstPtr m = !lmReturnedRequests.empty() ? 6211308Santhony.gutierrez@amd.com lmReturnedRequests.front() : nullptr; 6311308Santhony.gutierrez@amd.com 6411308Santhony.gutierrez@amd.com bool accessVrf = true; 6511693Santhony.gutierrez@amd.com Wavefront *w = nullptr; 6611693Santhony.gutierrez@amd.com 6711692Santhony.gutierrez@amd.com if ((m) && (m->isLoad() || m->isAtomicRet())) { 6811693Santhony.gutierrez@amd.com w = m->wavefront(); 6911308Santhony.gutierrez@amd.com 7011308Santhony.gutierrez@amd.com accessVrf = 7111693Santhony.gutierrez@amd.com w->computeUnit->vrf[w->simdId]-> 7211308Santhony.gutierrez@amd.com vrfOperandAccessReady(m->seqNum(), w, m, 7311308Santhony.gutierrez@amd.com VrfAccessType::WRITE); 7411308Santhony.gutierrez@amd.com } 7511308Santhony.gutierrez@amd.com 7611308Santhony.gutierrez@amd.com if (!lmReturnedRequests.empty() && m->latency.rdy() && accessVrf && 7711308Santhony.gutierrez@amd.com computeUnit->locMemToVrfBus.rdy() && (computeUnit->shader->coissue_return 7811308Santhony.gutierrez@amd.com || computeUnit->wfWait.at(m->pipeId).rdy())) { 7911693Santhony.gutierrez@amd.com 8011693Santhony.gutierrez@amd.com lmReturnedRequests.pop(); 8111693Santhony.gutierrez@amd.com w = m->wavefront(); 8211693Santhony.gutierrez@amd.com 8311693Santhony.gutierrez@amd.com m->completeAcc(m); 8411693Santhony.gutierrez@amd.com 8511693Santhony.gutierrez@amd.com // Decrement outstanding request count 8611693Santhony.gutierrez@amd.com computeUnit->shader->ScheduleAdd(&w->outstandingReqs, m->time, -1); 8711693Santhony.gutierrez@amd.com 8811693Santhony.gutierrez@amd.com if (m->isStore() || m->isAtomic()) { 8911693Santhony.gutierrez@amd.com computeUnit->shader->ScheduleAdd(&w->outstandingReqsWrLm, 9011693Santhony.gutierrez@amd.com m->time, -1); 9111693Santhony.gutierrez@amd.com } 9211693Santhony.gutierrez@amd.com 9311693Santhony.gutierrez@amd.com if (m->isLoad() || m->isAtomic()) { 9411693Santhony.gutierrez@amd.com computeUnit->shader->ScheduleAdd(&w->outstandingReqsRdLm, 9511693Santhony.gutierrez@amd.com m->time, -1); 9611693Santhony.gutierrez@amd.com } 9711693Santhony.gutierrez@amd.com 9811693Santhony.gutierrez@amd.com // Mark write bus busy for appropriate amount of time 9911693Santhony.gutierrez@amd.com computeUnit->locMemToVrfBus.set(m->time); 10011693Santhony.gutierrez@amd.com if (computeUnit->shader->coissue_return == 0) 10111693Santhony.gutierrez@amd.com w->computeUnit->wfWait.at(m->pipeId).set(m->time); 10211308Santhony.gutierrez@amd.com } 10311308Santhony.gutierrez@amd.com 10411308Santhony.gutierrez@amd.com // If pipeline has executed a local memory instruction 10511308Santhony.gutierrez@amd.com // execute local memory packet and issue the packets 10611308Santhony.gutierrez@amd.com // to LDS 10711308Santhony.gutierrez@amd.com if (!lmIssuedRequests.empty() && lmReturnedRequests.size() < lmQueueSize) { 10811308Santhony.gutierrez@amd.com 10911308Santhony.gutierrez@amd.com GPUDynInstPtr m = lmIssuedRequests.front(); 11011308Santhony.gutierrez@amd.com 11111308Santhony.gutierrez@amd.com bool returnVal = computeUnit->sendToLds(m); 11211308Santhony.gutierrez@amd.com if (!returnVal) { 11311308Santhony.gutierrez@amd.com DPRINTF(GPUPort, "packet was nack'd and put in retry queue"); 11411308Santhony.gutierrez@amd.com } 11511308Santhony.gutierrez@amd.com lmIssuedRequests.pop(); 11611308Santhony.gutierrez@amd.com } 11711308Santhony.gutierrez@amd.com} 11811308Santhony.gutierrez@amd.com 11911308Santhony.gutierrez@amd.comvoid 12011308Santhony.gutierrez@amd.comLocalMemPipeline::regStats() 12111308Santhony.gutierrez@amd.com{ 12211308Santhony.gutierrez@amd.com loadVrfBankConflictCycles 12311308Santhony.gutierrez@amd.com .name(name() + ".load_vrf_bank_conflict_cycles") 12411308Santhony.gutierrez@amd.com .desc("total number of cycles LDS data are delayed before updating " 12511308Santhony.gutierrez@amd.com "the VRF") 12611308Santhony.gutierrez@amd.com ; 12711308Santhony.gutierrez@amd.com} 128