Vortex 2.0 changes:
+ Microarchitecture optimizations + 64-bit support + Xilinx FPGA support + LLVM-16 support + Refactoring and quality control fixes
This commit is contained in:
@@ -1,3 +1,16 @@
|
||||
// Copyright © 2019-2023
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
#ifndef __WARP_H
|
||||
#define __WARP_H
|
||||
|
||||
@@ -7,28 +20,26 @@
|
||||
|
||||
namespace vortex {
|
||||
|
||||
class Arch;
|
||||
class Core;
|
||||
class Instr;
|
||||
class pipeline_trace_t;
|
||||
|
||||
struct DomStackEntry {
|
||||
DomStackEntry(const ThreadMask &tmask, Word PC)
|
||||
: tmask(tmask)
|
||||
, PC(PC)
|
||||
, fallThrough(false)
|
||||
, unanimous(false)
|
||||
, fallthrough(false)
|
||||
{}
|
||||
|
||||
DomStackEntry(const ThreadMask &tmask)
|
||||
: tmask(tmask)
|
||||
, PC(0)
|
||||
, fallThrough(true)
|
||||
, unanimous(false)
|
||||
DomStackEntry(const ThreadMask &tmask)
|
||||
: tmask(tmask)
|
||||
, fallthrough(true)
|
||||
{}
|
||||
|
||||
ThreadMask tmask;
|
||||
Word PC;
|
||||
bool fallThrough;
|
||||
bool unanimous;
|
||||
bool fallthrough;
|
||||
};
|
||||
|
||||
struct vtype {
|
||||
@@ -40,72 +51,58 @@ struct vtype {
|
||||
|
||||
class Warp {
|
||||
public:
|
||||
Warp(Core *core, uint32_t id);
|
||||
Warp(Core *core, uint32_t warp_id);
|
||||
|
||||
void clear();
|
||||
|
||||
bool active() const {
|
||||
return active_;
|
||||
}
|
||||
|
||||
void suspend() {
|
||||
active_ = false;
|
||||
}
|
||||
|
||||
void activate() {
|
||||
active_ = true;
|
||||
}
|
||||
|
||||
std::size_t getActiveThreads() const {
|
||||
if (active_)
|
||||
return tmask_.count();
|
||||
return 0;
|
||||
}
|
||||
void reset();
|
||||
|
||||
uint32_t id() const {
|
||||
return id_;
|
||||
return warp_id_;
|
||||
}
|
||||
|
||||
uint32_t getPC() const {
|
||||
Word getPC() const {
|
||||
return PC_;
|
||||
}
|
||||
|
||||
void setPC(uint32_t PC) {
|
||||
void setPC(Word PC) {
|
||||
PC_ = PC;
|
||||
}
|
||||
|
||||
void setTmask(size_t index, bool value) {
|
||||
tmask_.set(index, value);
|
||||
active_ = tmask_.any();
|
||||
}
|
||||
|
||||
uint32_t getTmask() const {
|
||||
if (active_)
|
||||
return tmask_.to_ulong();
|
||||
return 0;
|
||||
uint64_t getTmask() const {
|
||||
return tmask_.to_ulong();
|
||||
}
|
||||
|
||||
uint32_t getIRegValue(uint32_t reg) const {
|
||||
Word getIRegValue(uint32_t reg) const {
|
||||
return ireg_file_.at(0).at(reg);
|
||||
}
|
||||
|
||||
void eval(pipeline_trace_t *);
|
||||
uint64_t incr_instrs() {
|
||||
return issued_instrs_++;
|
||||
}
|
||||
|
||||
pipeline_trace_t* eval();
|
||||
|
||||
private:
|
||||
|
||||
void execute(const Instr &instr, pipeline_trace_t *trace);
|
||||
|
||||
UUIDGenerator uui_gen_;
|
||||
|
||||
uint32_t id_;
|
||||
uint32_t warp_id_;
|
||||
const Arch& arch_;
|
||||
Core *core_;
|
||||
bool active_;
|
||||
uint64_t issued_instrs_;
|
||||
|
||||
Word PC_;
|
||||
ThreadMask tmask_;
|
||||
|
||||
std::vector<std::vector<Word>> ireg_file_;
|
||||
std::vector<std::vector<FWord>> freg_file_;
|
||||
std::vector<std::vector<Byte>> vreg_file_;
|
||||
std::stack<DomStackEntry> dom_stack_;
|
||||
ThreadMask tmask_;
|
||||
|
||||
std::vector<std::vector<Word>> ireg_file_;
|
||||
std::vector<std::vector<uint64_t>> freg_file_;
|
||||
std::vector<std::vector<Byte>> vreg_file_;
|
||||
std::stack<DomStackEntry> ipdom_stack_;
|
||||
|
||||
struct vtype vtype_;
|
||||
uint32_t vl_;
|
||||
|
||||
Reference in New Issue
Block a user