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 小时前
AIoT智能物联网平台:架构解析与边缘应用新图景
大数据·网络·人工智能·安全
若风的雨3 小时前
NCCL 怎么解决rdma 网卡本地send的时候需要对端recv要准备好的问题,或者mpi 怎么解决的?
网络
浩浩测试一下4 小时前
DDOS 应急响应Linux防火墙 Iptable 使用方式方法
linux·网络·安全·web安全·网络安全·系统安全·ddos
2501_915918414 小时前
HTTPS 代理失效,启用双向认证(mTLS)的 iOS 应用网络怎么抓包调试
android·网络·ios·小程序·https·uni-app·iphone
8K超高清4 小时前
回望2025,纷呈超清智能科技影像世界
网络·人工智能·科技·数码相机·智能硬件
2501_941982054 小时前
企微非官方API开发:RPA与协议结合的混合驱动实现
网络·企业微信·rpa
Henry Zhu1234 小时前
Qt网络编程详解(下):项目实战
网络·qt
Ares-Wang5 小时前
网络》》BGP Border Gateway Protocol,边界网关协议
网络·gateway
守正出琦5 小时前
网络基础1
网络