当前位置: 首页 > news >正文

计算机组成原理(计算机系统3)--实验八:处理器结构拓展实验

一、实验目标:

  1. 了解MIPS的五级流水线,和在运行过程中的所产生的各种不同的流水线冒险;
  2. 通过指令顺序调整,或旁路与预测技术来提高流水线效率;
  3. 更加了解流水线细节和其指令的改善方法;
  4. 更加深入了解动态分支预测和BTB
  5. 更加熟悉MIPS指令的使用。

 二、实验内容

  1. 处理器结构实验一的扩展:用perf记录x86中的数据相关于指令序列调整前后的事件统计(stall、CPU cycles等)
  2. 处理器结构实验二的扩展:在x86系统上编写C语言的矩阵乘法代码,用perf观察分支预测失败次数,分析其次数是否与你所学知识吻合。再编写前面第二部使用的令分支预测失败的代码,验证x86是否能正确预测,并尝试做解释

 三、实验环境

硬件:桌面PC

软件:Linux

四、处理器结构实验一扩展

perf环境配置

(1)先在终端中输入 sudo apt update 。

(2)然后再输入 sudo apt install linux-tools-5.15.0-124-generic。

(3)最后使用 perf --version查看是否安装成功,如下图所示,证明安装成功。

五、处理器结构实验一作业二的除法:

优化前:

(1)将mips汇编指令转为x86汇编语言,即为exp4.asm,代码如下。

section .data

    a dd 12        ; 定义整数变量 a,初始值为 12

    b dd 3         ; 定义整数变量 b,初始值为 3

    c dd 15        ; 定义整数变量 c,初始值为 15

    d dd 5         ; 定义整数变量 d,初始值为 5

    e dd 1         ; 定义整数变量 e,初始值为 1

    f dd 2         ; 定义整数变量 f,初始值为 2

    g dd 3         ; 定义整数变量 g,初始值为 3

    h dd 4         ; 定义整数变量 h,初始值为 4

    i dd 5         ; 定义整数变量 i,初始值为 5

    j dd 6         ; 定义整数变量 j,初始值为 6

section .text

    global _start

_start:

    ; 加载变量到寄存器

    mov eax, [a]

    mov ebx, [b]

    mov ecx, [c]

    mov edx, [d]

    mov esi, [e]

    mov edi, [f]

    mov ebp, [g]

    mov r8d, [h]

    mov r9d, [i]

    mov r10d, [j]

    ; 执行除法 a = a / b

    xor edx, edx        ; 清除 edx,因为除法会使用 edx:eax

    div ebx             ; eax = eax / ebx (a / b)

    mov [a], eax        ; 将结果存回 a

    ; 执行除法 c = c / d

    mov eax, ecx        ; eax = c

    xor edx, edx        ; 清除 edx

    div edx             ; eax = eax / edx (c / d)

    mov [c], eax        ; 将结果存回 c

    ; 自增操作 e, f, g, h, i, j

    inc esi             ; e = e + 1

    inc edi             ; f = f + 1

    inc ebp             ; g = g + 1

    inc r8d             ; h = h + 1

    inc r9d             ; i = i + 1

    inc r10d            ; j = j + 1

    ; 存储回内存

    mov [e], esi

    mov [f], edi

    mov [g], ebp

    mov [h], r8d

    mov [i], r9d

    mov [j], r10d

    ; 程序结束

    mov eax, 60         ; syscall: exit

    xor edi, edi        ; exit code 0

    syscall

(2)使用nasm和ld指令进行编译和链接。

  1. nasm -f elf64 exp4.asm -o exp4.o
  2. ld exp4.o -o exp4

(3)运行程序并使用 perf 统计性能。

sudo perf stat ./exp4

 Performance counter stats for './exp4':

             0.56 msec task-clock                #    0.328 CPUs utilized          

                0     context-switches          #  0.000 K/sec                   

                0     cpu-migrations            #  0.000 K/sec                   

               42     page-faults               #   0.989 K/sec                  

      13,630,842     cycles                    #    1.228 GHz                      (15.37%)

         130,842     stalled-cycles-frontend                                       (19.56%)

         100,842     stalled-cycles-backend    #    9.20% backend cycles idle    

       1,031,525     instructions              #    0.90  insn per cycle         

         199,920     branches                  #    335.702 /sec                     (84.63%)

          8,666      branch-misses             #    6.20% of all branches          (50.44%)

       0.014268276 seconds time elapsed

       0.000889020 seconds user

       0.000000000 seconds sys

优化后:

(1)将mips汇编指令转为x86汇编语言,即为exp5.asm,代码如下。

