当前位置: 首页 > article >正文

CANN/Ascend C 基于语言扩展层C API编程

基于语言扩展层C API编程【免费下载链接】asc-devkit本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言原生支持C和C标准规范主要由类库和语言扩展层构成提供多层级API满足多维场景算子开发诉求。项目地址: https://gitcode.com/cann/asc-devkit基于语言扩展层C API编程时通过提供纯C风格的接口符合C语言算子开发习惯提供与业界类似编程体验。本节主要介绍C API编程范式通过内存管理、同步控制、计算及搬运接口相关的介绍使开发者更好地理解和使用C API进行编程。内存管理C API通过C风格的地址限定符描述不同层级内存并且可以通过指针直接操作内存地址从而精准控制数据存放位置。不同存储单元的地址限定符介绍如下表 1不同存储单元的地址限定符存储单元地址限定符描述Global Memory__gm__表示被修饰的变量位于Global Memory地址空间。Unified Buffer__ubuf__表示被修饰的变量位于Unified Buffer地址空间。L1 Buffer__cbuf__表示被修饰的变量位于L1 Buffer地址空间。L0A Buffer__ca__表示被修饰的变量位于L0A Buffer地址空间。L0B Buffer__cb__表示被修饰的变量位于L0B Buffer地址空间。L0C Buffer__cc__表示被修饰的变量位于L0C Buffer地址空间。地址空间限定符可以在数组或指针变量声明中使用用于指定对象分配的区域。同一个类型上不允许使用多个地址空间限定符。基于C API编程时开发者需要自行通过显式的内存管理来控制内存不同层级的内存申请介绍如下全局内存Global Memory一般通过Device侧接口aclrtMalloc接口分配传入需要增加对应地址限定符使用。内部存储包含Unified Buffer、L1 Buffer等由用户自行申请空间通过地址限定符关键字在Kernel内声明。无自动垃圾回收机制需开发者严格控制生命周期。以申请UB空间为例// 在数组变量声明中使用地址空间限定符 // total_length 指参与计算的数据长度 constexpr uint64_t total_length 256; __ubuf__ float xLocal[ total_length ]; __ubuf__ float yLocal[ total_length ]; __ubuf__ float zLocal[ total_length ]; // 在指针变量声明中使用地址空间限定符 uint64_t offset 0; // 首先为src0申请内存从0开始。 __ubuf__ half* src0 (__ubuf__ half*)asc_get_phy_buf_addr(offset); // 获取src0的地址通过__ubuf__关键字指定该地址指向UB内存。同步控制NPU内部有不同的计算单元在计算前往往需要把计算数据搬运到计算单元上。不同计算单元上的计算过程、数据搬运过程可划分为不同的流水线。如下表所示表 2指令流水类型和相关说明流水类型含义PIPE_S标量流水线PIPE_V矢量计算流水及部分硬件架构下的L0C Buffer-UB数据搬运流水PIPE_M矩阵计算流水PIPE_MTE1L1 Buffer -L0A Buffer、L1 Buffer-L0B Buffer数据搬运流水PIPE_MTE2GM-L1 Buffer、GM-UB等数据搬运流水PIPE_MTE3UB-GM等数据搬运流水PIPE_FIXL0C Buffer-GM、L0C Buffer -L1等数据搬运流水在调用C API提供的搬运或者计算类API编写算子时需要根据流水线之间的数据依赖关系插入对应的同步事件。C API提供了两种不同的同步控制接口同步控制粒度由浅到深帮助开发者精准适配硬件架构挖掘异构计算的性能极限。第一种和静态Tensor编程方式一致的同步接口主要通过asc_sync_notify/asc_sync_wait接口来精细化管理需要手动管理事件的类型和事件ID还需要考虑正向同步循环内依赖与反向同步循环间依赖。极致性能场景推荐使用此方式。使用示例如下// 本片段仅用于说明数据搬运、矢量计算、同步操作间的关系。各接口的完整参数及上下文请参考下文中的编程示例。 asc_copy_gm2ub(); // GM-UB的搬运流水 asc_sync_notify(PIPE_MTE2, PIPE_V, EVENT_ID0); asc_sync_wait(PIPE_MTE2, PIPE_V, EVENT_ID0); asc_add(); // 矢量计算流水 asc_sync_notify(PIPE_V, PIPE_MTE3, EVENT_ID0); asc_sync_wait(PIPE_V, PIPE_MTE3, EVENT_ID0); asc_copy_ub2gm(); // UB-GM的搬运流水第二种不感知流水类型的同步接口将asc_sync接口添加在对应流水类型的指令后面来实现。使用这类同步接口时不需要考虑指令流水类型接口内部会自动管理所有指令流水的同步简化同步指令。性能不敏感场景下可以使用此方式。使用示例如下// 本片段仅用于说明数据搬运、矢量计算、同步操作间的关系。各接口的完整参数及上下文请参考下文中的编程示例。 asc_copy_gm2ub();// GM-UB的搬运流水 asc_sync(); // 全同步 无需考虑后面的指令流水 asc_add(); // 矢量计算流水 asc_sync(); // 全同步 无需考虑后面的指令流水 asc_copy_ub2gm(); // UB-GM的搬运流水另外C API还提供了一组包含同步能力的搬运及计算接口开发者无需显式手动管理同步同步操作隐藏在相应的接口中。性能不敏感场景下推荐使用此方式。使用示例如下// 本片段仅用于说明数据搬运、矢量计算、同步操作间的关系。各接口的完整参数及上下文请参考下文中的编程示例。 asc_copy_gm2ub_sync(); // GM-UB的搬运流水同时包含了和后面的任意指令流水的同步 asc_add_sync(); // 矢量计算流水同时包含了和后面的任意指令流水的同步 asc_copy_ub2gm_sync(); // UB-GM的搬运流水同时包含了和后面的任意指令流水的同步编程示例内存管理与精细化同步完整示例#include cstdint #include c_api/asc_simd.h constexpr uint32_t C_API_ONE_BLOCK_SIZE 32; constexpr uint32_t C_API_ONE_REPEAT_BYTE_SIZE 256; constexpr uint32_t C_API_TOTAL_LENGTH 16384; constexpr uint32_t C_API_TILE_NUM 8; constexpr uint32_t C_API_TILE_LENGTH 256; __vector__ __global__ __aicore__ void add_custom(__gm__ float* x, __gm__ float* y, __gm__ float* z) { asc_init(); uint32_t blockLength C_API_TOTAL_LENGTH / asc_get_block_num(); uint32_t tileLength blockLength / C_API_TILE_NUM; __gm__ float* xGm x asc_get_block_idx() * blockLength; __gm__ float* yGm y asc_get_block_idx() * blockLength; __gm__ float* zGm z asc_get_block_idx() * blockLength; __ubuf__ float xLocal[C_API_TILE_LENGTH]; __ubuf__ float yLocal[C_API_TILE_LENGTH]; __ubuf__ float zLocal[C_API_TILE_LENGTH]; uint16_t len_burst tileLength; for (uint32_t i 0; i C_API_TILE_NUM; i) { if (i ! 0) { asc_sync_wait(PIPE_V, PIPE_MTE2, EVENT_ID0); } len_burst tileLength * sizeof(float) / C_API_ONE_BLOCK_SIZE; asc_copy_gm2ub(xLocal, xGm i * tileLength, 0, 1, len_burst, 0, 0); asc_copy_gm2ub(yLocal, yGm i * tileLength, 0, 1, len_burst, 0, 0); asc_sync_notify(PIPE_MTE2, PIPE_V, EVENT_ID0); asc_sync_wait(PIPE_MTE2, PIPE_V, EVENT_ID0); if (i ! 0) { asc_sync_wait(PIPE_MTE3, PIPE_V, EVENT_ID0); } asc_add(zLocal, xLocal, yLocal, tileLength * sizeof(float) / C_API_ONE_REPEAT_BYTE_SIZE, 1, 1, 1, 8, 8, 8); if (i ! (C_API_TILE_NUM-1)) { asc_sync_notify(PIPE_V, PIPE_MTE2, EVENT_ID0); } asc_sync_notify(PIPE_V, PIPE_MTE3, EVENT_ID0); asc_sync_wait(PIPE_V, PIPE_MTE3, EVENT_ID0); asc_copy_ub2gm(zGm i * tileLength, zLocal, 0, 1, len_burst, 0, 0); if (i ! (C_API_TILE_NUM-1)) { asc_sync_notify(PIPE_MTE3, PIPE_V, EVENT_ID0); } } }内存管理与不感知流水类型的同步管理完整示例如下#include cstdint #include c_api/asc_simd.h constexpr uint32_t TILE_LENGTH 2048; constexpr uint32_t NUM_BLOCKS 8; __vector__ __global__ __aicore__ void add_custom(__gm__ float* x, __gm__ float* y, __gm__ float* z) { asc_init(); uint32_t blockLength NUM_BLOCKS * TILE_LENGTH / asc_get_block_num(); __gm__ float* xGm x asc_get_block_idx() * blockLength; __gm__ float* yGm y asc_get_block_idx() * blockLength; __gm__ float* zGm z asc_get_block_idx() * blockLength; __ubuf__ float xLocal[TILE_LENGTH]; __ubuf__ float yLocal[TILE_LENGTH]; __ubuf__ float zLocal[TILE_LENGTH]; asc_copy_gm2ub((__ubuf__ void*)xLocal, (__gm__ void*)xGm, blockLength * sizeof(float)); asc_copy_gm2ub((__ubuf__ void*)yLocal, (__gm__ void*)yGm, blockLength * sizeof(float)); asc_sync(); asc_add(zLocal, xLocal, yLocal, blockLength); asc_sync(); asc_copy_ub2gm((__gm__ void*)zGm, (__ubuf__ void*)zLocal, blockLength * sizeof(float)); asc_sync(); }内存管理与使用带同步能力的接口完整示例如下#include cstdint #include c_api/asc_simd.h constexpr uint32_t TILE_LENGTH 2048; constexpr uint32_t NUM_BLOCKS 8; __vector__ __global__ __aicore__ void add_custom(__gm__ float* x, __gm__ float* y, __gm__ float* z) { asc_init(); __ubuf__ float xLocal[TILE_LENGTH]; __ubuf__ float yLocal[TILE_LENGTH]; __ubuf__ float zLocal[TILE_LENGTH]; uint32_t blockLength TILE_LENGTH * NUM_BLOCKS / asc_get_block_num(); asc_copy_gm2ub_sync((__ubuf__ void*)xLocal, (__gm__ void*)(x asc_get_block_idx() * blockLength), blockLength * sizeof(float)); asc_copy_gm2ub_sync((__ubuf__ void*)yLocal, (__gm__ void*)(y asc_get_block_idx() * blockLength), blockLength * sizeof(float)); asc_add_sync(zLocal, xLocal, yLocal, blockLength); asc_copy_ub2gm_sync((__gm__ void*)(z asc_get_block_idx() * blockLength), (__ubuf__ void*)zLocal, blockLength * sizeof(float)); }内存管理、Reg矢量计算与精细化同步完整示例#include cstdint #include c_api/asc_simd.h onstexpr uint32_t TILE_LENGTH 2048; constexpr uint32_t NUM_BLOCKS 8; constexpr uint32_t BLK_NUM 1; constexpr uint32_t MASK 32; __simd_vf__ inline void AddVF(uint16_t rep, uint16_t one_rep_size, uint32_t blockLength, __ubuf__ float* xLocal, __ubuf__ float* yLocal, __ubuf__ float* zLocal) { vector_bool vmask; vector_float reg_src0; vector_float reg_src1; vector_float reg_dst; uint32_t remaining blockLength; for (uint16_t i 0; i rep; i) { vmask asc_update_mask_b32(remaining); asc_loadalign(reg_src0, xLocal i * one_rep_size); asc_loadalign(reg_src1, yLocal i * one_rep_size); asc_add(reg_dst, reg_src0, reg_src1, vmask); asc_storealign(zLocal i * one_rep_size, reg_dst, vmask); } } __vector__ __global__ __aicore__ void add_custom(__gm__ float* x, __gm__ float* y, __gm__ float* z) { asc_init(); uint32_t blockLength TILE_LENGTH * NUM_BLOCKS / asc_get_block_num(); __gm__ float* xGm x get_block_idx() * blockLength; __gm__ float* yGm y get_block_idx() * blockLength; __gm__ float* zGm z get_block_idx() * blockLength; __ubuf__ float xLocal[TILE_LENGTH]; __ubuf__ float yLocal[TILE_LENGTH]; __ubuf__ float zLocal[TILE_LENGTH]; const uint8_t cacheMode0 static_castuint8_t(((uint64_t)xGm) 60); const uint8_t cacheMode1 static_castuint8_t(((uint64_t)yGm) 60); const uint8_t cacheMode2 static_castuint8_t(((uint64_t)zGm) 60); uint32_t burstLength blockLength * 32; uint64_t srcStride burstLength; uint32_t dstStride (burstLength 31) / 32 * 32; asc_copy_gm2ub_align((__ubuf__ float*)xLocal, xGm, BLK_NUM, burstLength, 0, 0, true, cacheMode0, srcStride, dstStride); asc_copy_gm2ub_align((__ubuf__ float*)yLocal, yGm, BLK_NUM, burstLength, 0, 0, true, cacheMode1, srcStride, dstStride); asc_sync_notify(PIPE_MTE2, PIPE_V, EVENT_ID0); asc_sync_wait(PIPE_MTE2, PIPE_V, EVENT_ID0); uint16_t mask_bit_size 256; uint16_t one_rep_size mask_bit_size / sizeof(float); uint16_t rep (blockLength one_rep_size - 1) / one_rep_size; asc_vf_callAddVF(rep, one_rep_size, blockLength, (__ubuf__ float*)xLocal, (__ubuf__ float*)yLocal, (__ubuf__ float*)zLocal ); asc_sync_notify(PIPE_V, PIPE_MTE3, EVENT_ID0); asc_sync_wait(PIPE_V, PIPE_MTE3, EVENT_ID0); asc_copy_ub2gm_align(zGm, (__ubuf__ float*)zLocal, BLK_NUM, burstLength, cacheMode2, srcStride, dstStride); }【免费下载链接】asc-devkit本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言原生支持C和C标准规范主要由类库和语言扩展层构成提供多层级API满足多维场景算子开发诉求。项目地址: https://gitcode.com/cann/asc-devkit创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关文章:

