跳转至

C++

C++零拷贝反序列化库cista

C++零拷贝反序列化库cista

在阅读Candle(rust的机器学习库)时,看到了rust中利用mmap和Cow机制实现零拷贝反序列化加载模型的tensor。

其中为了解决mmap的数据生命周期为’a, 如果用Cow<’a>引用mmap返回的指针, 使用的生命周期如果超过’a则不能使用,不利于代码开发和引用。因此引入了yoke crate擦除生命周期。

借此,搜索了一下c++的零拷贝反序列化库,找到了cista

cista零拷贝反序列化库实现之swiss_table哈希表实现

朋友们,大家好!上文我们介绍了C++零拷贝反序列化库 cista,今天接着介绍一下 cista 库的实现。

swiss_table实现原理

可以从cista库的介绍中看到如下内容:

Comes with a serializable high-performance hash map and hash set implementation based on Google’s Swiss Table technique.

swiss table的实现可以参考简单了解下最近正火的SwissTable,讲解的很清晰。

本小节大多数内容是站在巨人肩膀上,引用简单了解下最近正火的SwissTable,加上作者结合cista库的介绍。

以三种实现hashmap的方式,看优缺点:

  • 链表法:指针稳定性,能采取扩容之外的手段阻止查询性能退化,比如把过长链表转换成搜索树。缺点:缓存不够友好,冲突较多的时候缓存命中率较低从而影响性能。

  • 线性探测法:缓存友好,加上冲突会有连锁影响,没有指针稳定性。

wsl2 ssh配置与ai编程环境搭建

采用windows + wsl2(安装ubuntu)的方式进行开发。

ssh网络配置

comate是一个和vscode类似的AI智能编码工具,但是没有wsl直接远程连接,只能通过ssh连接。 因此,需要windows上ssh远程wsl2。

推荐配置模式:

  • wsl2采用mirror模式,采用同一个ip,同时方便了网络代理的使用。

如果你的windows使用了clash工具使用网络代理,那么可以暴露一个7890的http代理端口(clash自带功能)。采用mirror模式,wsl2访问windows的7890端口进行代理就很方便了,直接配置127.0.0.1:7890即可。例如:proxychains4 -f /etc/proxychains.conf

Bash
[ProxyList]
http    127.0.0.1 7890
  • ubuntu安装配置openssh-server, 安装启动openssh-server服务很多资料了

Bash
1
2
3
sudo apt install openssh-server
sudo systemctl start ssh
sudo systemctl enable ssh
修改的ssh服务配置如下,只需要修改端口号,其他保持默认
Bash
1
2
3
4
5
6
sudo vim /etc/ssh/sshd_config

Port 2212
#AddressFamily any
#ListenAddress 0.0.0.0
#ListenAddress ::

  • windows上连接wsl2
Bash
ssh -p 2212 username@localhost

C++的“Base-from-Member”技法解决了什么问题?

C++ has indeed become too “expert friendly” – Bjarne Stroustrup

Bjarne Stroustrup 的说得很对,因为专家们对 C++语言中的惯用法非常熟悉。随着程序员理解的惯用法的增加,该语言对他们来说变得更加友好。 这篇文章介绍的“Base-from-Member”就是 c++中的一种惯用法(idioms)。通过掌握现代 C++ 惯用法,提升这方面的知识,C++对我们来说就更加友好。

“Base-from-Member”技法的目的

“Base-from-Member”技法的目的是,解决 C++在继承中,如何初始化一个依赖派生类(子类)成员变量的基类。