c++26新功能—Read-Copy-Update

深入理解RCU无锁的核心原理 其中很多实现都可以说是非常精巧,结合了预处理,批量处理,延后(异步)处理,多核并发,原子操作,异常处理,多场景精细优化等多种技术,性能好,可扩展性强,稳定性强,有一定的学习和参考价值,即使你的工作不是内核编程,里面体现很多编程思想和代码设计思想,也是值得大家学习的。 阅读详情

一、RCU

RCU,Read-Copy-Update,读复制更新机制。RCU的原理是分成以下几步:
1、无锁的高并发读取
读任务可以无锁的情况下使用RCU临界区(控制读的操作周期),直接操作数据读取,并且不会被写任务阻塞。这个在前面的多线程中,往往区别就在于写会独占操作,防止出现脏数据
2、副本写操作的控制
写任务会拷贝一个数据副本并在其上进行写入操作。完成后,使用原子操作将原数据指针指向此副本,但原数据不会立刻删除,需要等待所有正在使用它的读任务退出临界区后(宽限期)后才能进行回收
3、宽限期
旧数据到替换到所有读者完成读需要的临界区窗口时间,即此时间后,旧数据的内存才会被安全回收。为了提高安全性,可以定义不同的RCU域,用来隔离相关的任务子系统。

二、并行中的应用

并发编程的应用场景有很多,但有一种非常常见的应用场景,就是读多写少的应用场景。比如电商中常见商品说明页面、促销页面及历史购物页面等,上层应用的多线程中的缓存以及分布式共享内存等,内核中的网络堆栈管理、文件系统中的元数据操作等。在这种应用下,在不同的层次上会展开不同层次的处理方式。
那么在内核和上层应用中,就会应用到Read-Copy-Update(RCU)。它做为并发编程中的延迟清理方法,对于增强系统的实时性和稳定性有重要作用。RCU其实并不是一个多么新的概念,在Linux和Folly等库中都有类似的实现。如果有内核开发经验或者使用过相关库及框架的小伙伴们就会深有感触。
RCU,主要就是应用在高频读,低频写。但不适合于内存要求控制严格的场景。
C++标准的发展的一个重要方向就是并行编程,所以为解决并行的技术会不断的增加和完善。而RCU就是C++26为了解决高并场景下的无锁读+非阻塞写的一个解决方案。它通过对旧内存数据的延迟回收及宽限期机制处理来平衡性能和安全。可以简单的理解为将原有的相关的C++上层应用的库或框架中的RCU机制以及内核中的框架机制整合后形成的一个新的标准RCU机制。
它是不是有点无锁编程的味道?对,其实就是这么个意思。所以它也可能产生无锁编程中的ABA问题,所以在标准的实现中,使用了原子指针的替换机制。

三、例程

看一下相关的例程(使用锁和RCU的对比):

//With Reader-Writer Locking 
struct Data /* members */ ;
Data* data_; std::atomic<Data*> data_;
std::shared_mutex m_;
template <typename Func>  
Result reader_op(Func fn) {  
std::shared_lock<std::shared_mutex> l(m_);  
Data* p = data_;  
// fn should not block too long or call update() 

return fn(p); return fn(p);
}