CANN/Ascend C 基于语言扩展层C API编程

基于语言扩展层C API编程 【免费下载链接】asc-devkit 本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言,原生支持C和C标准规范,主要由类库和语言扩展层构成,提供多层级API,满足多维场景算子开发诉求。 项目地址: https:…...

CANN/asc-devkit HCCL算法分析器指南

Algorithm Analyzer User Guide 【免费下载链接】asc-devkit 本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言,原生支持C和C标准规范,主要由类库和语言扩展层构成,提供多层级API,满足多维场景算子开发诉求。 项目地址: …...

CANN/asc-devkit最新管理器模块

latest_manager Module Description 【免费下载链接】asc-devkit 本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言,原生支持C和C标准规范,主要由类库和语言扩展层构成,提供多层级API,满足多维场景算子开发诉求。 项目地…...

如何选择最佳身份验证技能:Awesome Agent Skills中Auth0、Firebase Auth与Better Auth全面指南

如何选择最佳身份验证技能:Awesome Agent Skills中Auth0、Firebase Auth与Better Auth全面指南 【免费下载链接】awesome-agent-skills A curated collection of 1000 agent skills from official dev teams and the community, compatible with Claude Code, Codex…...

10分钟打造专业级科研图表:SciencePlots终极美化指南

10分钟打造专业级科研图表:SciencePlots终极美化指南 【免费下载链接】SciencePlots Matplotlib styles for scientific plotting 项目地址: https://gitcode.com/gh_mirrors/sc/SciencePlots 还在为科研论文中的图表不够专业而烦恼吗?SciencePlo…...

