【RISC-V 指令集】RISC-V 向量V扩展指令集介绍(一)-向量扩展编程模型
1. 引言
以下是《riscv-v-spec-1.0.pdf》文档的关键内容:
这是一份关于向量扩展的详细技术文档,内容覆盖了向量指令集的多个关键方面,如向量寄存器状态映射、向量指令格式、向量加载和存储操作、向量内存对齐约束、向量内存一致性模型、向量算术指令格式、向量整数和浮点算术指令、向量归约操作、向量掩码指令、向量置换指令、异常处理以及标准向量扩展等。
首先,文档定义了向量元素和向量寄存器状态之间的映射关系,并阐述了向量指令的格式。在此基础上,提出了配置设置指令,如vsetvl、ivsetiv和vlsetvl,用于设定向量长度(VL)和向量对齐长度(AVL)。
接着,文档详细说明了向量加载和存储操作,以及向量内存对齐和一致性模型。这些模型确保了向量操作的高效性和准确性。
然后,文档介绍了向量算术指令格式,包括向量整数、固定点和浮点算术指令。这些指令支持广泛的数学运算,为高性能计算提供了强大的支持。
此外,文档还涉及向量归约操作、掩码指令和置换指令,这些指令增强了向量操作的灵活性和功能性。
最后,文档讨论了异常处理机制,并列举了标准向量扩展指令列表。这些扩展指令为向量处理器提供了丰富的功能集,使其能够适应不同的应用场景和性能需求。
综上所述,这份文档为向量指令集的设计和实现提供了全面的指导和参考,有助于开发者更好地理解和利用向量处理器的能力。
【RISC-V 指令集】RISC-V 向量V扩展指令集介绍(一)-向量扩展编程模型-CSDN博客
【RISC-V 指令集】RISC-V 向量V扩展指令集介绍(二)-向量元素到向量寄存器状态的映射-CSDN博客
4 向量元素到向量寄存器状
2. 实现定义的常量参数
每个支持向量扩展的 hart 定义了两个参数:
- 任何操作可以产生或消耗的向量元素的最大位数(以位为单位),ELEN ≥ 8,必须是 2 的幂。
- 单个向量寄存器中的位数,VLEN ≥ ELEN,必须是 2 的幂,并且不得超过 216。
标准向量扩展(第节标准向量扩展)和架构配置文件可能会对 ELEN 和 VLEN 设置进一步的约束。
注意:未来的扩展可能会允许 ELEN > VLEN,通过使用多个向量寄存器的位来保存一个元素,但当前提案不包括此选项。
注意:VLEN 的上限允许软件知道索引将适合 16 位(当 LMUL=8 和 SEW=8,VLEN=65536 时,最大的 VLMAX 为 65536)。任何超过每个向量寄存器 64Kib 的未来扩展将需要新的配置指令,以便使用旧配置指令的软件不会看到更大的向量长度。
向量扩展支持编写二进制代码,该代码在特定约束下将在具有不同 VLEN 参数值的 hart 上可移植地执行,前提是 hart 支持所需的元素类型和指令。
注意:可以编写将暴露实现参数差异的代码。
注意:通常,具有活动向量状态的线程上下文在执行期间不能迁移到具有任何 VLEN 或 ELEN 参数差异的 hart 之间。
3. 向量扩展编程模型
量扩展为基本的标量RISC-V ISA添加了32个向量寄存器和七个非特权控制与状态寄存器CSR(vstart、vxsat、vxrm、vcsr、vtype、vl、vlenb)。
表1. 新的向量CSR
地址 | 权限 | 名称 | 描述 |
---|---|---|---|
0x008 | URW | vstart | 向量起始位置 |
0x009 | URW | vxsat | 定点饱和标志 |
0x00A | URW | vxrm | 定点舍入模式 |
0x00F | URW | vcsr | 向量控制和状态寄存器 |
0xC20 | URO | vl | 向量长度 |
0xC21 | URO | vtype | 向量数据类型寄存器 |
0xC22 | URO | vlenb | VLEN/8(向量寄存器长度(以字节为单位)) |
注意:四个CSR编号0x00B-0x00E暂时为将来的向量CSR预留,其中一些可能会映射到vcsr。
3.1. 向量寄存器
向量扩展在基础的标量RISC-V指令集架构上增加了32个架构向量寄存器,即v0-v31。每个向量寄存器都有一个固定的VLEN位状态。
3.2. mstatus中的向量上下文状态
一个向量上下文状态字段VS被添加到mstatus[10:9]中,并在sstatus[10:9]中进行了阴影处理。它的定义与浮点上下文状态字段FS类似。当mstatus.VS设置为Off时,尝试执行任何向量指令或访问向量CSR都会引发非法指令异常。当mstatus.VS设置为Initial或Clean时,执行任何改变向量状态的指令(包括向量CSR)都会将mstatus.VS更改为Dirty。实现也可以在任何时候将mstatus.VS从Initial或Clean更改为Dirty,即使向量状态没有发生变化。请注意,mstatus.VS的准确设置是一种优化。软件通常使用VS来减少上下文交换开销。如果mstatus.VS为Dirty,则mstatus.SD为1;否则,mstatus.SD根据现有规范进行设置。实现可能具有可写的misa.V字段。与浮点单元的处理方式类似,即使misa.V被清除,mstatus.VS字段也可能存在。
注意:允许在misa.V被清除时存在mstatus.VS,可以启用向量仿真,并简化具有可写misa.V的系统中mstatus.VS的处理。
3.3. vsstatus中的向量上下文状态
当存在hypervisor扩展时,一个向量上下文状态字段VS会被添加到vsstatus[10:9]中。它的定义与浮点上下文状态字段FS类似。当V=1时,vsstatus.VS和mstatus.VS都有效:当任一字段设置为Off时,尝试执行任何向量指令或访问向量CSR都会引发非法指令异常。当V=1且vsstatus.VS和mstatus.VS都未设置为Off时,执行任何改变向量状态的指令(包括向量CSR)都会将mstatus.VS和vsstatus.VS更改为Dirty。实现也可以在任何时候将mstatus.VS或vsstatus.VS从Initial或Clean更改为Dirty,即使向量状态没有发生变化。
如果vsstatus.VS为Dirty,则vsstatus.SD为1;否则,vsstatus.SD根据现有规范进行设置。如果mstatus.VS为Dirty,则mstatus.SD为1;否则,mstatus.SD根据现有规范进行设置。对于具有可写misa.V字段的实现,即使misa.V被清除,vsstatus.VS字段也可能存在。
3.4. 向量类型寄存器 vtype
只读、XLEN宽度的向量类型控制和状态寄存器(CSR)vtype提供了用于解释向量寄存器文件内容的默认类型,并且只能通过vset{i}vl{i}指令进行更新。向量类型决定了每个向量寄存器中元素的组织方式,以及多个向量寄存器如何分组。vtype寄存器还指示了如何处理向量结果中被屏蔽的元素以及当前向量长度之后的元素。
注意:仅通过vset{i}vl{i}指令允许更新,简化了vtype寄存器状态的维护。vtype寄存器有五个字段:vill、vma、vta、vsew[2:0]和vlmul[2:0]。位vtype[XLEN-2:8]应写为零,此字段中的非零值保留。
3.4.1. 向量选定元素宽度 vsew[2:0]
vsew中的值设置了动态选定的元素宽度(SEW)。默认情况下,向量寄存器被视为被划分为VLEN/SEW个元素。
3.4.2. 向量寄存器分组(vlmul[2:0])
多个向量寄存器可以组合在一起,以便单个向量指令可以对多个向量寄存器进行操作。本文中使用的术语“向量寄存器组”是指用作向量指令的单个操作数的一个或多个向量寄存器。向量寄存器组可用于为更长的应用向量提供更高的执行效率,但包含它们的主要原因是允许对双宽度或更大的元素以与单宽度元素相同的向量长度进行操作。当向量长度乘数(LMUL)大于1时,它代表组合以形成向量寄存器组的向量寄存器的默认数量。实现必须支持LMUL整数值为1、2、4和8。
注意:向量体系结构包括采用不同元素宽度但元素数量相同的多个源和目标向量操作数的指令。每个向量操作数的有效LMUL(EMUL)由容纳元素所需的寄存器数量决定。例如,对于扩展加法操作,如将32位值相加产生64位结果,双宽度结果需要单宽度输入的两倍LMUL。LMUL也可以是分数值,减少单个向量寄存器中使用的位数。当操作混合宽度值时,分数LMUL用于增加可用的有效向量寄存器组数量。
注意:如果LMUL仅为整数值,则在一系列大小上操作的循环将必须为最窄数据类型分配至少一个完整向量寄存器(LMUL=1),然后将消耗多个向量寄存器(LMUL>1)以形成每个更宽向量操作数的向量寄存器组。这可能会限制可用的向量寄存器组数量。通过分数LMUL,最宽的值只需占用单个向量寄存器,而较窄的值可以占用单个向量寄存器的一部分,允许在向量循环中使用所有32个体系结构向量寄存器名称来表示不同的值,即使处理混合宽度值也是如此。分数LMUL意味着向量寄存器的部分未使用,但在某些情况下,拥有更多较短的寄存器驻留向量相对于较少的较长寄存器驻留向量会提高效率。实现必须提供分数LMUL设置,允许最窄支持的类型占用向量寄存器的一部分,该部分对应于最窄支持类型的宽度与最大支持类型的宽度之比。通常,要求支持LMUL ≥ SEWMIN/ELEN,其中SEWMIN是最窄支持的SEW值,ELEN是最宽支持的SEW值。在标准扩展中,SEWMIN=8。对于ELEN=32的标准向量扩展,必须支持分数LMUL为1/2和1/4。对于ELEN=64的标准向量扩展,必须支持分数LMUL为1/2、1/4和1/8。
注意:当LMUL < SEWMIN/ELEN时,无法保证实现在分数向量寄存器中有足够的位数来存储至少一个元素,因为VLEN=ELEN是有效的实现选择。例如,对于VLEN=ELEN=32和SEWMIN=8,LMUL为1/8在向量寄存器中仅提供四位存储。对于给定的受支持分数LMUL设置,实现必须支持SEW设置在SEWMIN和LMUL * ELEN之间(包括两者)。尝试设置不受支持的SEW和LMUL配置会设置vtype中的vill位。vtype编码与LMUL < SEWMIN/ELEN的使用是保留的,但如果实现不支持这些配置,则可以设置vill。
注意:要求所有实现在这种情况下都设置vill将禁止在扩展中将来使用这种情况,因此为了允许将来定义LMUL<SEWMIN/ELEN的行为,我们认为这种情况的使用是保留的。注意:建议汇编程序在vsetvli指令尝试写入LMUL < SEWMIN/ELEN时提供警告(而不是错误)。LMUL由vtype中的有符号vlmul字段设置(即LMUL = 2^vlmul[2:0])。给定当前的SEW和LMUL设置,派生值VLMAX = LMUL*VLEN/SEW代表单个向量指令可以操作的最大元素数量,如下表所示。
当LMUL=2时,向量寄存器组包含向量寄存器vn和向量寄存器vn+1,提供两倍的向量长度(以位为单位)。指定具有奇数编号向量寄存器的LMUL=2向量寄存器组的指令是保留的。当LMUL=4时,向量寄存器组包含四个向量寄存器,而指定使用不是四的倍数的向量寄存器编号的LMUL=4向量寄存器组的指令是保留的。当LMUL=8时,向量寄存器组包含八个向量寄存器,而指定使用不是八的倍数的寄存器编号的LMUL=8向量寄存器组的指令是保留的。无论LMUL的值如何,掩码寄存器始终包含在一个单独的向量寄存器中。
3.4.3. 向量尾部不可知和向量掩码不可知 vta 和 vma
这两个位在执行向量指令期间分别修改目标尾部元素和目标非活动屏蔽元素的行为。尾部和非活动集包含在向量操作期间不接收新结果的元素位置,如“预启动、活动、非活动、主体和尾部元素定义”一节中所述。所有系统必须支持所有四个选项:
这段文本描述了在处理向量运算时,不同的LMUL值(即向量长度乘数)如何影响向量寄存器组的行为和组成。同时,还介绍了vta和vma这两个位如何改变向量指令执行过程中尾部元素和非活动屏蔽元素的行为。这些信息对于理解和实现向量处理器或相关软件库中的向量运算至关重要。
另外,需要注意的是,原文中提到的“保留的指令”通常指的是那些在当前上下文中未定义或不允许使用的指令。在这种情况下,尝试使用这些指令可能会导致未定义的行为或错误。因此,在编写或修改使用向量寄存器的代码时,应特别注意遵循相关的规范和约定。
目标掩码尾部元素总是被视为尾部不可知的,无论vta的设置如何。当一组被标记为“未扰动”时,向量寄存器组中的对应目标元素组保留它们之前持有的值。当一组被标记为“不可知”时,任何向量目标操作数中的对应目标元素组要么保留它们之前持有的值,要么被1覆盖。在单个向量指令中,每个目标元素可以保留不变,也可以被1覆盖,以任意组合方式存在。当使用相同的输入执行指令时,不要求未扰动或被1覆盖的模式是确定性的。
注意:添加不可知策略是为了适应具有向量寄存器重命名的机器。使用未扰动策略时,所有元素都必须从旧的物理目标向量寄存器中读取,然后复制到新的物理目标向量寄存器中。当这些非活动或尾部值对后续计算不必要时,这会导致效率低下。
选择所有1的值而不是所有0的值进行覆盖,是为了阻止软件开发者依赖该值。请注意编写方式。
一个简单的顺序实现可以忽略设置,而只是使用未扰动策略执行所有向量指令。但是,为了兼容性和支持线程迁移,必须在vtype中提供vta和vma状态位。
一个乱序实现可以选择使用尾部不可知+掩码未扰动来实现尾部不可知+掩码不可知,以降低实现复杂度。不可知结果策略的定义是松散的,以适应在小型顺序核心(可能使不可知区域保持未扰动)和具有寄存器重命名的大型乱序核心(可能使用1覆盖不可知元素)之间的hart上迁移应用程序线程。由于可能需要在中间重新启动,因此我们允许在单个向量指令中任意混合使用不可知策略。这种策略混合也支持可能针对不同向量寄存器粒度更改策略的实现,例如,在积极操作的粒度内使用未扰动,但对于尾部的粒度则重命名为全1。此外,除了掩码加载指令外,掩码结果的尾部任何元素也可以写入掩码生成操作使用vl=VLMAX计算的值。此外,对于掩码逻辑指令和vmsbf.m、vmsif.m、vmsof.m掩码操作指令,结果尾部的任何元素都可以写入掩码生成操作使用vl=VLEN、SEW=8和LMUL=8计算的值(即,可以覆盖掩码寄存器的所有位)。掩码尾部总是被视为不可知的,以降低管理掩码数据的复杂性,掩码数据可以以位粒度写入。软件似乎很少需要支持尾部未扰动的掩码寄存器值。允许生成掩码的指令写回指令的结果,避免了需要逻辑来屏蔽尾部的需求,但掩码加载不能将内存值写入目标掩码尾部,因为这意味着访问超出软件意图的内存。汇编语法向vsetvli指令添加了两个强制标志:
3.4.4. 向量类型非法 vill
vill位用于编码先前的vset{i}vl{i}指令尝试将不支持的值写入vtype的情况。请注意,vill位保持在CSR的XLEN-1位中,以支持通过符号位上的分支来检查非法值。在确定实现是否支持该值时,必须考虑vtype参数的所有位。
必须检查所有位以确保新代码在假设不支持的向量特性时会陷入vtype,而不是在旧实现上错误执行。设置了vill位的vtype值是不支持的值。如果设置了vill位,那么任何尝试执行依赖于vtype的向量指令都会引发非法指令异常。请注意,vset{i}vl{i}和整个寄存器加载、存储和移动不依赖于vtype。当设置了vill位时,vtype中的其他XLEN-1位应为零。
3.5. 向量长度寄存器 vl
XLEN位宽的只读vl CSR只能通过vset{i}vl{i}指令和仅故障向量加载指令变体进行更新。vl寄存器持有一个无符号整数,指定要用向量指令的结果更新的元素数量,如“预启动、活动、非活动、主体和尾部元素定义”一节中进一步详细描述的。vl中实现的位数取决于实现的最小支持类型的最大向量长度。注意,具有VLEN=32并支持SEW=8的最小向量实现将需要在vl中至少使用6位来保存值0-32(VLEN=32,LMUL=8和SEW=8时,VLMAX=32)。
3.6. 向量字节长度 vlenb
XLEN位宽的只读CSR vlenb保存值VLEN/8,即向量寄存器的长度(以字节为单位)。请注意,在任何实现中,vlenb中的值都是设计时常量。没有这个CSR,就需要几条指令来计算以字节为单位的VLEN,并且代码必须干扰当前的vl和vtype设置,这就要求保存和恢复它们。
3.7. 向量起始索引CSR vstart
vstart读写CSR指定了向量指令要执行的第一个元素的索引,如“预启动、活动、非活动、主体和尾部元素定义”一节中所述。通常,只有在向量指令发生陷阱时,硬件才会写入vstart,vstart的值表示发生陷阱的元素(可能是同步异常或异步中断),以及在处理可恢复陷阱后应恢复执行的元素。所有向量指令都定义为从vstart CSR中给出的元素编号开始执行,使目标向量中的较早元素保持不变,并在执行结束时将vstart CSR重置为零。请注意,所有向量指令,包括vset{i}vl{i},都将vstart CSR重置为零。引发非法指令异常的向量指令不会修改vstart。vstart CSR定义为只有足够的可写位来容纳最大元素索引(比最大值VLMAX小1)。最大向量长度是通过最大LMUL设置(8)和最小SEW设置(8)获得的,因此VLMAX_max = 8*VLEN/8 = VLEN。例如,对于VLEN=256,vstart将有8位来表示从0到255的索引。对于当前SEW设置,使用大于最大元素索引的vstart值是保留的。建议如果vstart越界,则实现陷阱。不需要陷阱,因为vstart上位的一个可能的未来用途是存储不精确的陷阱信息。vstart CSR可由无特权代码写入,但非零的vstart值可能会导致向量指令在某些实现上运行得大大减慢,因此应用程序程序员不应使用vstart。一些向量指令无法使用非零的vstart值执行,并将引发如下定义的非法指令异常。使vstart对无特权代码可见支持用户级线程库。允许实现在尝试使用vstart值执行向量指令时引发非法指令异常,该值在执行具有相同vtype设置的相同指令时实现无法产生。例如,一些实现在执行向量算术指令期间永远不会中断,而是等待指令完成后再进行中断。当vstart非零时,允许此类实现在尝试执行向量算术指令时引发非法指令异常。
注意:在将软件线程从具有不同微体系结构的两个hart之间迁移时,新的hart微体系结构可能不支持vstart值。接收hart上的运行时可能必须模拟指令执行,直到下一个支持的vstart元素位置。或者,迁移事件可以限制在相互支持的vstart位置上发生。
3.8. 向量定点舍入模式寄存器 vxrm
向量定点舍入模式寄存器在其最低有效位(vxrm[1:0])中包含一个两位的读写舍入模式字段。高位(vxrm[XLEN-1:2])应写为零。向量定点舍入模式给定一个单独的CSR地址以允许独立访问,但也反映在vcsr的一个字段中。请注意,可以使用单个csrwi指令在保存原始舍入模式的同时设置新的舍入模式。定点舍入算法指定如下。假设预舍入结果为v,并且该结果的d位将被舍去。那么舍入后的结果是 (v >> d) + r,其中r取决于下表中指定的舍入模式。
3.9. 向量定点饱和标志 vxsat
vxsat CSR(控制和状态寄存器)具有一个单独的读写最低有效位(vxsat[0]),该位指示是否有定点指令必须将输出值饱和以适应目标格式。位vxsat[XLEN-1:1]应写为零。vxsat位在vcsr中有镜像。
3.10. 向量控制和状态寄存器 vcsr
vxrm和vxsat这两个独立的CSR也可以通过向量控制和状态CSR vcsr中的字段进行访问。
3.11. 向量扩展在复位时的状态
在复位时,向量扩展必须处于一致的状态。特别是,vtype和vl必须具有可以使用单个vsetvl指令读取然后恢复的值。注意,建议在复位时,设置vtype.vill,vtype中的其余位为零,vl设置为零。在复位时,vstart、vxrm、vxsat CSRs可以具有任意值。
大多数使用向量单元的情况都需要一个初始的vset{i}vl{i},这将重置vstart。在使用之前,应在软件中显式重置vxrm和vxsat字段。在复位时,向量寄存器可以具有任意值。
【免费】RISC-V向量扩展指令集 VectorExtension资源-CSDN文库
相关文章:

