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 同步
相关推荐
AskHarries1 小时前
权限模型:Shell、Browser、文件读写的安全边界
服务器·前端·网络
咖啡星人k1 小时前
MonkeyCode 网络架构:WebSocket、SSE与实时协作的技术选型
网络·websocket·架构·monkeycode
稷下元歌2 小时前
七天学会plc 加机器视觉完整笔记:S7-1200 数据类型、存储区与寻址方式(I/Q/M/DB 详解)。
网络·数据库·笔记
liulilittle2 小时前
bpftrace 跟踪 tcp_write_xmit (内核TCP写出提交)
网络·网络协议·tcp/ip
星光不负赶路人!2 小时前
【问题解决】xftp工具无法连接Windows问题解决
网络
liulilittle3 小时前
TCP KCC v1.0(卡尔曼拥塞控制)
linux·服务器·网络·tcp/ip·计算机网络·tcp·通信
Fnetlink13 小时前
SD-WAN前三供应商推荐
网络·sase
Bobolink_4 小时前
面向欧美用户实时直播场景的网络时延优化实践
网络·网络优化·跨境网络·跨境直播·直播网络
IpdataCloud4 小时前
遭遇DDoS攻击后如何快速分析攻击源?用IP离线库+威胁情报定位异常IP
网络·tcp/ip·游戏·智能路由器·ddos
机汇五金_4 小时前
影响交换机箱体使用寿命的几个关键因素
运维·服务器·网络·python