3步解锁Beyond Compare 5专业版:Python密钥生成器终极指南

3步解锁Beyond Compare 5专业版:Python密钥生成器终极指南 【免费下载链接】BCompare_Keygen Keygen for BCompare 5 项目地址: https://gitcode.com/gh_mirrors/bc/BCompare_Keygen 还在为Beyond Compare 5的30天试用期而烦恼吗?想免费使用这款强…...

科研绘图革命:3步让Matplotlib图表达到期刊发表标准

科研绘图革命:3步让Matplotlib图表达到期刊发表标准 【免费下载链接】SciencePlots Matplotlib styles for scientific plotting 项目地址: https://gitcode.com/gh_mirrors/sc/SciencePlots 想象一下这样的场景:你花了数周时间收集数据、编写分析…...

清华大学打造实时交互视频生成新方案:让AI“边想边说“不再卡顿

这项由清华大学与人民大学联合开展的研究,于2026年5月以预印本形式发布,论文编号为arXiv:2605.15141,有兴趣深入了解的读者可通过该编号查询完整论文。研究团队来自清华大学和生数科技(ShengShu),与人民大学…...

CANN/asc-devkit RTC运行时编译指南

RTC 【免费下载链接】asc-devkit 本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言,原生支持C和C标准规范,主要由类库和语言扩展层构成,提供多层级API,满足多维场景算子开发诉求。 项目地址: https://gitcode.com/cann/a…...

