1.协程简介
2. 实现一个序列生成器 | Benny Huo 的专栏
1.协程简介什么是从cpp无栈协程?保留协程自己的状态和值,切换到另一个协程,不进行堆栈的切换
co_await表示协程的挂起,操作对象是awaiter等待体
协程体内await_ready决定是否挂起,返回false就挂起,true无需挂起
await_ready 返回 false 时,协程就挂起了。这时候协程的局部变量和挂起点都会被存入协程的状态当中,await_suspend 被调用到
协程恢复执行之后,等待体的 await_resume 函数被调用
自己实现一个很简单的等待体,功能是,调用co_await,看await_ready为false,始终挂起,挂起后新建一个线程,等待1s后再调用resume,resume返回一个值
12345678910111213141516171819202122232425struct Awaiter { int value; bool await_ready() { // 协程挂起 return false; } void awai ...
SHMEMGraph: Efficient and Balanced Graph Processing Using One-sided Communication
TL;DR:使用RDMA单边操作,解决计算不平衡和通信不平衡问题对于计算不平衡,通过对发送数据进行细粒度的切分进一步隐藏计算和通信延迟对于通信不平衡 通过单边通信和主动get
基于Gemini,发现gemini中存在节点间计算不平衡和通信不平衡的问题计算不平衡:通用的划分策略只能平衡每个节点在每次迭代中的总计算成本,而不能平衡它们在每轮中的计算成本。(每轮即gemini在一次迭代中通过循环通信来进行计算和通信,每一轮表示处理一个分区)通信不平衡:每个节点连接到另一个节点的边数不平衡会导致每轮发送数据量不均匀
IV. DESIGN OF SHMEMGRAPH单边通信基本设计如上图所示,每个节点只有一个通信线程,使用put将数据写到其他节点上的接收缓冲区。
准备工作完成并填充发送缓冲区后,发送方线程对接收方节点上相应的长度数组进行原子比较和交换(CAS)操作。这个单一的 CAS 有三个目的:通知数据到达、通知数据大小以及锁定接收缓冲区。冲突是指另一个 CAS 之前修改了同一位置。接收器检查长度数组以了解接收数据的到达和长度。接收数据在有效数据部分末尾有一个完成标志,以确认传输完成。虽 ...
RGraph:Asynchronous graph processing based on asymmetry of remote direct memory access
Recently, the emergence of high-performance Remote Direct Memory Access (RDMA) technology brings opportunities for distributed graph processing. Due to the ability of zero-copy and kernel-bypassing, RDMA network achieves high throughput and low latency with low CPU utilization. For example, the latest RDMA network provides 200 Gbps throughput and 1 μs latency.14 If we deploy distributed graph processing systems on RDMA network, the performance of graph processing can be further improved. Howeve ...
cloudlab多节点环境配置
START
Basic
当cloudlab有多个节点需要配置环境时,手动配置过于麻烦,可以执行脚本来统一配置
1.登录其中一个节点,生成公钥,将这个节点 公钥添加到cloudlab

此时可以通过node0来登录其他所有的node
2.编写每个节点配置环境的脚本,放在共享目录下比如脚本为可以放在/proj/nsccgz-storage-PG0/exp/
3.在node0编写执行脚本,脚本来源自永锋师兄
12345678910111213141516171819202122232425262728293031323334353637#!/bin/bashset -xserver_hosts=("node0""node1""node2""node3""node4""node5"&quo ...
DFabric: Scaling Out Data Parallel Applications with CXL-Ethernet Hybrid Interconnects
START
Basic
TL;DR:结合CXL和以太网,实现两层互联架构,解决数据密集型应用的通信困难
## 1 Introduction
cxl互联可以很好的解决分布式数据密集型应用中的通信问题
> 在当今的生产云中运行的数据密集型应用程序,例如图形处理[47]、数据分析[17]和深度神经网络(DNN)训练[44]通常使用批量同步并行(BSP)[65]或MapReduce来运行范式,这需要两个关键阶段的迭代执行:跨多个计算单元的数据计算(例如,DNN 训练中的前向和后向传播),以及这些单元之间的通信(例如,MapReduce 中的数据混洗)。此类应用程序是计算密集型的并且非常耗时。例如,在单个 TPU 上训练 BERT 模型需要超过 1.5 个月的时间
由于CXL互联的长度限制,通常在只在机架内部,机架之间通过以太网连接。然而,跨越多个主机或机架超出互连的到达极限,其通信效率不可避免地受到主机之间缓慢的网络链接的阻碍。
解决这一差距的直观方法是构建一个聚合容量大于互连容量的 NIC 池,旨在实现超出互连范围限制的高效通信。然而,由于带宽差异巨大,为每个节点的本地互连构建单独的池 ...
A Quantitative Analysis and Guidelines of Data Streaming Accelerator in Modern Intel® Xeon® Scalable Processors
START
Basic
TL;DR:量化分析DSA的性能
## 1. Introduction
为了从 CPU 卸载此类内存操作,英特尔于 2006 年向服务器级 Xeon® 5100 系列处理器引入了 I/O 加速技术 (I/OAT) [10]。 I/OAT 由芯片组中的 DMA 引擎组成,其识别、编程和操作方式与 PCIe 连接设备中的 DMA 引擎相同。 I/OAT 的几代改进演变成 Crystal Beach DMA (CBDMA) 引擎,具有更高的吞吐量和数据协调性。尽管得到了一些软件堆栈的支持,但由于编程接口有限和卸载成本较高,事实证明应用程序堆栈的更广泛采用更加困难。
为了满足卸载更加多样化、简单但重复的内存密集型操作的日益增长的需求,英特尔最近在基于 Sapphire Rapids 架构的英特尔® 第四代至强® 可扩展处理器中引入了数据流加速器 (DSA) [19]。与前几代 DMA 引擎相比,DSA 在各个方面都得到了显着改进,包括显着降低的卸载开销、在吞吐量和能耗方面更高的效率、支持操作的多样性以及一系列使其更受欢迎的独特功能。加速内存相关操作和转换的有吸引力 ...
DmRPC:Disaggregated Memory-aware Datacenter RPC for Data-intensive Applications
START
Basic
TL;DR:
I. INTRODUCTION现代数据中心使用微服务来提升敏捷性、弹性和模块化,微服务大量使用RPC通信,然而,传统的值传递RPC会带来大量额外的数据移动,
这里论证值传递的RPC造成冗余数据传递问题,有多么严重。。。
引入全局地址空间后可以实现按引用传递的RPC,然而,这样的全局地址空间直接与RPC的语义相矛盾,并且耦合了RPC调用者和被调用者。共享相同内存的微服务需要相互同步以保持数据一致。这需要微服务中的额外逻辑来处理共享,从而使微服务的开发变得复杂。
因此,一些特定领域的应用程序不是直接使用 RPC,而是倾向于构建在专用框架 [50]、[52]、[57] 之上,例如用于数据处理的 Apache Spark [73] 和分布式 Pytorch [45] ] 用于机器学习。该框架通常与内存数据存储服务集成。调用者进程不是直接在 RPC 中传输大数据,而是将数据复制到数据存储服务并发送返回的引用。当远程被调用者进程需要访问数据时,它使用引用通过网络将调用者的数据存储中复制的数据获取到自己的数据存储中。被调用者数据存储中复制的数据是不可更改的 ...
跳过缓存行 CLFLUSH
START
Basic
# 跳过缓存行 CLFLUSH
_mm_flush
asmCCEH实现,加了pause增加延迟
1234567891011inline void clflush(char* data, size_t len) { volatile char *ptr = (char*)((unsigned long)data & (~(kCacheLineSize-1))); mfence(); for (; ptr < data+len; ptr+=kCacheLineSize) { unsigned long etcs = ReadTSC() + (unsigned long) (kWriteLatencyInNS*CPU_FREQ_MHZ/1000); asm volatile("clflush %0" : "+m" (*(volatile char*)ptr)); while (ReadTSC() < etcs) CPUPause(); clflushC ...
DRust:Language-Guided Distributed Shared Memory with Fine Granularity, Full Transparency, and Ultra Efficiency
START
Basic
## 1 Introduction
现有的DSM相比于单机系统,拓展性差且速度大幅下降,主要源于需要密集的同步操作来保证内存一致性
过往的DSM采用以下方法实现内存一致性:对于要访问的每个数据块,该块要么位于具有潜在读写访问权限的单个节点上,要么跨多个节点复制,每个节点都具有读访问权限仅有的。在服务器尝试访问块之前,DSM 系统会检查该块的状态,使所有其他服务器上该块的副本无效,然后将该块传输到请求服务器。此同步过程需要多次网络往返。即使使用 RDMA,与单个本地访问相比,所产生的延迟仍然要高出几个数量级,因此,有效减少同步次数对于最大限度地减少 DSM 开销并使其适合实际部署至关重要。
最小化同步开销的实用策略包括实施高级协议以保证每个服务器的独占访问。例如,Apache Spark [91] 利用称为弹性分布式数据集 (RDD) 的不可变数据结构进行分布式访问。然而,RDD 只促进粗粒度的分布式访问,限制每个服务器只能访问 RDD 的不同分区。虽然增加访问粒度可以提高性能,但代价是通用性降低——Spark 是为批量数据的批量处理而定制的,无法支持需要对 ...
Harvesting Memory-bound CPU Stall Cycles in Software with MSH
START
Basic
TL;DR:利用轻量级协程来优化访存引起的停顿
1 Introduction针对高访存延迟引起的停顿SMT是不满足的,首先,众所周知,SMT 可能会导致延迟显着增加,因为它只专注于复用指令流以最好地利用核心资源,此外,SMT 不允许对主延迟和辅助任务的吞吐量之间的权衡进行细粒度控制,而这是在延迟服务水平目标下最大化 CPU 利用率所必需的。SMT最多支持两个线程也是不够的
轻量级的协程:允许主协程和辅助协程交错,其切换开销比传统执行线程(进程和内核线程)小得多基于采样的分析:可以通过分析减少缓存未命中率
面临的困难
为了提高任务切换的效率(或者说资源的有效利用),我们需要减少每次“yield”操作中寄存器状态的保存和恢复开销,并且保证程序的正确性
为了引入最小的延迟开销,辅助程序需要在消耗足够的停顿周期后立即让出核心
为了充分利用停顿周期,我们需要检测何时需要更高程度的并发,并正确交错多个辅助程序的执行
将辅助程序执行与具有内部线程结构的主二进制文件透明地交错是一项挑战。
提出Memory Stall Software Harvester (MSH)要 ...