【RISC-V 指令集】RISC-V 向量V扩展指令集介绍(一)-向量扩展编程模型
1. 引言 以下是《riscv-v-spec-1.0.pdf》文档的关键内容: 这是一份关于向量扩展的详细技术文档,内容覆盖了向量指令集的多个关键方面,如向量寄存器状态映射、向量指令格式、向量加载和存储操作、向量内存对齐约束、向量内存一致性模型、向量…...
K8s 镜像缓存管理 kube-fledged 认知
写在前面 博文内容为K8s 镜像缓存管理 kube-fledged 认知内容涉及: kube-fledged 简单介绍部署以及基本使用 理解不足小伙伴帮忙指正 不必太纠结于当下,也不必太忧虑未来,当你经历过一些事情的时候,眼前的风景已经和从前不一样了。…...
ModbusTcp协议
Modbus TCP是一种通信协议,用于工业设备之间的通信。它是Modbus协议家族中的一个成员,最初是为串行通信设计的,但后来扩展到了TCP/IP网络。Modbus TCP/IP是一种公开的标准,由Modbus组织制定,并且被广泛应用于工业自动化…...

常用工具——Gradle
前言 实践是最好的学习方式,技术也如此。 文章目录 前言一、Gradle 简介二、文件结构详解 一、Gradle 简介 Gradle 文件是一个独立于 android 之外的一个东西; 是什么 gradle 就是编译、打包 Android 工程的一个构建工具;build.gradle 文件&…...