终极AMD Ryzen性能调优指南:5分钟掌握SMUDebugTool免费调试神器

终极AMD Ryzen性能调优指南:5分钟掌握SMUDebugTool免费调试神器 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址: h…...

深度技术解析:Lenovo Legion Toolkit 高级性能调优与系统集成指南

深度技术解析:Lenovo Legion Toolkit 高级性能调优与系统集成指南 【免费下载链接】LenovoLegionToolkit Lightweight Lenovo Vantage and Hotkeys replacement for Lenovo Legion laptops. 项目地址: https://gitcode.com/gh_mirrors/le/LenovoLegionToolkit …...

Windows Defender移除终极指南:如何彻底禁用微软安全组件提升系统性能30%

Windows Defender移除终极指南:如何彻底禁用微软安全组件提升系统性能30% 【免费下载链接】windows-defender-remover A tool which is uses to remove Windows Defender in Windows 8.x, Windows 10 (every version) and Windows 11. 项目地址: https://gitcode.…...

Python金融数据引擎:重构通达信数据获取的技术范式

Python金融数据引擎:重构通达信数据获取的技术范式 【免费下载链接】mootdx 通达信数据读取的一个简便使用封装 项目地址: https://gitcode.com/GitHub_Trending/mo/mootdx 在量化投资和金融数据分析领域,数据获取一直是开发者面临的首要挑战。传…...