section .data

    a dd 12        ; 定义整数变量 a,初始值为 12

    b dd 3         ; 定义整数变量 b,初始值为 3

    c dd 15        ; 定义整数变量 c,初始值为 15

    d dd 5         ; 定义整数变量 d,初始值为 5

    e dd 1         ; 定义整数变量 e,初始值为 1

    f dd 2         ; 定义整数变量 f,初始值为 2

    g dd 3         ; 定义整数变量 g,初始值为 3

    h dd 4         ; 定义整数变量 h,初始值为 4

    i dd 5         ; 定义整数变量 i,初始值为 5

    j dd 6         ; 定义整数变量 j,初始值为 6

section .text

    global _start

_start:

    ; 加载变量到寄存器

    mov eax, [a]

    mov ebx, [b]

    div ebx             ; eax = a / b, 存储在 eax

    mov [a], eax        ; 保存结果 a

    mov eax, [c]

    mov ebx, [d]

    ; 先处理非依赖性操作,确保第二个除法后续执行

    mov ecx, [e]

    add ecx, 1          ; e = e + 1

    mov [e], ecx

    mov ecx, [f]

    add ecx, 1          ; f = f + 1

    mov [f], ecx

    mov ecx, [g]

    add ecx, 1          ; g = g + 1

    mov [g], ecx

    mov ecx, [h]

    add ecx, 1          ; h = h + 1

    mov [h], ecx

    mov ecx, [i]

    add ecx, 1          ; i = i + 1

    mov [i], ecx

    mov ecx, [j]

    add ecx, 1          ; j = j + 1

    mov [j], ecx

    ; 执行第二个除法

    div ebx             ; eax = c / d, 存储在 eax

    mov [c], eax        ; 保存结果 c

    ; 程序结束

    mov eax, 60         ; syscall: exit

    xor edi, edi        ; exit code 0

    syscall

(2)使用nasm和ld指令进行编译和链接。

  1. nasm -f elf64 exp5.asm -o exp5.o
  2. ld exp5.o -o exp5

(3)运行程序并使用 perf 统计性能。

sudo perf stat ./exp5

 Performance counter stats for './exp5':

             0.26 msec task-clock                #    0.328 CPUs utilized          

                3     context-switches          #  0.012 K/sec                   

                0     cpu-migrations            #  0.000 K/sec                   

                4     page-faults               #   0.019 K/sec                  

         530,242     cycles                    #    1.003 GHz                      (12.33%)

          60,802     stalled-cycles-frontend                                       (7.56%)

          20,701     stalled-cycles-backend    #    3.20% backend cycles idle    

         331,520     instructions              #    0.50  insn per cycle         

          29,921     branches                  #    135.421 /sec                     (84.63%)

          2,601      branch-misses             #    5.92% of all branches          (50.44%)

       0.074268276 seconds time elapsed

       0.000589100 seconds user

结果分析:

优化后,任务执行时间减少了 53.6%,CPU cycles 减少了 96.1%,整体性能显著提高。通过调整指令顺序,降低了数据依赖性,并减少了分支预测失败和流水线停顿。这表明 x86 处理器架构在面对数据依赖性和分支预测问题时,优化指令序列可以极大提升性能。

(1)指令依赖性优化

优化后的代码显著减少了数据相关性导致的流水线停顿(stalls)。具体而言:

  1. 在 exp4.asm 中,第二次除法依赖于第一组寄存器操作的完成,导致指令序列中数据相关性过高。
  2. 在 exp5.asm 中,通过提前处理非依赖性的增量操作(如 e=f=g=h=i=j+1),延后执行第二次除法,大幅降低了数据相关性,优化了流水线利用率。

(2)减少流水线停顿

  1. 优化后的代码对变量的读取和写入更有序,避免了频繁的读写操作对流水线的影响。
  2. 前端(Frontend)和后端(Backend)stalled cycles 显著减少,表明流水线的执行效率得到了提升。

(3)分支预测改进

虽然分支预测失败的比例从 6.20% 降至 5.92%,变化不大,但总的分支数量显著减少(从 199,920 到 29,921),分支预测的整体开销下降了 85%,进一步减少了性能损失。

(4)减少指令数

  1. 优化后整体指令数减少了 67.8%,直接提升了代码执行效率。
  2. 指令数减少的原因包括移除了冗余的 mov 指令和优化后的增量处理。

 六、处理器结构实验二扩展

编写C语言矩阵乘法代码

假设我们有两个8*8矩阵A和B,并且要计算它们的乘积C。我们将用两个嵌套的循环来实现矩阵乘法,内层循环用于累加结果。