OpenHarmony教程指南—Navigation开发 页面切换场景范例
简介 在应用开发时,我们常常遇到,需要在应用内多页面跳转场景时中使用Navigation导航组件做统一的页面跳转管理,它提供了一系列属性方法来设置页面的标题栏、工具栏以及菜单栏的各种展示样式。除此之外还拥有动态加载,navPathSta…...

2024-简单点-picamera2除了文档还有哪里可以学习实例?
picamera2学习例子 去github的picamera2库,找app和examples目录,然后学习...

JavaScript实现点击鼠标弹钢琴的效果
思路: 图片设置宽900px,找到鼠标按下时的x坐标和img距离body的x坐标,两个值相减,然后除100取整,赋值给a,通过判断a的值来确定放出那个音乐。 完整代码: <!DOCTYPE html> <html lan…...

docker-compose Install rustdesk
RustDesk RustDesk 是一款开源的远程支持和远程桌面工具,它旨在为用户提供便捷的远程协助和远程访问功能。 默认情况下,hbbs 监听21115(tcp), 21116(tcp/udp), 21118(tcp),hbbr 监听21117(tcp), 21119(tcp)。务必在防火墙开启这几个端口, 请注意21116同时要开启TCP和UDP。…...

初学C++
注释 变量 作用:给一段指定的内存空间起名,方便操作这段内容 数据类型 变量名 变量初始值; 常量 用于记录程序中不可更改的数据 宏常量: #define 宏常量 常量值 const修饰的变量: const 数据类型 常量名 常量值; 关键字 …...

