【面试】一文讲清组合逻辑中的竞争与冒险

博客介绍了组合逻辑电路中竞争和冒险的定义,指出竞争不一定产生冒险,但产生冒险一定存在竞争。通过实例说明不同输入信号变化时竞争与冒险的情况,还介绍了静态冒险的概念及产生原因,后续将涉及险象判断和消除方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

竞争的定义:组合逻辑电路中,输入信号的变化传输到电路的各级逻辑门,到达的时间有先后,也就是存在时差,称为竞争

冒险的定义:当输入信号变化时,由于存在时差,在输出端产生错误,出现了瞬时的干扰脉冲现象,称为冒险(险象)。

通过上面的定义可以得出,竞争不一定产生冒险,当输入信号传输到各逻辑门时存在竞争,如果输出端不出现瞬时的干扰脉冲,就不会产生冒险,但是如果产生冒险,就一定存在竞争

举个例子如下图所示:

F=A'+A,但是如果非门存在延时,A信号经过两条路径到达或门,在或门的输入端就存在竞争。

当A从0变化到1时,两条到达或门的路径虽然存在竞争,但是输出端没有出现瞬时的脉冲,即输出端不会出现冒险。输出端的值都为1.

当A从1变化到0时,因为A信号是先从1变为0,然后才是A'从0变为1,也就是A'经过了一个非门,A'变化比A晚,A和A'有那么一个瞬时取值都相同,都为0,这样导致了输出端出现了一个瞬时的负脉冲,也就是产生了冒险,其它时间A和A'取值相反,电路的输出端都为1。

如下面波形图所示,虽然A变化都会产生竞争,但是只有在A从1变为0时,才会产生冒险。

 

实际上,两个输入的与门也会产生冒险

当AB取值为01或者AB取值为10时,输出的F都应该为0。但是当AB从01变为10时,如下波形图所示,由于两个信号的变化不可能同时完成,如果A先于B变化,就会产生一个干扰的脉冲,也就是出现冒险。如果A滞后于B变化,就不会产生冒险。

 上面的这两种情况,属于组合逻辑电路在输入信号变化前后,稳定的输出值相同,而仅仅在转换瞬间产生冒险,这种冒险称为静态冒险

静态冒险产生的原因有两种如下图

功能险象:当有两个或者两个以上的输入信号发生变化时,由于可能经历的路径不同,所产生的险象称为功能险象。功能险象时逻辑函数本身固有的。

逻辑险象:当输入信号只有一个发生变化,或者虽然有多个发生变化但是没有发生功能险象的可能,由于门的延迟不同,产生了静态险象,称为逻辑险象,前面的两个例子都是逻辑险象。

 

 后续还有功能险象的判断方法、逻辑险象的判断方法,以及险象的消除方法。

### NCCL集合通信原理 NCCL(NVIDIA Collective Communications Library)专为加速深度学习和其他高性能计算任务设计,旨在提高多GPU环境下的数据传输速度和效率。该库实现了多种高效的集体通信原语,如广播、规约、全规约以及全连接操作等[^3]。 #### 广播(Broadcast) 在一个定根进程向所有参进程中发送相同的数据副本使用。此过程确保每个接收者最终都获得相同的输入值集。 #### 规约(Reduce) 将来自多个源的操作数按照某种运算符组合成单一结果;常见的例子是对数值求和或取最大/最小值。完成之后只有目标位置会持有最终的结果。 #### 全规约(Allreduce) 类似于`Reduce`但是不同之处在于所有的参者都会得到完整的聚合后的输出而不是仅限于某一方。 #### 散布收集(Scatter/Gather) 前者由一个处理器将其持有的数组分割开来分配给其它成员各自拥有一部分;后者则是相反的过程——把各处分散的小块重新拼接回原来的样子。 --- ### 优化方法 为了最大化利用NCCL带来的性能增益,可以采取如下几种策略: - **选择合适的算法**:对于不同的拓扑结构和消息尺寸,存在特定的最佳实践路径来执行上述提到的各种集体通讯方式。例如,在较小的消息传递情况下采用环形协议可能是更好的选择;而对于较大规模的信息,则树状构建可能会更优效[^4]。 - **异步调用**:尽可能多地重叠计算通信活动,减少等待间浪费。这可以通过启动非阻塞式的API函数实现,从而让CPU继续处理其他任务而不必一直等到当前事务结束为止[^1]。 - **流控制**:合理规划CUDA Streams的数量及其关联关系有助于进一步挖掘潜在并发度,并且避免因过多竞争而导致资源争抢现象的发生。 - **缓冲区管理**:预先分配足够的临存储空间用于中间状态保存,防止频繁申请释放内存带来额外开销的同也保障了整体流程的一致性和稳定性。 ```cpp // C++ Example of using NCCL with CUDA streams for asynchronous operations. ncclComm_t comm; cudaStream_t stream; // Initialize communication and create a new CUDA stream. ncclCommInitAll(&comm, numDevices, devices); cudaStreamCreate(&stream); // Perform an all-reduce operation asynchronously on the given tensor `data`. ncclAllReduce(data, result, count, ncclFloat32, ncclSum, comm, stream); // Synchronize to ensure completion before proceeding further. cudaStreamSynchronize(stream); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值