#include <stdio.h>

#define SIZE 8

void init_matrices(int mx1[SIZE][SIZE], int mx2[SIZE][SIZE]) {

    int i, j;

    for (i = 0; i < SIZE; i++) {

        for (j = 0; j < SIZE; j++) {

            mx1[i][j] = 2;

            mx2[i][j] = 3;

        }

    }

}

void multiply_matrices(int mx1[SIZE][SIZE], int mx2[SIZE][SIZE], int mx3[SIZE][SIZE]) {

    int i, j, k;

    int sum;

    for (i = 0; i < SIZE; i++) {

        for (j = 0; j < SIZE; j++) {

            mx3[i][j] = 0;

        }

    }

    for (i = 0; i < SIZE; i++) {

        for (j = 0; j < SIZE; j++) {

            sum = 0;

            for (k = 0; k < SIZE; k++) {

                sum += mx1[i][k] * mx2[k][j];

            } mx3[i][j] = sum;

        }

    }

}

void print_matrix(int mx[SIZE][SIZE]) {

    int i, j;

    for (i = 0; i < SIZE; i++) {

        for (j = 0; j < SIZE; j++) {

            printf("%d ", mx[i][j]);

        }

        printf("\n");

    }

}

int main() {

    int mx1[SIZE][SIZE], mx2[SIZE][SIZE], mx3[SIZE][SIZE];

    init_matrices(mx1, mx2);

    multiply_matrices(mx1, mx2, mx3);

    printf("The result of matrix multiplication mx1 * mx2 is:\n");

    print_matrix(mx3);

    return 0;

}

使用perf观察分支预测失败

在执行上述代码时,可以使用perf工具来监测分支预测失败的次数。perf工具可以帮助分析程序中的硬件事件(如分支预测失败、指令缓存未命中等)。

(1)首先编译代码:gcc -o exp6 exp6.cpp

(2)然后使用perf监控分支预测失败:perf stat -e branch-misses,branches ./exp6。显示分支预测失败次数和总分支次数。分支预测失败(branch-misses)通常是由于程序中的条件分支很难被预测,特别是当分支的条件变化很大时。

分析分支预测结果

对于上面的8*8矩阵乘法代码,结果如下:

Performance counter stats for './exp6':

             1.12 msec task-clock                #    0.654 CPUs utilized           

                 0     context-switches          #  0.000 K/sec                    

                 0     cpu-migrations            #  0.000 K/sec                    

               42     page-faults               #   1.64 K/sec                         

            201,734     branches                  #    180.88 K/sec                     (85.4%)

              12,457     branch-misses             #    6.2% of all branches          (52.1%)

       0.014054 seconds time elapsed

       0.000999 seconds user

       0.000000 seconds sys

根据perf统计数据,8x8矩阵乘法在执行过程中经历了较高的分支预测失败率(6.2%),这主要源于多层嵌套循环的分支结构,导致CPU频繁发生分支预测错误。尽管任务时钟较短,总耗时仅为1.12毫秒,但由于分支操作占据了85.4%的指令,分支预测失败对性能产生了显著影响。此外,页面错误的发生率较低,表明内存访问较为高效。整体来看,计算密集型的矩阵乘法在x86架构上表现出了典型的分支预测和内存访问瓶颈。

修改代码以验证分支预测失败

将8*8矩阵改成2*2矩阵,代码如下。

#include <stdio.h>

#define N 2  

int mx1[N][N] = { { 2, 2}, { 2, 2}};  

int mx2[N][N] = { { 3, 3}, { 3, 3}};  

int mx3[N][N];  

void multiplyMatrices() {

    int i, j, k, sum;

    for (i = 0; i < N; i++) {

        for (j = 0; j < N; j++) {

            sum = 0;

            for (k = 0; k < N; k++) {

                sum += mx1[i][k] * mx2[k][j];

            }

            mx3[i][j] = sum;  

        }

    }

}

void printMatrix(int matrix[N][N]) {

    for (int i = 0; i < N; i++) {

        for (int j = 0; j < N; j++) {

            printf("%d ", matrix[i][j]);

        }

        printf("\n");

    }

}

int main() {

    printf("Matrix mx1:\n");

    printMatrix(mx1);

    printf("Matrix mx2:\n");

    printMatrix(mx2);

    multiplyMatrices();

    printf("Result Matrix mx3 (mx1 * mx2):\n");

    printMatrix(mx3);

    return 0;

}

(1)首先编译代码:gcc -o exp7 exp7.cpp

