fence和barrier 的区别

在并行编程中,fence(栅栏)barrier(屏障) 是两种不同的同步机制,其核心区别在于 作用范围同步目标。以下是深度解析:


一、本质区别

特性 Fence (e.g., shmem_fence()) Barrier (e.g., shmem_barrier())
核心目标 保证内存操作顺序 强制全局进度同步
作用范围 单节点内部 跨所有节点 (PE)
等待内容 不等待其他节点 必须等待所有节点到达
硬件实现 内存控制器/缓存刷新 网络硬件聚合树

二、Fence 详解

1. 语义:内存可见性保证

可能乱序执行
Put 操作1
Put 操作2
Fence
目标内存状态可见

  • 作用 :确保该节点发出的所有 内存操作(put/get/atomic) 按顺序对指定目标节点可见
  • 不保证:其他节点的操作是否完成
2. 典型场景(生产者-消费者)
c 复制代码
// 生产者 PE
shmem_put_data(dest);  // 写入数据
shmem_fence();         // 确保数据写入顺序
shmem_signal_flag();   // 发送完成信号(此信号一定在数据之后到达)
  • 关键fence 保证 signal_flag 一定在数据写入后生效(避免消费者看到标志但无数据)
3. 硬件实现
c 复制代码
// 伪代码:fence = 刷新 NIC 发送队列
void shmem_fence() {
    nic_flush_send_queue();  // 强制网卡按序发送缓存操作
    memory_barrier();        // 防止CPU/GPU指令重排
}
  • 开销:约 50-100 ns(仅本地操作)

三、Barrier 详解

1. 语义:全局时钟推进

PE0: 操作A
Barrier
PE1: 操作B
所有PE继续执行

  • 作用
    • 等待本节点所有先前的 NVSHMEM 操作完成
    • 等待所有节点到达屏障点
  • 全局性:所有参与节点同步阻塞
2. 典型场景(计算阶段同步)
c 复制代码
// 所有 PE 执行
phase1_computation();
exchange_data();        // 使用 shmem_put/shmem_get
shmem_barrier_all();    // 等待所有数据交换完成
phase2_computation();   // 安全使用交换后的数据
3. 硬件实现
c 复制代码
void shmem_barrier() {
    // 1. 本地完成
    nic_flush_send_queue();  
    wait_for_acknowledges();  // 等待远端确认

    // 2. 全局同步(树形聚合)
    send_ready_to_switch();   // 通知交换机
    while (!release_flag);    // 等待根交换机广播
}
  • 开销:1~10 μs(随节点数增加)

四、关键对比实验

场景:4节点数据交换后同步
c 复制代码
// 错误模式(仅用 fence):
PE0: shmem_put(PE1, data); shmem_fence(); 
PE1: shmem_put(PE0, data); shmem_fence();
// 此时 PE0 和 PE1 可能仍在传输中!

// 正确模式(需 barrier):
shmem_put(target, data);
shmem_barrier_all(); // 确保所有传输完成
操作 延迟 (4节点) 256节点延迟
shmem_fence() 80 ns 80 ns
shmem_barrier_all() 0.9 μs 1.8 μs

五、联合使用场景

实现 强一致性同步
c 复制代码
// 步骤 1: 保证本地操作对目标节点可见
shmem_put(dest, data);
shmem_fence();  // 确保 put 先于 signal 到达

// 步骤 2: 通知目标节点
shmem_atomic_set(&flag, 1, dest); 

// 步骤 3: 全局同步(确保所有节点完成通信)
shmem_barrier_all();

此时:

  1. fence 保证 目标节点 先收到 data 再看到 flag=1
  2. barrier 保证 所有节点 完成通信阶段

六、架构级总结

维度 Fence Barrier
同步对象 内存操作顺序 全局进程进度
硬件依赖 内存一致性模型 (x86/GPU/NIC) 网络交换机的聚合引擎
适用场景 单边通信中的数据依赖 跨节点计算阶段划分
并行影响 仅本地延迟 全局等待(尾延迟放大)
NVSHMEM API shmem_fence(), shmem_quiet() shmem_barrier_all()

关键结论

  • 需要 保证数据到达顺序 → 用 fence
  • 需要 确保所有节点完成某阶段 → 用 barrier
  • 大规模训练中:fence 用于梯度推送顺序,barrier 用于 epoch 同步
相关推荐
夏日听雨眠3 小时前
LInux(逻辑地址与物理地址的区别,文件描述符,lseek函数)
linux·运维·网络
ydyd202604214 小时前
制造业数字化干货:设备巡检、报修、保养一体化管理流程拆解
网络
Hali_Botebie5 小时前
【图卷积网络】GCN是AXΘ 和CNN是AX
网络·人工智能·cnn
IpdataCloud5 小时前
高并发场景下IP数据接口怎么选?从QPS到离线库的完整选型指南
网络·网络协议·tcp/ip
CableTech_SQH5 小时前
企业园区网络突然中断排查时间影响生产?综合布线运维管理解决方案分析
网络
難釋懷5 小时前
Redis网络模型-IO多路复用模型-poll模式
网络·数据库·redis
treesforest6 小时前
IP精准定位服务:从城市轮廓到街道坐标,技术如何重塑空间感知
网络·数据库·网络协议·tcp/ip·ip
平行侠6 小时前
A15 工业路由器IP前缀高速检索与内存压缩系统
网络·tcp/ip·算法
yyyyy_abc7 小时前
子网掩码是什么
网络·智能路由器
9命怪猫7 小时前
[K8S小白问题集] - Calico好在哪里?
网络·云原生·容器·kubernetes