DLSS Swapper完整指南:3分钟掌握游戏性能优化终极技巧

DLSS Swapper完整指南:3分钟掌握游戏性能优化终极技巧 【免费下载链接】dlss-swapper 项目地址: https://gitcode.com/GitHub_Trending/dl/dlss-swapper DLSS Swapper是一款革命性的开源工具,专门为PC游戏玩家设计,让你能够轻松管理、…...

QQ空间数据备份指南:三步骤永久保存你的数字青春

QQ空间数据备份指南:三步骤永久保存你的数字青春 【免费下载链接】QZoneExport QQ空间导出助手,用于备份QQ空间的说说、日志、私密日记、相册、视频、留言板、QQ好友、收藏夹、分享、最近访客为文件,便于迁移与保存 项目地址: https://gitc…...

华硕笔记本终极控制神器:G-Helper轻量化替代方案完整指南

华硕笔记本终极控制神器:G-Helper轻量化替代方案完整指南 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops with nearly the same functionality. Works with ROG Zephyrus, Flow, TUF, Strix, Scar, ProArt, Vivobook, Zenbook,…...

DownGit:3分钟掌握GitHub文件下载的终极指南,无需克隆整个仓库!

DownGit:3分钟掌握GitHub文件下载的终极指南,无需克隆整个仓库! 【免费下载链接】DownGit github 资源打包下载工具 项目地址: https://gitcode.com/gh_mirrors/dow/DownGit 你是否曾经为了下载GitHub上的一个配置文件,却被…...

Cobalt Strike 完整安装指南,含网盘资源与Java配置

Cobalt Strike安装教程 说明: 本教程仅用于学习与研究,请勿用于非法用途。 kali安装java环境参考(如有侵权联系删除) https://blog.csdn.net/weixin_54499207/article/details/144985879?sharetypeblog&shareId144985879&…...

QMCDecode:三步快速解密QQ音乐加密音频的免费工具

QMCDecode:三步快速解密QQ音乐加密音频的免费工具 【免费下载链接】QMCDecode QQ音乐QMC格式转换为普通格式(qmcflac转flac,qmc0,qmc3转mp3, mflac,mflac0等转flac),仅支持macOS,可自动识别到QQ音乐下载目录,默认转换结…...