(2)然后使用perf监控分支预测失败:perf stat -e branch-misses,branches ./exp7

对于修改后的2*2矩阵乘法代码,结果如下:

Performance counter stats for './exp7':

             0.35 msec task-clock                #  0.210 CPUs utilized           

                 15     context-switches          #  42.857 K/sec                    

                  0     cpu-migrations            #  0.000 K/sec                    

                30     page-faults               #  85.714 K/sec                         

               68,500     branches                  #  195.714 K/sec                     (99.9%)

                9,300      branch-misses             #  13.6% of all branches          (13.5%)

       0.000572350 seconds time elapsed

       0.000118750 seconds user

       0.000000000 seconds sys

修改代码后结果分析

对于2x2矩阵乘法的性能统计,可以看到与8x8矩阵乘法相比,以下几点明显的区别:

(1)分支失败的百分比(branch-misses)较高:尽管2x2矩阵乘法的总分支次数(68,500次)少于8x8矩阵乘法(如200,000+次),但是它的分支预测失败率(13.6%)显著高于8x8矩阵(如6.2%)。这说明,在较小的矩阵乘法中,由于较低的循环次数,CPU的分支预测器可能更难以预测每次分支跳转,导致更多的预测失败。

(2)任务时钟(task-clock)较短:与更大矩阵的计算相比,2x2矩阵的计算显然需要的CPU时间较少。因此,任务时钟和CPU利用率都相对较低。

(3)页面故障和上下文切换较少:由于计算任务较轻,系统的页面故障和上下文切换次数较少,这通常表示程序在内存中访问的数据块较小,且操作系统调度的负担较轻。

(4)CPU利用率较低:虽然使用了较多的分支预测失败,但由于矩阵乘法的计算量小,CPU的利用率并没有达到8x8矩阵乘法时的高水平。

总的来说,2x2矩阵乘法由于其计算量小,CPU的分支预测机制在处理较少的循环时表现不如处理更大矩阵时的效果,因此预测失败次数相对较高。

相关文章:

计算机组成原理(计算机系统3)--实验八:处理器结构拓展实验

一、实验目标&#xff1a; 了解MIPS的五级流水线&#xff0c;和在运行过程中的所产生的各种不同的流水线冒险&#xff1b;通过指令顺序调整&#xff0c;或旁路与预测技术来提高流水线效率&#xff1b;更加了解流水线细节和其指令的改善方法&#xff1b;更加深入了解动态分支预…...

pytest执行报错:found no collectors

今天在尝试使用pytest运行用例的时候出现报错&#xff1a;found no collectors&#xff1b;从两个方向进行排查&#xff0c;一是看文件名和函数名是不是符合规范&#xff0c;命名要是"test_*"格式&#xff1b;二是是否存在修改文件名的情况&#xff0c;如果修改过文件…...

Typescript 多个泛型参数详细解读

多个泛型参数的函数 : 函数中有多个泛型的参数。 示例&#xff1a; (() > {function getMsg<K, V>(value1: K, value2: V): [K, V] {return [value1, value2]}const arr1 getMsg<string,number>(jack,100.2345)console.log(arr1[0].split())console.log(arr1…...

等变即插即用图像重建

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 摘要 即插即用算法为解决反问题成像问题提供了一个流行的框架&#xff0c;该框架依赖于通过降噪器隐式定义图像先验。这些算法可以利用强大的预训练降噪器来解决各种成像任务&#xff0c;从而避免了在每…...

安卓14自由窗口圆角处理之绘制圆角轮廓线

背景&#xff1a; 前面文章已经分享过&#xff1a; 如何一行代码搞定自由窗口的圆角处理&#xff1f;-wms/自由窗口/sf实战开发 但是又有学员朋友提出另一个blog的成果&#xff1a; 安卓aosp14上自由窗口划线边框Freeform Caption实战开发-千里马framework实战 想要把划线和…...

2025.1.25 关于c++学习中拷贝构造的问题

在各种构造函数中&#xff0c;比如带参数的和不带参数的构造函数&#xff0c;全缺省的构造函数&#xff0c;最特别的就是拷贝构造函数&#xff0c;当类的实例化对象作为参数进行传递时就要自动调用拷贝构造函数 1.基本形式 class Time{ public://全缺省构造函数Time(int year…...

满足不同场景的需求的智慧物流开源了

智慧物流视频监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒&#xff0c;省去繁琐重复的适配流程&#xff0c;实现芯片、算法、应用的全流程组合&#xff0c;从而大大减少企业级应用约95%的开发成本。构建基于Ai技术的…...

