vector_register_file.hh revision 11800
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: John Kalamatianos
3411308Santhony.gutierrez@amd.com */
3511308Santhony.gutierrez@amd.com
3611308Santhony.gutierrez@amd.com#ifndef __VECTOR_REGISTER_FILE_HH__
3711308Santhony.gutierrez@amd.com#define __VECTOR_REGISTER_FILE_HH__
3811308Santhony.gutierrez@amd.com
3911308Santhony.gutierrez@amd.com#include <list>
4011308Santhony.gutierrez@amd.com
4111308Santhony.gutierrez@amd.com#include "base/statistics.hh"
4211800Sbrandon.potter@amd.com#include "base/trace.hh"
4311308Santhony.gutierrez@amd.com#include "base/types.hh"
4411642Salexandru.dutu@amd.com#include "debug/GPUVRF.hh"
4511308Santhony.gutierrez@amd.com#include "gpu-compute/vector_register_state.hh"
4611308Santhony.gutierrez@amd.com#include "sim/sim_object.hh"
4711308Santhony.gutierrez@amd.com
4811308Santhony.gutierrez@amd.comclass ComputeUnit;
4911308Santhony.gutierrez@amd.comclass Shader;
5011308Santhony.gutierrez@amd.comclass SimplePoolManager;
5111308Santhony.gutierrez@amd.comclass Wavefront;
5211308Santhony.gutierrez@amd.com
5311308Santhony.gutierrez@amd.comstruct VectorRegisterFileParams;
5411308Santhony.gutierrez@amd.com
5511308Santhony.gutierrez@amd.comenum class VrfAccessType : uint8_t
5611308Santhony.gutierrez@amd.com{
5711308Santhony.gutierrez@amd.com    READ = 0x01,
5811308Santhony.gutierrez@amd.com    WRITE = 0x02,
5911308Santhony.gutierrez@amd.com    RD_WR = READ | WRITE
6011308Santhony.gutierrez@amd.com};
6111308Santhony.gutierrez@amd.com
6211308Santhony.gutierrez@amd.com// Vector Register File
6311308Santhony.gutierrez@amd.comclass VectorRegisterFile : public SimObject
6411308Santhony.gutierrez@amd.com{
6511308Santhony.gutierrez@amd.com  public:
6611308Santhony.gutierrez@amd.com    VectorRegisterFile(const VectorRegisterFileParams *p);
6711308Santhony.gutierrez@amd.com
6811308Santhony.gutierrez@amd.com    void setParent(ComputeUnit *_computeUnit);
6911308Santhony.gutierrez@amd.com
7011308Santhony.gutierrez@amd.com    // Read a register
7111308Santhony.gutierrez@amd.com    template<typename T>
7211308Santhony.gutierrez@amd.com    T
7311308Santhony.gutierrez@amd.com    read(int regIdx, int threadId=0)
7411308Santhony.gutierrez@amd.com    {
7511308Santhony.gutierrez@amd.com        T p0 = vgprState->read<T>(regIdx, threadId);
7611642Salexandru.dutu@amd.com        DPRINTF(GPUVRF, "reading vreg[%d][%d] = %u\n", regIdx, threadId, (uint64_t)p0);
7711308Santhony.gutierrez@amd.com
7811308Santhony.gutierrez@amd.com        return p0;
7911308Santhony.gutierrez@amd.com    }
8011308Santhony.gutierrez@amd.com
8111308Santhony.gutierrez@amd.com    // Write a register
8211308Santhony.gutierrez@amd.com    template<typename T>
8311308Santhony.gutierrez@amd.com    void
8411308Santhony.gutierrez@amd.com    write(int regIdx, T value, int threadId=0)
8511308Santhony.gutierrez@amd.com    {
8611642Salexandru.dutu@amd.com        DPRINTF(GPUVRF, "writing vreg[%d][%d] = %u\n", regIdx, threadId, (uint64_t)value);
8711308Santhony.gutierrez@amd.com        vgprState->write<T>(regIdx, value, threadId);
8811308Santhony.gutierrez@amd.com    }
8911308Santhony.gutierrez@amd.com
9011308Santhony.gutierrez@amd.com    uint8_t regBusy(int idx, uint32_t operandSize) const;
9111308Santhony.gutierrez@amd.com    uint8_t regNxtBusy(int idx, uint32_t operandSize) const;
9211308Santhony.gutierrez@amd.com
9311308Santhony.gutierrez@amd.com    int numRegs() const { return numRegsPerSimd; }
9411308Santhony.gutierrez@amd.com
9511308Santhony.gutierrez@amd.com    void markReg(int regIdx, uint32_t operandSize, uint8_t value);
9611308Santhony.gutierrez@amd.com    void preMarkReg(int regIdx, uint32_t operandSize, uint8_t value);
9711308Santhony.gutierrez@amd.com
9811308Santhony.gutierrez@amd.com    virtual void exec(GPUDynInstPtr ii, Wavefront *w);
9911308Santhony.gutierrez@amd.com
10011308Santhony.gutierrez@amd.com    virtual int exec(uint64_t dynamic_id, Wavefront *w,
10111308Santhony.gutierrez@amd.com                     std::vector<uint32_t> &regVec, uint32_t operandSize,
10211308Santhony.gutierrez@amd.com                     uint64_t timestamp);
10311308Santhony.gutierrez@amd.com
10411308Santhony.gutierrez@amd.com    bool operandsReady(Wavefront *w, GPUDynInstPtr ii) const;
10511308Santhony.gutierrez@amd.com    virtual void updateEvents() { }
10611308Santhony.gutierrez@amd.com    virtual void updateResources(Wavefront *w, GPUDynInstPtr ii);
10711308Santhony.gutierrez@amd.com
10811308Santhony.gutierrez@amd.com    virtual bool
10911308Santhony.gutierrez@amd.com    isReadConflict(int memWfId, int exeWfId) const
11011308Santhony.gutierrez@amd.com    {
11111308Santhony.gutierrez@amd.com        return false;
11211308Santhony.gutierrez@amd.com    }
11311308Santhony.gutierrez@amd.com
11411308Santhony.gutierrez@amd.com    virtual bool
11511308Santhony.gutierrez@amd.com    isWriteConflict(int memWfId, int exeWfId) const
11611308Santhony.gutierrez@amd.com    {
11711308Santhony.gutierrez@amd.com        return false;
11811308Santhony.gutierrez@amd.com    }
11911308Santhony.gutierrez@amd.com
12011308Santhony.gutierrez@amd.com    virtual bool vrfOperandAccessReady(uint64_t dynamic_id, Wavefront *w,
12111308Santhony.gutierrez@amd.com                                       GPUDynInstPtr ii,
12211308Santhony.gutierrez@amd.com                                       VrfAccessType accessType);
12311308Santhony.gutierrez@amd.com
12411308Santhony.gutierrez@amd.com    virtual bool vrfOperandAccessReady(Wavefront *w, GPUDynInstPtr ii,
12511308Santhony.gutierrez@amd.com                                       VrfAccessType accessType);
12611308Santhony.gutierrez@amd.com
12711308Santhony.gutierrez@amd.com    SimplePoolManager *manager;
12811308Santhony.gutierrez@amd.com
12911308Santhony.gutierrez@amd.com  protected:
13011308Santhony.gutierrez@amd.com    ComputeUnit* computeUnit;
13111308Santhony.gutierrez@amd.com    int simdId;
13211308Santhony.gutierrez@amd.com
13311308Santhony.gutierrez@amd.com    // flag indicating if a register is busy
13411308Santhony.gutierrez@amd.com    std::vector<uint8_t> busy;
13511308Santhony.gutierrez@amd.com    // flag indicating if a register will be busy (by instructions
13611308Santhony.gutierrez@amd.com    // in the SIMD pipeline)
13711308Santhony.gutierrez@amd.com    std::vector<uint8_t> nxtBusy;
13811308Santhony.gutierrez@amd.com
13911308Santhony.gutierrez@amd.com    // numer of registers (bank size) per simd unit (bank)
14011308Santhony.gutierrez@amd.com    int numRegsPerSimd;
14111308Santhony.gutierrez@amd.com
14211308Santhony.gutierrez@amd.com    // vector register state
14311308Santhony.gutierrez@amd.com    VecRegisterState *vgprState;
14411308Santhony.gutierrez@amd.com};
14511308Santhony.gutierrez@amd.com
14611308Santhony.gutierrez@amd.com#endif // __VECTOR_REGISTER_FILE_HH__
147