Borsh 安全高效的二进制序列化
benchmark • 编译后的体积更小 • borsh 序列化后的二进制更精简 轻量级 序列化结果体积对比 Borsh 基本用法 Case Study NEAR 智能合约 Case Study Solana 智能合约 Case Study • non self-describing • 保证序列化后的二进制唯一性和确定性 • 主要序列化规则 Borsh 规范 • 整数采用低字节序(0 码力 | 21 页 | 3.35 MB | 1 年前3新一代分布式高性能图数据库的构建 - 沈游人
等 100+ 公安机构,国家电网、 国信通产业集团等电力能源行业提供数据智能产品解决方案及长期服务。 海致专注为政府、金融、能源等客户提供大数据处理、分析、挖掘服务,在互 联网技术基础上,打造专业、易用的企业级大数据实战应用产品及解决方案。 北京中关村总部 武汉运维中心 深圳研发中心 上海应用中心 专注于数据智能技术赋能中国数字经济发展 海致高性能图计算院士专家工作站 郑纬民 - 年中国电子学会科学技术奖科技进步一等奖 中国电子学会发布的《 2022 中国电子学会科学技术奖公告》,海 致星图与北京邮电大学、蚂蚁科技集团有限公司、中移动信息技术 有限公司联合研发的“大规模复杂异质图数据智能分析技术与规模化 应用”项目,斩获“科学技术奖科技进步一等奖”,这也是国内电子信 息领域的最高奖项。 该奖项由数十名院士评审,历经三轮,从三百余个申报项目中遴选 而出。由院士等组成的科技成果鉴定委员会认为:“该成果技术复杂 模图数据所产生 的建模能力不足、结构知识难用、巨量数据难算等技术挑战,实现了大规模复杂异质图数 据的表示学习模型、语义推荐和风险管理关键技术,构建了完整的兼具理论指导与应用检 验的大规模图数据智能分析系统与平台,满足了大数据时代从复杂异质图数据中进行知识 发现的重要需求。最终获得国内外授权发明专利 43 项, CCF -A 类论文 51 篇,获得 2 次国际竞赛冠军,参与了 2 项图计算相关标准制定。0 码力 | 38 页 | 24.68 MB | 1 年前3C++高性能并行编程与优化 - 课件 - 02 现代 C++ 入门:RAII 内存管理
限于篇幅,其实构造函数还完全没讲完…… 下一讲继续完善我们刚才发明的 Vector 类 ! 也会详解 && 到底有哪些意思…… 来学智能指针压压惊 • 如果构造函数全家桶搞得你晕头转向了,那让我们来点(相对)简单的作为饭后甜点吧! C++98 :令人头疼的内存管理 • 在没有智能指针的 C++ 中,我们只能手 动去 new 和 delete 指针。这非常容易出 错,一旦马虎的程序员忘记释放指针,就 前,提前通过 p.get() 获取原始指针: 解决方案:提前获取原始指针(续) • 不过你得保证 raw_p 的存在时间不超过 p 的生命周期,否则会出现危险的空悬指 针。比如右边这样: 更智能的指针: shared_ptr • 使用起来很困难的原因,在于 unique_ptr 解决重复释放 的方式是禁止拷贝,这样虽然有效率高的优势,但导致使 用困难,容易犯错等。 • 相比之下, 牺牲效率换来自由度的 1 。减到 0 时 ,则自动销毁他指向的对象。 • 从而可以保证,只要还有存在哪怕一个指针指向该对象 ,就不会被解构。 更智能的指针: shared_ptr (续) • 我们可以使用 p.use_count() 来获取当前 指针的引用计数,看看他是不是在智能地 增减引用计数器。 注意 p.func() 是 shared_ptr 类型本身的成 员函数,而 p->func() 是 p0 码力 | 96 页 | 16.28 MB | 1 年前3C++高性能并行编程与优化 - 课件 - 08 CUDA 开启的 GPU 编程
如何捕获外部变量? • 你可能会想,是不是可以用 [=] 按值捕获 ,这样捕获到的就是指针了吧? • 错了,不要忘了我们第二课说过, vector 的拷贝是深拷贝(绝大多数 C++ 类都是深 拷贝,除了智能指针和原始指针)。这样 只会把 vector 整个地拷贝到 GPU 上! 而不是浅拷贝其起始地址指针。 如何捕获外部变量? • 正确的做法是先获取 arr.data() 的值到 arr_data host_vector 在 CPU 上分配内 存。 • 可以通过 = 运算符在 device_vector 和 host_vector 之间拷贝数据,他会自动帮 你调用 cudaMemcpy ,非常智能。 • 比如这里的 x_dev = x_host 会把 CPU 内存中的 x_host 拷贝到 GPU 的 x_dev 上。 TODO :解释什么是迭代器 模板函数: thrust::generate (cutoff) ,开始用 CPU 串行求和。 https://developer.download.nvidia.cn/assets/cuda/files/reduction.pdf 编译器真智能! • 刚刚说到虽然用了 atomicAdd 按理说是非常低 效的,然而却没有低效,这是因为编译器自动优 化成刚刚用 BLS 的数组求和了!可以看到他优 化后的效率和我们的 BLS 相仿,甚至还要快一0 码力 | 142 页 | 13.52 MB | 1 年前3Zadig 面向开发者的云原生 DevOps 平台
—— 小鹏汽车自动驾驶运维总监 温晓 健 4 条产品线已有 1 条接入验证和迭代端云混合部署和自 测环境拉起能力,足够成熟时将 Zadig 推广至兄弟部 门。 —— 理想智能云软件效率总监 张然 智能云使用 Zadig 实现端云混合部署 Zadig 是云原生时代下的一站式持续交付平台,旨在让研发工程师专注于编码,让团队专注于功能实 现,助力企业更快地将产品创意带到现实世界中。0 码力 | 59 页 | 81.43 MB | 1 年前3C++高性能并行编程与优化 - 课件 - 17 由浅入深学习 map 容器
执行你这段代码 的栈空间 v2 要写入的数 执行中的代码 for (auto &[k, v]: m) { v = v2; } & & 相当于抓捕周树人的这个官兵 ( 编译器 ) 比较智能 他有一个真名 - 笔名对照表,知道两个名字指是同一个人 小彭老师不愧 是元宇宙鲁迅 小彭老师不愧 是元宇宙鲁迅 • 如果你想让你对局部变量 v 的修改,能对原本 map 中的 v 生效,就要得到 &[k, v] 可以写入 v ,但是不可以写入 k • 虽然 auto &[k, v] 是不带 const 的引用,按理说两个都应该可以修改才对? • 不过 structural-binding 很智能,刚刚说了 map 的类型是 pair。 • 这个前者有一个 const 修饰,他就知道了,即使你这里是 auto & ,他对 K 部分也是会 变成 const K & 0 码力 | 90 页 | 8.76 MB | 1 年前3C++高性能并行编程与优化 - 课件 - 06 TBB 开启的并行编程之旅
的数据就是在二级缓存里,比调度到让 t2 算需要进入三级缓存更高效。 而当 t2 的队列比较空时,又会让 t1 继续算 d2 的 s2 ,这样可以避免 t2 闲置浪费时间。总之就是会自动负载均衡非常智能,完全无需操心内部 细节。 流水线并行: filter 参数 • serial_in_order 表示当前步骤只允许串行执行,且 执行的顺序必须一致。 • serial_out_of_order0 码力 | 116 页 | 15.85 MB | 1 年前3C++高性能并行编程与优化 - 课件 - 05 C++11 开始的多线程编程
CMake 3.12 及以上(跨平台作业) Git 2.x (作业上传到 GitHub ) CUDA Toolkit 10.0 以上( GPU 专题) 温馨提示: 1. 会用到第二讲( RAII 与智能指针)里的知识 2. 课件中一部分代码是基于 C++17 的 个人认为, C++11 中很多特性, 其实可以看做是为了支持多线程而 顺带引入的……如 chrono 、移动 、 lambda 、 RAII……0 码力 | 79 页 | 14.11 MB | 1 年前3C++高性能并行编程与优化 - 课件 - 07 深入浅出访存优化
字节分块的效果拔群,但还是比顺 序访问慢一些,为什么?明明没有浪费带宽了? 缓存行预取技术:吃着一碗饭的同时,先喊妈妈烧下一碗饭 • 其实,当程序顺序访问 a[0], a[1] 时, CPU 会智能地预测到你接下来可 能会读取 a[2] ,于是会提前给缓存发送一个读取指令,让他读取 a[2] 、 a[3] 。缓存在后台默默读取数据的同时, CPU 自己在继续处理 a[0] 的数据。这样等0 码力 | 147 页 | 18.88 MB | 1 年前3C++高性能并行编程与优化 - 课件 - 15 C++ 系列课:字符与字符串
string 面对的都 是 char , wchar_t 这种比较小的类型,且用户常用的字符 串往往比较短很容易放进 15 字节的局部栈空间里;然而 vector 面对的往往是比较大的数据结构,有时还有智能指 针, std::thread 这种具有非平凡构造 / 析构函数的类型。对 vector 来说保障 RAII 的安全更重要,所以没有冒险优化。 string 的 append 实现 • append0 码力 | 162 页 | 40.20 MB | 1 年前3
共 10 条
- 1