C++技法:iguana序列化库中如何实现enum reflection反射
我们知道通过反射可以在运行时获取类名、类型等一些信息,然而c++语言本身没有提供类似java这种反射机制。在阅读iguana开源库时,看到了一种EnumRefection的实现,分享给大家。
iguana 是C++17 实现的header only、跨平台、高性能易用的序列化库,包括xml/json/yaml 的序列化和反序列化。
我们知道通过反射可以在运行时获取类名、类型等一些信息,然而c++语言本身没有提供类似java这种反射机制。在阅读iguana开源库时,看到了一种EnumRefection的实现,分享给大家。
iguana 是C++17 实现的header only、跨平台、高性能易用的序列化库,包括xml/json/yaml 的序列化和反序列化。
MPI(Message Passing Interface,消息传递接口)是一种并行计算的通信标准,主要用于在分布式内存系统中实现多进程间的数据交换和协同计算。它是高性能计算(HPC)领域的核心工具之一,尤其适用于超级计算机和集群环境。MPI是独立于硬件和编程语言的规范,主流实现(如OpenMPI、MPICH)支持C/C++、Fortran等语言,可在Linux、Windows等系统运行。
类似linux操作系统管理内存的机制,paged_attention用于管理LLM推理时kv cache的显存分配,通过页表机制,优化显存分配,减少碎片。
创建一个新的Arc<T>
,同时为你提供对分配的Weak<T>
,以便你构建一个持有对自身弱指针的T
。
通常,直接或间接循环引用自身的结构不应持有对自身的强引用,以防止内存泄漏。使用此函数,你可以在T
初始化期间(在Arc<T>
创建之前)访问弱指针,以便你可以克隆并将其存储在T
内部。
LTO(链接时优化)背后的基本原理是,将 LLVM 的一些优化过程推迟到链接阶段。为什么是链接阶段呢?因为在编译流程中,链接阶段是整个程序(即整套编译单元)能够一次性全部获取的时刻,因此跨编译单元边界的优化成为可能。
朋友们,你们好呀!
不管是Vim还是Nvim,大家肯定都会用到吧!在自己的开发机上你的vim或许特别自定义改装过了。但是偶尔我们也会去一个临时服务器,装一个最简单的原生vim使用。
如果你熟悉了解Vim的一些小技巧,可以提高你的效率呢。那么,Vim有什么奇技淫巧?一起看看作者平时常用到的一些小技巧。
(本文主要内容译自build-your-own-llama-3-architecture-from-scratch-using-pytorch)
朋友们,书接上文,上一篇的Llama3还没有分享完,接着分享输出模块(Output Block)和训练、推理。
最终Decode Block的解码器(decoder)输出将输入到Output Block中。首先,它被输入到 RMSNorm 中。然后,它将被输入到线性层中用于生成logits。
接下来,会发生以下两种操作之一。
(本文主要内容译自build-your-own-llama-3-architecture-from-scratch-using-pytorch)
先看一下LLama3模型结构,这个是译文作者根据LLama3论文画的,画得很好。图中包括了训练和推理的流程。
在这个例子中,我们将创建一个可执行程序 A
,它使用动态链接库 C
,而 C
本身又依赖于另一个动态链接库 D
。
库 C
和 D
都链接了库 E
,其中库 E
包含一个使用 extern
声明和实现的 const std::string
全局变量。
你在编译开发一个项目时,有遇到过指定了链接库,但是运行时,却报错:未定义某个符号吗?undefined xxx。
在开发中遇到的xxx报错,是经过mangle了的,不方便看,可以采用c++filt工具查看原始符号,命令: c++filt xxx 。