Monotonic Chunkwise Attention(MoChA)——李宏毅人类语言处理

本文介绍了一种改进的Attention机制——动态Window Attention。该方法通过引入一个判断机制来决定是否将注意力窗口放置在当前位置,若不合适则向右移动。在选定的窗口内进行Attention操作,并输出一个token。

其是想在attention上做一些改变,我们可以把他想成是动态的移动我们的window。
here?:吃两个输入,z0和h,输出Yes/No,选择是否将window放在这里,如果No的话往右移动。
在这里插入图片描述
在这里插入图片描述
在此window内做attention,一个window输出一个token,不输出null

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

<think>我们正在讨论Monotonic Time(单调时间)的概念及其在操作系统中的实现原理。根据用户的问题,需要明确Monotonic Time的定义,并解释其实现原理。同时,用户提供了一些引用,但其中部分引用可能不直接相关(如引用[1]描述的是时间原点,引用[2]是关于过时的函数,引用[3][4]是定时器设置和更新,引用[5]是人工智能历史),我们需要聚焦于单调时间的核心内容。 ### Monotonic Time 的定义 Monotonic Time(单调时间)是指一个**单向递增**的时间计数器,它不受系统时间调整(如NTP同步、手动修改系统时间)的影响。其关键特性包括: 1. **单调性**:时间值只增不减,确保时间差值的计算总是非负。 2. **连续性**:理想情况下,时间值应连续递增,但实际可能受硬件限制而离散递增。 3. **系统范围**:通常在整个系统范围内有效(不同进程看到的单调时间是一致的)。 4. **与挂钟时间无关**:单调时间通常不表示真实时间(如年月日),而是从某个未指定的起点开始计数(可能是系统启动时刻)。 在Linux中,单调时间通常以纳秒为单位,通过`CLOCK_MONOTONIC`时钟ID表示(用户空间通过`clock_gettime()`获取)。其起点(epoch)通常是系统启动时刻,但具体起点未公开(以避免依赖)。 ### 实现原理 操作系统中单调时间的实现依赖于硬件和软件协同工作,主要分为以下层次: #### 1. 硬件层:时钟源(Clocksource) 操作系统通过硬件时钟源获取原始时间计数。常见的时钟源包括: - **TSC(Time Stamp Counter)**:现代x86 CPU内置的64位寄存器,以CPU主频递增计数。具有纳秒级精度和极低访问开销(通过`rdtsc`指令读取)。内核通过`constant_tsc`和`nonstop_tsc`标志验证其在多核间的一致性和稳定性[^1]。 - **HPET(High Precision Event Timer)**:独立于CPU的硬件定时器,提供全局统一的计时,精度约100纳秒。 - **ACPI PM Timer**:旧系统使用,精度较低(约300纳秒)。 内核启动时通过`clocksource_select()`自动选择最佳时钟源(优先TSC)[^1]。时钟源需满足: - **稳定性**:频率稳定(不受CPU频率调整影响)。 - **一致性**:多核CPU间计数同步(TSC需满足`constant_tsc`特性)。 #### 2. 内核抽象层:时间维护(Timekeeping) Linux内核通过`struct timekeeper`全局维护单调时间: ```c struct timekeeper { struct clocksource *clock; // 当前时钟源 u64 cycle_interval; // 每个滴答的时钟周期数 u64 nsec_scale; // 周期数到纳秒的转换因子 u64 xtime_nsec; // 当前单调时间(纳秒) ... }; ``` **更新机制**: - 时钟中断(如`tick_handle_periodic()`)或高精度定时器(hrtimer)触发时间更新。 - 每次中断时,读取时钟源的当前周期值,计算自上次更新以来的增量周期数$\Delta C$。 - 将$\Delta C$转换为纳秒:$\Delta T = \Delta C \times \text{nsec\_scale}$。 - 累加到`xtime_nsec`:`xtime_nsec += \Delta T`。 #### 3. 高精度与低开销:动态滴答(Tickless)和 hrtimer - **动态滴答(Tickless Kernel)**: 当CPU空闲时,内核暂停周期性的时钟中断(tick),通过设置下一个到期事件(如hrtimer)唤醒CPU。这减少了功耗,同时确保单调时间在唤醒后通过计算空闲期间的增量时间正确更新[^4]。 - **高精度定时器(hrtimer)**: 提供微秒级精度的定时器,用于替代传统低精度定时器。其核心机制: - 使用红黑树管理定时器,按到期时间排序。 - 当设置新定时器时,仅对最早到期的定时器调用`timerfd_settime()`(系统调用),避免频繁系统调用[^3]。 #### 4. 用户空间接口 用户程序通过系统调用获取单调时间: - `clock_gettime(CLOCK_MONOTONIC, &ts)`:获取秒和纳秒格式的单调时间。 - `clock_gettime(CLOCK_MONOTONIC_RAW)`:获取未经NTP调整的原始单调时间(避免NTP微调引入的非单调性)。 ### 关键保障机制 - **单调性保证**: 时间更新仅做加法操作(`xtime_nsec += delta`)。若检测到时钟源回退(如CPU降频导致TSC计数减少),则丢弃异常值并重新校准。 - **多核同步**: 通过`clocksource_mask`标记跨核一致的时钟源(如TSC),并配合读写锁(`timekeeper.lock`)保护全局时间状态。 - **与挂钟时间隔离**: 系统时间同步(如NTP/PTP)仅修改`CLOCK_REALTIME`,不影响`CLOCK_MONOTONIC`[^1]。 ### 工作流程示例 ```mermaid graph TD A[硬件时钟源 TSC/HPET] -->|读取周期计数| B(计算增量周期 ΔC) B -->|乘以缩放因子| C[转换为纳秒 ΔT] C --> D[累加到 xtime_nsec] D -->|用户空间查询| E[clock_gettime CLOCK_MONOTONIC] F[hrtimer 到期] -->|触发中断| G[更新时间] G --> D ``` ### 总结 Monotonic Time 的实现核心是: 1. **硬件时钟源**提供原始计数。 2. **内核时间子系统**将计数转换为纳秒并维护单调递增。 3. **动态滴答和hrtimer**确保高精度与低开销。 4. **隔离机制**避免系统时间调整影响单调性。 此机制是实时系统、性能分析和分布式协调的基础。 --- §§相关问题§§ 1. TSC 时钟源在多核 CPU 上如何保证计数一致性? 2. 动态滴答(Tickless)模式如何影响系统响应延迟? 3. 用户空间程序如何利用 `CLOCK_MONOTONIC` 实现高精度计时? 4. 时钟源漂移(Clock Drift)时内核如何进行补偿? [^1]: 硬件时钟源选择与校准机制 [^3]: 高精度定时器初始化与启动流程 [^4]: hrtimer 到期时间管理与红黑树操作</think>### Monotonic Time 的定义与实现原理 #### 一、Monotonic Time 核心定义 1. **基本概念** Monotonic Time(单调时间)是**严格单向递增**的时间计数器,其核心特性包括: - **单调性**:时间值只增不减($T_{n+1} \geq T_n$),不受系统时间调整影响 - **连续性**:理想情况下连续递增(实际实现可能为离散递增) - **系统范围**:整个操作系统范围内有效 - **与挂钟时间无关**:不表示真实时间(如年月日),仅表示时间流逝量 2. **关键特性对比** | 时间类型 | 是否单调 | 是否受NTP影响 | 典型用途 | |-------------------|----------|---------------|------------------------| | `CLOCK_REALTIME` | ❌ | ✅ | 文件时间戳、日志记录 | | `CLOCK_MONOTONIC` | ✅ | ❌ | 性能分析、超时控制 | | `CLOCK_BOOTTIME` | ✅ | ❌ | 包含系统休眠的时间统计 | 3. **时间原点(Epoch)** Linux 单调时间以**系统启动时刻**为原点($T_0$),而非真实时间(如1970-01-01 UTC)[^1]。用户空间获取的是从 $T_0$ 开始的纳秒计数: ```c struct timespec ts; clock_gettime(CLOCK_MONOTONIC, &ts); // ts.tv_sec 秒级计数 // ts.tv_nsec 纳秒级计数 ``` #### 二、实现原理分层解析 ##### 1. 硬件层:时钟源抽象 内核通过 `clocksource` 框架抽象硬件计时器: ```c struct clocksource { u64 (*read)(void); // 读取硬件计数函数指针 u64 mask; // 计数器位宽掩码 u32 mult; // 周期转纳秒的乘数 u32 shift; // 位移优化计算 const char *name; // 时钟源名称(如"tsc") }; ``` - **典型时钟源**: - **TSC**(Time Stamp Counter):CPU内置寄存器,`rdtsc` 指令读取 - **HPET**:高精度事件定时器(精度 ~100ns) - **KVM clock**:虚拟化环境专用时钟 时钟源选择策略: ```mermaid graph LR A[检测硬件] --> B{TSC可用?} B -->|是| C[验证constant_tsc/nonstop_tsc] C -->|通过| D[选择TSC为默认时钟源] B -->|否| E[选择HPET或ACPI PM] ``` ##### 2. 内核层:时间维护机制 **核心数据结构**: ```c struct timekeeper { struct clocksource *clock; // 当前时钟源 u64 cycle_interval; // 每个tick的周期数 u64 xtime_nsec; // 当前单调时间(纳秒) u32 mult; // 周期转纳秒系数 ... }; ``` **时间更新流程**: 1. 时钟中断触发 `tick_handle_periodic()` 2. 调用 `update_wall_time()` 3. 计算增量时间: $$ \Delta T = \frac{(C_{\text{current}} - C_{\text{last}}) \times \text{mult}}{2^{\text{shift}}} $$ 4. 更新单调时间:`xtime_nsec += \Delta T`[^4] ##### 3. 高精度实现:hrtimer与动态滴答 - **hrtimer 机制**: - 使用红黑树管理定时器 - 仅对**最早到期**的定时器设置硬件中断[^3] ```c // 示例:设置单调时间定时器 hrtimer_init(&timer, CLOCK_MONOTONIC, HRTIMER_MODE_ABS); hrtimer_start(&timer, expires, HRTIMER_MODE_ABS); ``` - **动态滴答(Tickless)**: ```mermaid graph TB A[CPU空闲] --> B[取消周期tick中断] B --> C[计算下一个定时器到期时间] C --> D[设置硬件定时器唤醒] D --> E[唤醒后补偿空闲时间 ΔT] E --> F[更新xtime_nsec += ΔT] ``` #### 三、关键保障机制 1. **单调性保证**: - 禁用减法操作:时间更新仅允许加法 - 时钟源异常处理: ```c if (current_cycles < last_cycles) { // 检测回退 discard_cycles(); // 丢弃异常值 recalibrate(); // 重新校准 } ``` 2. **多核一致性**: - 通过 `clocksource_mask` 标记跨核一致的时钟源 - 读写锁保护全局状态:`seqlock_t timekeeper_lock` 3. **精度保障**: - TSC频率校准:`calibrate_tsc()` - 动态调整mult/shift:适应CPU频率变化 #### 四、用户空间应用 高精度计时示例: ```c #include <time.h> struct timespec start, end; clock_gettime(CLOCK_MONOTONIC, &start); // 起始时间 // 执行待测代码... clock_gettime(CLOCK_MONOTONIC, &end); // 结束时间 // 计算纳秒级耗时 long elapsed = (end.tv_sec - start.tv_sec) * 1000000000L + (end.tv_nsec - start.tv_nsec); ``` #### 五、与相关技术的关系 1. **NTP/PTP 时间同步**: - 仅影响 `CLOCK_REALTIME` - 单调时间独立更新[^1] 2. **虚拟化支持**: - KVM 提供 `kvm-clock` 时钟源 - 保证虚拟机暂停期间单调时间连续 ### 总结 Monotonic Time 的实现本质是: 1. **硬件抽象**:通过 `clocksource` 统一访问计时硬件 2. **数学转换**:$$ T_{\text{ns}} = \frac{C_{\text{cycles}} \times \text{mult}}{2^{\text{shift}}} $$ 3. **增量更新**:严格通过加法维护单调性 4. **动态优化**:Tickless 模式降低开销 该机制为高性能计算、实时系统提供可靠时间基准,精度可达纳秒级。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我是小蔡呀~~~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值