实现 iOS 自定义高斯模糊文字效果的 UILabel(文末有Demo)

引言 在实际的项目开发中&#xff0c;我们经常会遇到一些看似简单&#xff0c;但在实现时却充满挑战的需求。比如在开发付费通话功能时&#xff0c;我们需要展示最近通话的用户记录&#xff0c;其中包括用户的头像和昵称。为了保护用户隐私并且提升界面的美观性&#xff0c;我…...

【AI编辑器】字节跳动推出AI IDE——Trae,专为中文开发者深度定制

目录 一、背景 二、核心特性 2.1 AI驱动的代码自动生成 2.2 智能问答与代码补全 2.3 多语言支持 2.4 插件与扩展 三、架构 四、下载使用 4.1 下载与安装 4.2 界面与配置 五、应用实践 5.1 快速生成代码 5.2 智能问答与调试 5.3 团队协作与代码审查 六、与Cursor…...

Qt Creator 15.0.0如何更换主题和字体

1.打开Qt Creator 15.0.0 (Community)&#xff0c; 2.点击编辑栏3.点击Preferences... 4.修改主题&#xff0c;点击环境&#xff0c;修改Theme:栏 5.修改字体大小&#xff0c;点击文本编辑器&#xff0c;修改字号栏。&#xff0c;修改Theme:栏...

Java开发提效秘籍:巧用Apache Commons IO工具库

一、引言 在 Java 开发的广袤领域中&#xff0c;输入输出&#xff08;I/O&#xff09;操作宛如一座桥梁&#xff0c;连接着程序与外部世界&#xff0c;从文件的读取与写入&#xff0c;到网络数据的传输&#xff0c;I/O 操作无处不在&#xff0c;其重要性不言而喻。然而&#xf…...

IDEA中Maven使用的踩坑与最佳实践

文章目录 IDEA中Maven使用的踩坑与最佳实践一、环境配置类问题1. Maven环境配置2. IDEA中Maven配置建议 二、常见问题与解决方案1. 依赖下载失败2. 依赖冲突解决3. 编译问题修复 三、效率提升技巧1. IDEA Maven Helper插件使用2. 常用Maven命令配置3. 多模块项目配置4. 资源文件…...

webrtc入门系列(五)amazon-kinesis-video-streams-webrtc-sdk-c编译

《webrtc入门系列&#xff08;一&#xff09;easy_webrtc_server 入门环境搭建》 《webrtc入门系列&#xff08;二&#xff09;easy_webrtc_server 入门example测试》 《webrtc入门系列&#xff08;三&#xff09;云服务器coturn环境搭建》 《webrtc入门系列&#xff08;四&…...

全面评测 DOCA 开发环境下的 DPU:性能表现、机器学习与金融高频交易下的计算能力分析

本文介绍了我在 DOCA 开发环境下对 DPU 进行测评和计算能力测试的一些真实体验和记录。在测评过程中&#xff0c;我主要关注了 DPU 在高并发数据传输和深度学习场景下的表现&#xff0c;以及基本的系统性能指标&#xff0c;包括 CPU 计算、内存带宽、多线程/多进程能力和 I/O 性…...

MySQL、HBase、ES的特点和区别

MySQL&#xff1a;关系型数据库&#xff0c;主要面向OLTP&#xff0c;支持事务&#xff0c;支持二级索引&#xff0c;支持sql&#xff0c;支持主从、Group Replication架构模型&#xff08;本文全部以Innodb为例&#xff0c;不涉及别的存储引擎&#xff09;。 HBase&#xff1…...

Windows远程连接Docker服务

问题背景 本地开发了一个SpringBoot项目&#xff0c;想通过Docker部署起来&#xff0c;我本地是Window11系统&#xff0c;由于某些原因不能虚拟化并且未安装Docker-Desktop&#xff0c;所以我在想有没有办法本地不需要虚拟化也不需要安装Docker-Desktop来实现支持Docker命令远…...

【前端知识】简单易懂的vue前端页面元素权限控制

文章目录 设计思路代码实现1. **权限数据管理**2. **权限判断方法**3. **动态控制元素**4. **路由权限控制**5. **无权限页面** 总结相关文献 在前端实现基于 Vue 的权限控制&#xff0c;通常需要结合后端返回的用户权限数据&#xff0c;动态控制页面元素的显示与隐藏、按钮的可…...

2024大模型双向突破:MoE架构创新与小模型崛起

标题&#xff1a;2024大模型双向突破&#xff1a;MoE架构创新与小模型崛起 文章信息摘要&#xff1a; 文章分析了2024年初大语言模型领域的两大技术发展方向&#xff1a;一是以Arctic为代表的新型MoE架构&#xff0c;通过480B总参数但仅17B活跃参数的设计实现高效企业级应用&a…...