// May be called concurrently with reader_op  
void update(Data* newdata) { void update(Data* newdata) {
Data* olddata; 
{
std::unique_lock<std::shared_mutex> wlock(m_);
olddata = std::exchange(data_, newdata);
}  
delete olddata; // reclaim *olddata immediately  
}

//With RCU in the synchronous style
struct Data /* members */ ;
std::atomic<Data*> data_;
template <typename Func>
Result reader_op(Func fn) {
std::scoped_lock l(std::rcu_default_domain());
Data* p = data_;
// fn should not block too long or call
// rcu_synchronize(), rcu_barrier(), or
// rcu_retire(), directly or indirectly
return fn(p);
}
// May be called concurrently with reader_op
void update(Data* newdata) {
Data* olddata = data_.exchange(newdata);
std::rcu_synchronize(); // wait until it’s safe
delete olddata; // then reclaim *olddata
}

代码大家只要理解区别就可以,毕竟真实的标准推出还得看最后的结果。不要过于强调代码的实现细节。

四、总结

实践出真知,这个是非常有道理的。没有实际的应用场景的不断的推动。那么技术的发展就会成为无源之水,无本之木。也正是近二十年来互联网特别是移动互联网的高速发展,爆发出了大量的实际应用需求。推动和发展着计算机技术不断的向前演进。而C++语言做为其中一个重要的环节,也为解决这些需求在不断的完善和发展。RCU技术就是其中一个具体的例子。

基于YOLO26与PySide6的PCB缺陷智能检测系统实战指南 目标检测作为计算机视觉的核心技术,通过深度学习模型自动识别图像中的特定对象并定位其位置,其原理是让模型从大量标注数据中学习特征表达与空间关系。这项技术在工业自动化领域具有重要价值,能够大幅提升生产流程的智能化水平。在电子制造、精密加工等场景中,对产品进行高效、精准的质量检测是核心需求。本文聚焦于PCB(印刷电路板)缺陷检测这一具体应用,深入探讨如何利用YOLO26这一高效的目标检测模型,结合PySide6框架构建直观的图形界面,打造一个从数据准备、模型训练到系统集成的完整解决方案,以解决传统人工质检效率低、 阅读详情

相关推荐

彻底解决Linux下GLIBCXX_3.4.26 not found动态库版本错误

在Linux系统开发与部署中,动态链接库版本冲突是常见的运行时问题,其核心在于程序所需的库符号版本与系统提供的版本不匹配。这通常源于GCC编译器版本与C++标准库libstdc++.so.6的迭代更新,新版本引入了新的ABI(应用二进制接口)和符号定义。理解动态链接器的搜索路径(如LD_LIBRARY_PATH、ldconfig缓存)是解决此类问题的关键,它确保了程序在运行时能定位到正确的依赖库。这一原理对于保障复杂软件栈(如机器学习框架Anaconda、科学计算环境)的稳定运行至关重要。当在Anacond

weixin_30463341的博客 394

C++中的RingBuffer,双Buffer,RCU

ringbuffer适用于单生产者,单消费者的场景,虽然是两个线程,但是却不用加锁,可以用数组或者链表实现,以下介绍一种典型的数组实现方法,注意整个Buffer的大小是预先要定好的。如图,N = 5,但是要区分满和空,所以实际存储的大小要比N小1,也就是只能存储4个元素。write和read是两个指针,也可以看成是序号,都是指向下一个要写或者要读的位置!注意这一点很关键,是下一次要读/写的位置!

weixin_46168796的博客 2015

C/C++生产级Trie实现:内存布局、性能优化与工程落地

Trie(前缀树)是一种基础而关键的字符串索引数据结构,其核心原理是通过字符路径共享实现高效前缀匹配与空间复用。在嵌入式、实时系统及高性能服务等工程场景中,Trie的性能价值远超理论复杂度——它直接决定关键词检索延迟、内存 footprint 与缓存命中率。区别于教学版链表或固定数组实现,生产级Trie需兼顾确定性内存行为、CPU缓存亲和性与多字符集兼容性,典型技术路径包括压缩数组+二分查找、内存池化分配、UTF-8码点抽象及序列化扁平化。本文聚焦C/C++底层实现细节,覆盖从裸机部署到混合接口封装的全栈实

weixin_30938149的博客 436

RCU锁

RCU锁 参考: http://blog.jobbole.com/107958/

zhaojie8324616的博客 630

离线容器化AI聊天机器人:air-gapped环境下LLM部署全栈实践

在等保三级、金融政务、能源边端等强隔离场景中,'离线大模型部署'已成为刚需。其本质是构建一个不依赖网络、不外泄数据、可审计可验证的本地AI推理闭环——核心在于模型格式(GGUF)、推理引擎(llama.cpp)、容器运行时(seccomp+只读根)与前端协议(OpenAI兼容)四层协同。技术原理上,需通过内存映射加载、CUDA动态绑定、系统调用白名单等手段,彻底切断DNS解析、HTTP请求、证书校验等隐式联网行为;其技术价值在于满足合规底线(零外联)、保障数据主权(原始文本不出域)、支撑边缘智能(无网可用)

weixin_30388677的博客 385

Gemma 4实战指南:边缘可驻留、推理可预测、微调可复现的AI系统

大语言模型(LLM)正从云端中心化走向设备端原生智能,核心挑战在于如何在算力受限、功耗敏感、部署环境多变的边缘设备上实现稳定高效的AI推理。‘边缘AI’不再仅指模型轻量化,而是要求模型架构与硬件物理约束深度协同——包括缓存容量、DSP指令集、内存带宽与散热边界。Gemma 4提出的‘边缘可驻留、推理可预测、微调可复现’三大原则,正是对这一趋势的技术回应:它通过硬件锚定设计(如E2B适配骁龙L3缓存)、智能密度量化(准确率/毫秒)、统一多模态协议栈等机制,将AI能力真正嵌入树莓派、Jetson、Android

cunbei2644的博客 1111

无锁编程(五) - RCU(Read-Copy-Update)

RCU(Read-Copy Update) RCU就是指读-拷贝修改,它是基于其原理命名的。对于被RCU保护的共享数据结构,读操作不需要获得任何锁就可以访问,但写操作在访问它时首先拷贝一个副本,然后对副本进行修改,最后在适当的时机把指向原来数据的指针重新指向新的被修改的数据。这个时机就是所有引用该数据的CPU都退出对共享数据的操作。 Linux内核中内存管理大量的运用到了RCU机制。为每个内存...

weixin_34101784的博客 427

Proposed RCU C++ API

推荐一种RCU (Read-Copy-and-Update) API,C++实现。帮助你设计高效可扩展且线程安全的RCU接口

深入理解RCU|核心原理

hi,大家好,今天给大家分享并行程序设计中最重要的锁-RCU锁,RCU锁本质是用空间换时间,是对读写锁的一种优化加强,但不仅仅是这样简单,RCU体现出来的垃圾回收思想,也是值得我们学习和借...

极客重生 1万+

基于CNN的表情识别(FER)pytorch实现

Report for FER Jian Tang Abstract 我们使用卷积神经网络(CNN)实现了baby的面部表情识别(FER)。 数据上,我们获取了开源FER数据集FER2013[1],besides我们使用爬虫获取了baby相关的人脸图片,进行了手工分类标注以形成一个全新的baby FER数据集。 模型上,我们首先复现了Luan[2]的工作,即参考Kuo[3]在CVPR 2018上的工作并实现一个轻量的CNN网络,在FER2013上进行训练并得到了XXXX%的平均分类准确率(avg a

qq_20241587的博客 3683

手把手调试Android 14 ShellTransitions:用Log追踪ActiveTransition与Handler匹配过程

本文详细介绍了在Android 14中调试ShellTransitions机制的方法,重点通过Log追踪ActiveTransition与Handler的匹配过程。文章提供了关键日志点植入策略、Handler匹配机制解析及实战调试案例,帮助开发者解决窗口转场动画中的卡顿和错乱问题,提升系统动画性能。

weixin_42652674的博客 431

react-native-windows 中 folly RCU(Read-Copy-Update)同步机制实战指南

`folly/synchronization/Rcu.h` 是 Meta 的 folly 库提供的 C++ 读-复制-更新(Read-Copy-Update,RCU)同步机制实现,它允许读者以近乎零开销的方式进入临界区读取共享状态,同时让写者安全地更新数据并延迟回收旧对象。本指南以 [Rcu.md](https://link.gitcode.com/i/91e3554316f96ce23d7bec

gitblog_00391的博客 1004

潜在图神经网络学习笔记(Latent Graph Neural Networks for Human Skeleton-based Action Recognition)

在本文中,我们从一个新的角度来解决这个问题,通过将非结构化的骨架数据映射到潜在空间,如图2所示,这里称为潜在特征空间或嵌入空间,其中一组项嵌入在一个流形中[ 1 ],并且在潜在空间中彼此更相似的项被放置在彼此更接近的位置。潜在空间中的位置可以被认为是由一组潜在变量定义的,这些潜在变量来源于对象的相似性。将骨架数据嵌入到流形中,消除了远近邻居之间的冗余依赖关系,以解决加权问题。得到具有多尺度聚合特征的稀疏图矩阵结构,以更好地理解骨骼关节的直接加权信息。

qq_45631885的博客 489

C++26新特性深度解析:从契约、反射到执行控制库的编程范式演进

在C++编程语言的发展历程中,每一次标准迭代都代表着编程范式的演进与工程实践能力的提升。C++26作为即将到来的新标准,其核心目标是在巩固现代C++特性的基础上,向更安全、更高效、更易用的方向迈进。从语言层面看,契约(Contracts)机制通过显式声明前置条件、后置条件和断言,将文档转化为可执行的检查,显著增强了代码的健壮性和可维护性;反射(Reflection)特性则允许程序在编译期查询和操作自身结构,为序列化、依赖注入等场景带来革命性的简化。在标准库层面,执行控制库(std::execution)引入

weixin_33724659的博客 419

ROS2实战:手把手教你用CMake集成自定义DDS(以CycloneDDS为例)

本文详细介绍了如何在ROS2中通过CMake集成自定义DDS(以CycloneDDS为例),涵盖环境准备、源码编译、ROS2工作区集成、性能调优及常见问题排查。通过RMW中间件抽象层,开发者可以灵活切换DDS实现,提升系统实时性和可靠性。

weixin_29284201的博客 347

echarts实现3D地图——map3D

【代码】echarts实现3D地图——map3D。

xiaoququ的博客 7324

Android端侧AI落地:llama.cpp移植实战与运行时优化

端侧AI指在终端设备本地完成模型推理的技术范式,其核心在于轻量化、低延迟与隐私可控。llama.cpp作为主流C/C++推理引擎,凭借纯CPU计算、GGUF格式支持和细粒度量化能力,成为Android端部署大语言模型的关键基础设施。其技术价值体现在规避网络依赖、保障数据不出设备、适配中低端ARM64芯片,并支撑离线问答、嵌入生成等实用场景。本文聚焦真实工程落地,覆盖NDK交叉编译、JNI内存生命周期管理、SELinux权限适配、mmap预热优化等硬核环节,特别针对Q4_K_M/GGML_NATIVE等关键热

weixin_30715523的博客 512

3D LUT Color Conversion之总体架构设计之三

摘要:本文提出了一种基于三维坐标一维化寻址的四面体网格编码方法。通过定义全局网格坐标P(R,G,B)=R+9G+81B和局部增量(ξ,η,ζ)∈{0,1},推导出偏移量Δ(ξ,η,ζ)=ξ+9η+81ζ的平移不变性质。该方法将6种坐标排序情况(Case)对应的固定偏移量三元组预先存储,其中V0和V3的偏移量恒定为0和91。硬件实现时只需根据Case选择对应常量组,无需实时计算坐标,显著提高了处理效率。该方案利用线性寻址公式的特性,确保相同局部结构在不同位置具有一致的偏移模式。(149字)

大熊 49

llama.cpp 推理实战:在 CPU、Apple Silicon 与 AMD/Intel 显卡上部署 GGUF 量化大模型

llama.cpp 是当前在非 NVIDIA 硬件上运行大语言模型(LLM)推理的首选方案,它以纯 C/C++ 实现、依赖极少,专为 CPU、Apple Silicon(M1/M2/M3/M4)以及 AMD/Intel 显卡优化。本文以 AI-Research-SKILLs 仓库中 [llama.cpp 技能文档](https://link.gitcode.com/i/81f0755bcca9ad

gitblog_01200的博客 542

基于C++和Basler SDK的相机开发详解

Basler相机是德国Basler公司生产的高性能工业相机,具有高分辨率、高帧率和低噪声的特点。Basler相机广泛应用于机器视觉、工业自动化、医疗影像和安防监控等领域。高分辨率和高帧率:能够捕捉清晰、细腻的图像。多种接口:支持USB、GigE、Camera Link等多种接口,方便不同应用场景的需求。丰富的配置选项:支持多种图像格式、分辨率和帧率的配置,适应不同的应用需求。本文详细介绍了如何基于C++和Basler SDK进行相机开发,涵盖了从环境搭建、相机连接、图像采集到图像处理的完整过程。

qq_38334677的博客 2100

Echarts - 去掉图表上的横线和竖线

效果图 默认效果: 变为如下图所示效果: 实现方法 官方配置文档:https://echarts.apache.org/zh/option.html#radar.splitLine 在 xAxis yAxis 配置中分别加入以下代码: splitLine: { show:false }

🏆 前端领域优质创作者 1万+

C++多线程性能优化:从锁竞争到无锁编程实战

多线程编程是现代软件开发的核心技术,尤其在多核CPU架构下,合理利用并发能力直接影响系统性能。从原理上看,线程同步本质是解决共享数据访问的原子性与可见性问题,传统互斥锁通过系统调用实现临界区保护,但会引入上下文切换和缓存失效开销。在金融交易、游戏服务器等高并发场景中,锁竞争可能成为主要性能瓶颈。通过细粒度锁、读写锁、无锁数据结构等优化手段,配合C++11原子操作与内存模型,可以显著提升吞吐量。实践表明,合理使用atomic、CAS等无锁技术,结合缓存行对齐、内存顺序控制等硬件级优化,能使关键路径性能提升10

weixin_33709219的博客 331

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

ClickHouse v26.3.19.3 LTS 发布解析:RESTORE 数据持久性修复与构建依赖升级

本篇文章基于 ClickHouse 官方 changelog([docs/changelogs/v26.3.19.3-lts.md](https://link.gitcode.com/i/0a5714607c79819664521c853adee1b6)),深入剖析 v26.3.19.3-lts 这个补丁版本带来的两项关键变化:一是 `RESTORE` 恢复流程中缺失 fsync 导致的数据丢失风

gitblog_00576的博客 476

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

如何用 OpenCode Manager 变更讲解功能:让 AI 逐文件讲解你的每一次代码改动

OpenCode Manager 是一个自托管的 OpenCode 指挥中心,集会话、Git、终端和定时任务于一体,可在手机或浏览器中访问。它的「变更讲解」(Change Walkthrough)功能可以让 AI 自动梳理一次会话中的全部代码改动,逐文件生成一份可交互的讲解页面:哪里改了、为什么改、影响什么,一目了然,特别适合代码评审和快速接手他人工作。 [![OpenCode Manager

gitblog_00880的博客 134

C++机试备考指南:核心语法与实战技巧

C++作为系统级编程语言的核心,其指针、内存管理和STL容器等基础概念构成了底层开发的基石。通过编译原理实现的静态类型检查机制,配合RAII资源管理范式,使C++在性能敏感场景中保持独特优势。在游戏引擎、高频交易等工业级应用中,对IO性能优化和线程安全队列的实现要求尤为严格。以2024年企业招聘数据为例,85%的游戏开发岗位将STL容器选用和智能指针应用列为必考项。本文通过归并排序非递归实现等典型算法范式,结合VSCode+MinGW环境配置实战,系统讲解面向机试的C++工程化编码技巧。

weixin_30448603的博客 430

hashcracker 实战指南:基于 C++23 策略模板架构的多线程哈希破解工具

`hashcracker` 是 Cybersecurity-Projects 仓库中一个面向入门级的 C++23 多线程命令行工具,用于从 MD5、SHA1、SHA256、SHA512 等快速哈希中恢复明文密码。它内置字典攻击、暴力破解与规则变异三种攻击策略,并通过策略模板 + 编译期多态实现接近零开销的热循环。读完本文,你将掌握它的完整命令行用法、三种攻击模式的实战操作,以及 mmap 零拷贝、

gitblog_01051的博客 982
上一篇: 跟我学C++中级篇——进程内存空间的管理
下一篇: 设计心得——同步和异步
fpcc
fpcc 新星创作者: C/C++技术领域 新星创作者: C/C++技术领域
博客等级 码龄22年 4041粉丝 1190原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值