3分钟搞定M3U8视频下载:免费开源工具的终极懒人包

3分钟搞定M3U8视频下载:免费开源工具的终极懒人包 【免费下载链接】N_m3u8DL-CLI-SimpleG N_m3u8DL-CLIs simple GUI 项目地址: https://gitcode.com/gh_mirrors/nm3/N_m3u8DL-CLI-SimpleG 还在为下载在线视频发愁吗?那些藏在网页里的M3U8格式视频…...

Python爬虫实战:从零编写一个健壮的静态页面抓取器!

㊗️本期内容已收录至专栏《Python爬虫实战》,持续完善知识体系与项目实战,建议先订阅收藏,后续查阅更方便~ ㊙️本期爬虫难度指数:⭐⭐⭐ (进阶) 🉐福利: 一次订阅后,专栏内的所有文…...

工业设备数据采集太难?这款.NET8边缘网关,轻松搞定多协议对接

🌈前言如今工业数字化、智能化转型脚步越来越快,工厂现场各类 PLC、仪表、传感器设备型号繁杂,通信协议五花八门,设备数据采集难、协议对接繁琐、多设备统一管控麻烦,一直是很多制造企业、工控从业者头疼的实际问题。市…...

Python爬虫实战:构建博物馆藏品数字档案(列表到详情深度采集)

㊗️本期内容已收录至专栏《Python爬虫实战》,持续完善知识体系与项目实战,建议先订阅收藏,后续查阅更方便~ ㊙️本期爬虫难度指数:⭐⭐⭐ (进阶) 🉐福利: 一次订阅后,专栏内的所有文…...

AI不是产品,是技术,Apple想明白了

一个让我愣住的观点前几天刷 HackerNews,看到一篇被顶到榜首的文章,标题很短,就一句话,AI is a technology, not a product。不是因为这个观点多新奇,而是因为一个显而易见的事实,居然需要有人专门写一篇文…...

米哈游游戏字体库终极指南:轻松获取11款精美架空文字字体资源

米哈游游戏字体库终极指南:轻松获取11款精美架空文字字体资源 【免费下载链接】HoYo-Glyphs Constructed scripts by HoYoverse 米哈游的架空文字 项目地址: https://gitcode.com/gh_mirrors/ho/HoYo-Glyphs 想要为你的设计作品注入《原神》、《崩坏&#xf…...

中兴光猫工厂模式智能解锁:3步获得完全控制权限

中兴光猫工厂模式智能解锁:3步获得完全控制权限 【免费下载链接】zteOnu A tool that can open ZTE onu device factory mode 项目地址: https://gitcode.com/gh_mirrors/zt/zteOnu 你是否曾因中兴光猫的限制而无法进行高级网络配置?是否在需要深…...

三步破解安全研发合规难题:Gitee软件工厂助力GJB5000B与等保三级高标准落地

TL;DR 国家安全领域软件研发需同时满足GJB5000B、等保2.0三级等强制合规要求与智能化装备带来的软件复杂度挑战。传统研发模式在协作、安全、交付三方面日益乏力。Gitee软件工厂通过“统一底座、细粒度权限、标准化流程”三大核心能力,内置SM2/SM4国密加密、IP白名单…...

抖音视频批量下载工具:免费保存去水印内容完整指南

抖音视频批量下载工具:免费保存去水印内容完整指南 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback support.…...

终极微信聊天记录导出指南:用WeChatExporter彻底掌控你的数据主权

终极微信聊天记录导出指南:用WeChatExporter彻底掌控你的数据主权 【免费下载链接】WeChatExporter 一个可以快速导出、查看你的微信聊天记录的工具 项目地址: https://gitcode.com/gh_mirrors/wec/WeChatExporter 在数字时代,微信聊天记录承载着…...

Sunshine游戏串流服务器:如何5分钟内搭建私人云游戏平台?

Sunshine游戏串流服务器:如何5分钟内搭建私人云游戏平台? 【免费下载链接】Sunshine Self-hosted game stream host for Moonlight. 项目地址: https://gitcode.com/GitHub_Trending/su/Sunshine 想象一下,将你的高性能游戏PC变成一个…...