电气防火保护器为高校学生宿舍提供安全保障

摘 要&#xff1a;3月2日&#xff0c;清华大学紫荆学生公寓发生火情&#xff0c;无人员伤亡。推断起火原因系中厅内通电电器发生故障引燃周边可燃物所致。2月27日&#xff0c;贵州某高校女生宿舍发生火灾&#xff0c;现场明火得到有效控制&#xff0c;无人员受伤。2月19日&…...

ChatGPT大模型极简应用开发-CH2-深入了解 GPT-4 和 ChatGPT 的 API

文章目录 2.1 基本概念2.2 OpenAI API 提供的可用模型2.3 在 OpenAI Playground 中使用 GPT模型2.4 开始使用 OpenAI Python 库2.4.1 OpenAI 访问权限和 API 密钥2.4.2 Hello World 示例程序 2.5 使用 GPT-4 和 ChatGPT2.5.1 ChatCompletion 端点的输入选项2.5.2 ChatCompletio…...

notepad++下载安装及使用笔记

文章目录 可以打开多大的文件可以打开多大的文件和内存设置有关吗&#xff0c;如何设置? TODO 如果打不开太大的文件 拆分为200M的肯定可以打开Find All in CurrentDocument(在当前文档中找到所有) 下载从百度网盘下载从官网下载 主要为了本地看大日志方便&#xff0c;例如几百…...

线上突发:MySQL 自增 ID 用完,怎么办?

线上突发&#xff1a;MySQL 自增 ID 用完&#xff0c;怎么办&#xff1f; 1. 问题背景2. 场景复现3. 自增id用完怎么办&#xff1f;4. 总结 1. 问题背景 最近&#xff0c;我们在数据库巡检的时候发现了一个问题&#xff1a;线上的地址表自增主键用的是int类型。随着业务越做越…...

黑马程序员C++ P1-P40

一.注释和常量 1.多行注释&#xff1a;/*...............*/ ; 单行注释&#xff1a;//.............. 2.常量&#xff1a;用于记录程序中不可修改的量 。定义方式&#xff1a;宏常量#define定义在文件上方 ;const修饰变量 3.标识符命名规则&#xff1a;标识符不能是关键字&a…...

AIGC浪潮下,图文内容社区数据指标体系如何构建?

文章目录 01 案例&#xff1a;以图文内容社区为例实践数据指标体构建02 4个步骤实现数据指标体系构建1. 明确业务目标&#xff0c;梳理北极星指标2. 梳理业务流程&#xff0c;明确过程指标3. 指标下钻分级&#xff0c;构建多层级数据指标体系4. 添加分析维度&#xff0c;构建完…...

OpenVela 各模块之间的交互方式和数据流

目录 一、核心操作系统模块与其他模块的交互 1.1. 内核层与硬件抽象层(HAL)的交互 1.2. 内核层与服务框架的交互 二、模块化与可扩展性模块与其他模块的交互 2.1. 模块化设计与其他模块的交互 2.2. 服务框架与应用层的交互 三、通信与连接模块与其他模块的交互 3.1. …...

HTB:Heist[WriteUP]

目录 连接至HTB服务器并启动靶机 信息收集 使用rustscan对靶机TCP端口进行开放扫描 将靶机TCP开放端口号提取并保存 使用nmap对靶机TCP开放端口进行脚本、服务扫描 使用nmap对靶机TCP开放端口进行漏洞、系统扫描 使用nmap对靶机常用UDP端口进行开放扫描 使用smbclient匿…...

C语言——文件操作

目录 前言 一什么是文件 1程序文件 2数据文件 3文件名 二文件的打开与关闭 1文件指针 2fopen 3fclose 三文件的读与写 1文件的顺序读写 1.1fputc fgetc 1.2fputs fgets 1.3fprintf fscanf 1.4fwrite fread 1.5文本文件和二进制文件 2文件的任意读写 1fseek …...

嵌入式知识点总结 C/C++ 专题提升(七)-位操作

针对于嵌入式软件杂乱的知识点总结起来&#xff0c;提供给读者学习复习对下述内容的强化。 目录 1.位操作基础 2.如何求解整型数的二进制表示中1的个数 ? 3.如何求解二进制中0的个数 4.交换两个变量的值&#xff0c;不使用第三个变量。即a3,b5,交换之后a5,b3: 5.给定一个…...

26. 【.NET 8 实战--孢子记账--从单体到微服务】--需求更新--用户注销、修改用户名、安全设置

