6.5aaaaa

3753------没理清

数位DP,说白了也还是DP,找好状态,定义好状态转移

pos当前第几位,prev为前一位数字,trend为前面的关系,然后tight是否紧贴

到本位时,就看tight,如果是1,就可以选择两条路,即继续紧贴,或者就随便选

然后如果不是1,就随便选

不过是给定了一个区间a,b问a,b之间的数量,这如何求解?就比如a是一位数,b是5位数的

dfs就是求从0到num的res数量,然后前缀和去减

为什么一定要在外层包装一个coutUpTo?这样会导致DP不共用

badCode

复制代码
class Solution {
public:
    long long totalWaviness(long long num1, long long num2) {
        long long res=0;
        auto dfs=[&](auto&&self,string num,int pos,int prev,int trend,bool tight){
            if(pos>=num.size()){return 0;}
            if(dp[]){return dp[];}
            int cur_num=num[pos]-'0',maxNum=tight?cur_num-1:9,cnt=0,minNum=(pos==0)?1:0,n_trend;
            if(tight){
                if(cur_num>prev){
                    n_trend=1;
                    if(trend==2){cnt++;}
                }
                else if(cur_num<prev){
                    n_trend=2;
                    if(trend==1){cnt++;}
                }
                else{n_trend=0;}
                cnt+=self(self,num,pos+1,cur_num,n_trend,tight);
                if(cur_num==1){
                    dp[]=cnt;
                    return dp[];
                }
            }
            for(int i=minNum;i<=maxNum;i++){
                if(i>prev){
                    n_trend=1;
                    if(trend==2){cnt++;}
                }
                else if(i<prev){
                    n_trend=2;
                    if(trend==1){cnt++;}
                }
                else{n_trend=0;}
                cnt+=self(self,num,pos+1,i,n_trend,false);
            }
            dp[]=cnt;
            return dp[];

        };
        int begTrend2;
        //这里确定一下从第三个字开始时,前两个字的Trend;需要特判一下长度不超过2的情况,因为这样会非法;
        //然后dfs的时候就直接从第3位开始;
        return dfs(dfs,to_string(num2),2,-)
    }
};

class Solution {
public:
    long long totalWaviness(long long num1, long long num2) {
        long long res=0;
        vector<vector<vector<vector<long long>>>>dp(18,
            vector<vector<vector<vector<long long>>>(18,vector<vector<long long>>(10,vector<long long>(3,-1)));
        auto dfs=[&](auto&&self,string num,int pos,int prev,int trend,bool tight){
            if(pos==num.size()){return 0LL;}
            int ntrend=0,nTight;
            if(!tight&&prev!=-1&&dp[pos][prev][trend]!=-1){
                return dp[pos][prev][trend];
            }
            long long cnt=0;
            int maxNum=tight?num[pos]-'0':9;
            int minNum=(pos==0)?1:0;
            for(int d=minNum;d<=maxNum;d++){
                bool nTight=tight&&(d==maxNum);
                if(prev!=-1){
                    //计算nTrend
                    if(d>prev){nTrend=1;}
                    else if(d<prev){nTrend=2;}
                    else{nTrend=0;}
                    //计算cnt
                    if(pos>=2){
                        if(trend==1&&prev>d){cnt++;}//1为上升
                        else if(trend==2&&prev<d){cnt++;}//2为下降
                    }
                }
                cnt+=self(self,num,pos+1,d,nTrend,nTight);
            }
            if(!tight){
                dp[pos][prev][trend]=cnt;
            }
            return cnt;
        };
        string snum1=to_string(num1-1),snum2=to_string(num2);
        return dfs(dfs,snum2,0,-1,0,true)-dfs(dfs,snum1,0,-1,0,true);
    }
};

流水线拆分

IF

BTB

这个BTB的用处在哪里?我现在理解的是,分支预测会在每取出一条指令后就对该指令后的下一条指令做预测(这里预测的是指令的地址,还是指令本身?);最开始先是pc得到next_pc,然后在IF阶段去ICACHE里找这个pc所对应的指令,这时候就已经开始预测了吗?就是在IF取值的时候,用的是BTB给出的pc?

什么叫"taken branch"带来的气泡?以及PFS选出fetch_pc=X时,X所对应的那个指令应该就处于IF阶段吧,然后TLB翻译X,但是ICache又去取X对应的指令,ICache里存的也是虚拟地址吗?就是TLB如果不翻译成物理地址,ICache怎么取?什么是taken branch?

对于ICache,如果在第N拍,x对应的指令在IF阶段去让ICache取指令,但是ICache miss了,那N+1拍,即x的ID阶段,取不到指令,ICache还在往RAM上找,这会怎么办?

推进有效条件

测试

当前推荐的工作指令流是:

# 1. 进入 chiplab 工作目录

cd /home/jiake/project/learn/newCpu

# 2. 设置环境

export CHIPLAB_HOME=$PWD

export PATH=$CHIPLAB_HOME/toolchains/loongson-gnu-toolchain-8.3-x86_64-loongarch32r-linux-gnusf-v2.0/bin:$PATH

改 CPU 代码只进 myCPU:

cd /home/jiake/project/learn/newCpu/IP/myCPU

# 修改 RTL 后

git status

git add .

git commit -m "your message"

git push

跑 func 测试:

cd /home/jiake/project/learn/newCpu/sims/verilator/run_prog

./configure.sh --run func/func_lab19 --disable-trace-comp --disable-simu-trace --output-uart-info --threads 8

make -j8 compile

make clean_soft

make -j8 soft

make -j8 run BUS_DELAY=n DUMP_WAVEFORM=0

如果只是重复跑同一个测试、没有改 RTL:

cd /home/jiake/project/learn/newCpu/sims/verilator/run_prog make -j8 run BUS_DELAY=n DUMP_WAVEFORM=0

如果改了 IP/myCPU 的 RTL,至少重新:

make -j8 compile

make -j8 run BUS_DELAY=n DUMP_WAVEFORM=0

范式

我现在理解的就是对于原来的,在module里直接声明的各类一条一条的信号,就是通过pack,把相关的所有信号打包在一起,比如流水线间的传递,异常相关等,就是按功能分类凑在一起;然后到取的时候再assign取出来;然后那些package都定义在.sv文件中;不过为什么要叫pipline_type?感觉就是一个记录所有package类型的,total之类的名字可能更合适?

TLB

Res

if2id

END

相关推荐
江畔柳前堤7 小时前
大语言模型分布式训练:从并行策略到万卡工程的系统梳理
人工智能·分布式·深度学习·算法·目标检测·机器学习·语言模型
Forever Nore8 小时前
LeetCode 4 寻找两个正序数组的中位数 - 二分
算法·leetcode
罗西的思考10 小时前
【OpenClaw具身硬件】MiniClaw 阅读笔记---(1)基础
人工智能·算法·机器学习
蛋先生DX10 小时前
大模型参数存储格式揭秘:BF不是男朋友
深度学习·算法·llm
爱跳舞的烤冷面11 小时前
自学嵌入式第22天(数据结构——哈希)
数据结构·算法·哈希算法
猎嘤一号11 小时前
博弈论(Game Theory)的理论、算法与工程
人工智能·算法·安全·博弈论
月光船幽幽11 小时前
影子模式下保护 logits 不被修改
人工智能·python·算法
马拉AI11 小时前
腾讯开源 Agent 记忆系统,AI“换对话就忘”的问题有了新解法(附安装使用教程)
人工智能·算法·开源·科研
地平线开发者13 小时前
征程6工具链模型X86推理方式说明
算法
地平线开发者13 小时前
【征程6】校准量化中HistogramObserver解析
算法