数据分析-Pandas数据y轴双坐标设置
数据分析-Pandas数据y轴双坐标设置 数据分析和处理中,难免会遇到各种数据,那么数据呈现怎样的规律呢?不管金融数据,风控数据,营销数据等等,莫不如此。如何通过图示展示数据的规律? 数据表&…...

Android多线程实现方式及并发与同步,Android面试题汇总
一. 开发背景 想要成为一名优秀的Android开发,你需要一份完备的知识体系,在这里,让我们一起成长为自己所想的那样。 我们的项目需要开发一款智能硬件。它由 Web 后台发送指令到一款桌面端应用程序,再由桌面程序来控制不同的硬件设…...

2023年全国职业院校技能大赛中职组大数据应用与服务赛项题库参考答案陆续更新中,敬请期待…
2023年全国职业院校技能大赛中职组大数据应用与服务赛项题库参考答案陆续更新中,敬请期待… 武汉唯众智创科技有限公司 2024 年 2 月 联系人:辜渝傧13037102709 题号:试题01 模块三:业务分析与可视化 (一࿰…...

设计MySQL数据表的几个注意点
最近合作搞项目,发现了很多问题。特别的,数据库层面上的问题更为致命。记录一下,希望后面看到博客的同学们注意。 注意:以下观点只用于一般情况下的单体、微服务,不保证适用所有场景。 一、ID问题 ID名称问题 如下图…...
android 键盘遮挡输入框问题回忆
背景 刚开始做Android的时候,有一次遇到输入框位于页面底部,弹出的键盘老是遮挡输入框,这就给人一种感觉----不咋舒服。当时,网上百度了一遍,后面终于解决了,由于当时天天加班,没时间写博客&…...
ZJGSU 1737 链表
题目描述 请根据输入数据构造一个带头结点的单链表,链表结点的数据结构为struct node {int data; struct node *next;},试设计算法:按递增次序输出单链表中各结点的数据元素,并释放结点所占用的存储空间。 要求:不允…...

Java开发人员不得不收集的代码,java软件开发面试常见问题
前言 今年的金三银四已经过去一大半了,在这其中参与过不少面试,2021都说工作不好找,这也是对开发人员的要求变向的提高了。 之前在Github上收获15Kstar的Java核心神技(这参数,质量多高就不用我多说了吧)非…...

浅谈块存储、文件存储、对象存储
**块存储、文件存储和对象存储各自有其独特的特点和适用场景**。具体来说: 1. **块存储**: - 描述:块存储将存储空间分割成固定大小的块,这些块可以直接映射到主机操作系统。它提供的是原始的存储空间,不带文件系统…...
2024年 Python面试热点
当然,以下是一些Python相关的热点面试题: 请解释一下Python中的装饰器(Decorators)是什么,以及它们的主要用途是什么? 装饰器是Python中的一个高级功能,它允许用户修改或增强函数、方法或类的行…...

Map集合体系——遍历,HashMap,TreeMap,LikedHashMap
认识Map集合 Map集合体系特点 方法 代码示例 package com.zz.Map;import java.util.*;public class Test {public static void main(String args[]){Map<String, Integer> map new HashMap <>();//经典代码,按照键 无序 不重复 无索引map.put("…...

docker mysql主从复制
新建主服务器容器实例3301 mysql 主 3301 docker run -p 3301:3306 --name mysql-master \ -v /mydata/mysql-master/log:/var/log/mysql \ -v /mydata/mysql-master/data:/var/lib/mysql \ -v /mydata/mysql-master/conf:/etc/mysql \ -v /home/mysql/mysql-files:/var/lib/…...
基于算法竞赛的c++编程(28)结构体的进阶应用
结构体的嵌套与复杂数据组织 在C中,结构体可以嵌套使用,形成更复杂的数据结构。例如,可以通过嵌套结构体描述多层级数据关系: struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...
谷歌浏览器插件
项目中有时候会用到插件 sync-cookie-extension1.0.0:开发环境同步测试 cookie 至 localhost,便于本地请求服务携带 cookie 参考地址:https://juejin.cn/post/7139354571712757767 里面有源码下载下来,加在到扩展即可使用FeHelp…...

CentOS下的分布式内存计算Spark环境部署
一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架,相比 MapReduce 具有以下核心优势: 内存计算:数据可常驻内存,迭代计算性能提升 10-100 倍(文档段落:3-79…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序
一、开发准备 环境搭建: 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 项目创建: File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...
在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module
1、为什么要修改 CONNECT 报文? 多租户隔离:自动为接入设备追加租户前缀,后端按 ClientID 拆分队列。零代码鉴权:将入站用户名替换为 OAuth Access-Token,后端 Broker 统一校验。灰度发布:根据 IP/地理位写…...

Python爬虫(一):爬虫伪装
一、网站防爬机制概述 在当今互联网环境中,具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类: 身份验证机制:直接将未经授权的爬虫阻挡在外反爬技术体系:通过各种技术手段增加爬虫获取数据的难度…...

《基于Apache Flink的流处理》笔记
思维导图 1-3 章 4-7章 8-11 章 参考资料 源码: https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...
laravel8+vue3.0+element-plus搭建方法
创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...

HDFS分布式存储 zookeeper
hadoop介绍 狭义上hadoop是指apache的一款开源软件 用java语言实现开源框架,允许使用简单的变成模型跨计算机对大型集群进行分布式处理(1.海量的数据存储 2.海量数据的计算)Hadoop核心组件 hdfs(分布式文件存储系统)&a…...
探索Selenium:自动化测试的神奇钥匙
目录 一、Selenium 是什么1.1 定义与概念1.2 发展历程1.3 功能概述 二、Selenium 工作原理剖析2.1 架构组成2.2 工作流程2.3 通信机制 三、Selenium 的优势3.1 跨浏览器与平台支持3.2 丰富的语言支持3.3 强大的社区支持 四、Selenium 的应用场景4.1 Web 应用自动化测试4.2 数据…...