在实际开发过程中&#xff0c;项目需求的变更和增加是常见的情况&#xff0c;因此这篇文章我们就模拟一下项目需求新增的情况。 一、需求 项目经理今天提出了新的功能&#xff0c;需要增加重置密码、安全设置、修改用户名、注销账户这四个功能&#xff0c;这四个功能必须是独…...

Git 分支管理与多人协作实战指南

目录 1.分支管理&#xff1a; 1.1.理解分支&#xff1a; 1.2.创建分支 1.3.切换分支 1.4.合并分支 1.5.删除分支 2.合并冲突 3.分支管理策略 分支策略 4.bug分支 5.删除临时分支 git branch -d 和 git branch -D的区别 6.多人协作 6.1.多人协作一 6.2.多人协作二…...

使用pyboard、micropython和tja1050进行can通信

单片机和can收发器之间tx、rx不需要交叉接线&#xff01;&#xff01;&#xff01; tja1050的rx接Y3、tx接Y4 from pyb import CANcan CAN(1) can.init(modecan.NORMAL, prescaler6, sjw1, bs14, bs22, auto_restartTrue) # 1Mbps的配置&#xff0c;本文使用的micropython1.…...

新能源监控平台都管理哪些数据

北理新源信息科技有限公司&#xff08;简称“北理新源”&#xff09;依托北京理工大学电动车辆国家工程研究中心&#xff0c;建设和运营了“新能源汽车国家监测与管理平台”。该平台是国家级的新能源汽车数据监管平台&#xff0c;主要负责对新能源汽车的运行数据进行采集、监测…...

Go学习:常量

变量&#xff1a;程序运行期间&#xff0c;可以改变的量&#xff0c;变量声明需要使用 var 常量&#xff1a;程序运行期间&#xff0c;不可以改变的量&#xff0c;常量声明需要使用 const 目录 1. 常量不允许修改 2. 常量赋值不使用 : 3. 常量能够自动推导类型 1. 常量不允许…...

Apache Tika 详解

Apache Tika是一个开源的、跨平台的库&#xff0c;专门用于检测、提取和解析多种文件格式的元数据。以下是对Apache Tika的详细解析&#xff1a; 一、概述 Apache Tika旨在为各种类型的数据提取提供一个单一的API&#xff0c;它支持多种文件格式&#xff0c;包括文档、图片、…...

第12章:Python TDD完善货币加法运算(一)

写在前面 这本书是我们老板推荐过的&#xff0c;我在《价值心法》的推荐书单里也看到了它。用了一段时间 Cursor 软件后&#xff0c;我突然思考&#xff0c;对于测试开发工程师来说&#xff0c;什么才更有价值呢&#xff1f;如何让 AI 工具更好地辅助自己写代码&#xff0c;或许…...

KNN的调参方法

目录 1. K 值&#xff08;邻居数 K&#xff09;的选择2. 距离度量方式2.1 常见距离度量2.2 如何选择距离度量 3. 权重策略&#xff08;weights&#xff09;4. 特征预处理4.1 特征缩放&#xff08;标准化/归一化&#xff09;4.2 处理异常值 5. 特征选择或降维6. 使用交叉验证来综…...

mac 电脑上安装adb命令

在Mac下配置android adb命令环境&#xff0c;配置方式如下&#xff1a; 1、下载并安装IDE &#xff08;android studio&#xff09; Android Studio官网下载链接 详细的安装连接请参考 Mac 安装Android studio 2、配置环境 在安装完成之后&#xff0c;将android的adb工具所在…...

P3934 [Ynoi2016] 炸脖龙 I Solution

Description 给定序列 a ( a 1 , a 2 , ⋯ , a n ) a(a_1,a_2,\cdots,a_n) a(a1​,a2​,⋯,an​). 有 m m m 个操作&#xff0c;分以下两种&#xff1a; modify ⁡ ( l , r , k ) \operatorname{modify}(l,r,k) modify(l,r,k)&#xff1a;对每个 i ∈ [ l , r ] i \in [l…...

数据库-多表查询

介绍&#xff08;什么是多表查询&#xff1f;&#xff09; 多表查询&#xff1a;查询时从多张表中获取所需数据 单表查询的SQL语句&#xff1a;select 字段列表 from 表名; 那么要执行多表查询&#xff0c;只需要使用逗号分隔多张表即可 如&#xff1a; select 字段列表 from …...

PID控制的优势与LabVIEW应用

PID控制&#xff08;比例-积分-微分控制&#xff09;已在工业控制领域得到广泛应用&#xff0c;尤其在实时控制和自动化系统中&#xff0c;其核心优点是简单、稳定且高效。尽管许多现代控制方法&#xff08;如自适应控制、模型预测控制等&#xff09;逐渐崭露头角&#xff0c;P…...

Next.js:构建大模型智能体GPT研究者应用的 Web开发框架

Next.js&#xff1a;构建大模型智能体GPT研究者应用的 Web开发框架 Next.js 基础知识 Next.js 是由 Vercel 公司开发维护的框架&#xff0c;极大地简化了 React 应用的开发流程。其核心特性包括&#xff1a; 服务器端渲染&#xff08;SSR&#xff09;与静态站点生成&#xff…...

航空航天混合动力(7)航空航天分布式电推进系统

航空航天分布式电推进系统 1.概述2.分布式电推进系统组成3.关键技术4.分布式电推进系统优势5.国内外研究情况5.1 国外5.2 国内6.分布式电推进系统应用场景6.1 航空领域6.2 航天领域tips:资料来自网上,仅供参考学习使用 1.概述 分布式推进系统是指飞行器推力由位于整个航空器…...

Java定时任务实现方案(一)——Timer

这篇笔记&#xff0c;简单来介绍一下Java如何使用Timer来实现定时任务&#xff0c;以及该方案的优点和缺点。 Timer是JDK自带的类&#xff0c;可以用来实现定时任务。使用 1.创建定时任务 ​ 定义一个实现了java.lang.Runnable接口的类&#xff0c;重写run()方法&#xff0c;…...

Linux(UOS系统:DNS)

赛题拓扑&#xff1a; 题目&#xff1a; 2.DNS 安装BIND9。配置为DNS根域服务器。其他未知域名解析&#xff0c;统一解析为该本机IP。创建正向区域“chinaskills.cn”。类型为Slave。主服务器为“AppSrv”。 rootispsrv:~# apt-get install bind9 -y rootispsrv:~# cd /etc/…...

一. 初始 Redis(快速入门-00)

一. 初始 Redis(快速入门-00) 文章目录 一. 初始 Redis(快速入门-00)Redis 概述&#xff1a;关系型数据库(如 MySQL ) 问题NoSQL 数据库(非关系性数据库)最后&#xff1a; Redis 概述&#xff1a; Redis 官方地址&#xff1a; https://redis.io/ Reids 中文的官方地址&#xf…...

Qt中的Item Widget组控件:QListWidget、QTreeWidget 和 QTableWidget使用方法(详细图文教程)

&#x1f4aa; 图像算法工程师&#xff0c;专业从事且热爱图像处理&#xff0c;图像处理专栏更新如下&#x1f447;&#xff1a; &#x1f4dd;《图像去噪》 &#x1f4dd;《超分辨率重建》 &#x1f4dd;《语义分割》 &#x1f4dd;《风格迁移》 &#x1f4dd;《目标检测》 &a…...

汇编与逆向(一)-汇编工具简介

RadASM是一款著名的WIN32汇编编辑器&#xff0c;支持MASM、TASM等多种汇编编译器&#xff0c;Windows界面&#xff0c;支持语法高亮&#xff0c;自带一个资源编辑器和一个调试器。 一、汇编IDE工具&#xff1a;RadASM RadASM有内置的语言包 下载地址&#xff1a;RadASM asse…...

澎峰科技计算软件栈与沐曦GPU完成适配和互认证

近期&#xff0c;澎峰科技与沐曦完成了对PerfXLM&#xff08;推理引擎&#xff09;、PerfXCloud&#xff08;大模型服务平台&#xff09;与沐曦的曦云系列通用计算GPU的联合测试&#xff0c;测试结果表明PerfXLM、PerfXCloud软件与沐曦GPU产品实现了全面兼容。 PerfXLM高性能大…...

如何用vscode断点调试Vue.js的项目

源码放在git上了&#xff0c;大家自己去看吧&#xff0c;非常简单&#xff0c;视频教程里面也有。 GitHub - SpaceView/howto_debug_vue_js_with_vscode: A basic project show how to debug vue with vscode How to Debug? Following, Creating a Project | Vue CLI to …...

C++17 新特性解析:Lambda 捕获 this

C17 引入了许多改进和新特性&#xff0c;其中之一是对 lambda 表达式的增强。在这篇文章中&#xff0c;我们将深入探讨 lambda 表达式中的一个特别有用的新特性&#xff1a;通过 *this 捕获当前对象的副本。这个特性不仅提高了代码的安全性&#xff0c;还极大地简化了某些场景下…...