记录一下第一次patch kernel的经历

参考:

向 Linux kernel 社区提交patch补丁步骤总结(已验证成功)_发patch包-CSDN博客

向 Linux 内核社区提交补丁的流程 - 我的笔记集 | RaverStern

作为一个Linux开发人员,但是又不是kernel开发。能够向内核提交代码,一直觉得是一件很cool的事情。最近在开发AMD V3K SOC相关的代码的时候,终于发现了kernel的一些bug,并成功的向内核提交了batch。也算是完成了一个个人的里程碑吧。所以记录一下。

大概流程2周,还提交了两个patch,有点超出预料。

发现第一个bug,主要是因为需要用AMD的SPI controller去接一颗SPI NOR。

AMD SPI driver这里的bug很多,其实挖一下可以修很多bug...但是看代码的过程中,还是发现了spi子系统middle layer的spi-mem有一些缺陷,然后修起来又比较简单,所以就作为试水发了一个patch。

8月5号,发出的patch

8月5号就收到原作者review确认。

8月6号maintainer就确认可以合入。

内核开发的效率还是非常高的。

第二个patch是关于intel igb driver的,net下面的问题,review似乎更加严格。

虽然只是修改一行代码,但是有3个人review了。

8月11号发出patch,8月11号和12号收到2位reviewers的关于git message规范的comments。

于是8月12号又发出了修改之后的patch。

8月12号有reviewer询问如何测试修改。

8月13号回复如何测试。

8月15号maintainer私信说合入他的某个branch。

整个PR流程给我的感觉是内核开发非常活跃,然后开发流程也非常科学。通过git send-email,./scripts/get_maintainer.pl,git format-patch/patchwork等工具非常流畅的发布patch。

对于git message的规范也非常有利于代码review理解和记录。

在commit message中记录why(root cause)和how,以及fix的问题是哪个commit引入的。确实非常好。

### PatchGAN 的卷积核参数与特性 PatchGAN 是一种常用于图像到图像转换任务中的生成对抗网络架构。其核心在于判别器的设计,该判别器不是对整张图片的真实性做出判断,而是针对图像的局部区域(即 patches)。这种设计有助于保留更多的高频细节。 #### 卷积核参数配置 对于 PatchGAN 中使用的卷积层,通常采用较小尺寸的卷积核,具体来说: - **卷积核大小**:大多数情况下选用 `4×4` 大小的卷积核[^1]。 - **步幅 (Stride)**:一般设定为 2,这意味着每次滑动窗口移动两个像素位置,这可以在一定程度上减少特征图的空间维度而不至于过度压缩信息量。 - **填充方式 (Padding)**:"same" 填充模式被广泛应用于保持输入输出的高度宽度一致,除了最后一个可能使用 "valid" 不做额外填充以适应特定需求。 - **通道数变化**:随着层数加深,通道数量逐渐增大,比如从初始阶段的64个通道逐步扩展至最高可达512个通道,这样的增长趋势有利于捕捉更复杂的纹理和结构特征。 #### 特性描述 - **多尺度感受野**:由于采用了不同层次上的下采样操作以及跳跃连接机制,使得模型能够在多个尺度上获取上下文信息,增强了对全局布局的理解能力。 - **防止过拟合措施**:引入了批量归一化 Batch Normalization 和谱归一化 Spectral Normalization 技术来稳定训练过程并缓解内部协方差偏移现象;同时利用 Leaky ReLU 替代传统的ReLU作为激活函数,允许负值传递少量梯度信号,进一步改善收敛性能。 #### Python实现示例 以下是基于 PyTorch 框架的一个简化版 PatchGAN 判别器定义: ```python import torch.nn as nn class NLayerDiscriminator(nn.Module): """Defines a PatchGAN discriminator""" def __init__(self, input_nc=3, ndf=64, n_layers=3, norm_layer=nn.BatchNorm2d): super(NLayerDiscriminator, self).__init__() kw = 4 padw = int(np.ceil((kw - 1.0) / 2)) sequence = [ nn.Conv2d(input_nc, ndf, kernel_size=kw, stride=2, padding=padw), nn.LeakyReLU(0.2, True) ] nf_mult = 1 for n in range(1, n_layers): # gradually increase the number of filters nf_mult_prev = nf_mult nf_mult = min(2 ** n, 8) sequence += [ nn.Conv2d(ndf * nf_mult_prev, ndf * nf_mult, kernel_size=kw, stride=2, padding=padw, bias=False), norm_layer(ndf * nf_mult), nn.LeakyReLU(0.2, True) ] nf_mult_prev = nf_mult nf_mult = min(2 ** n_layers, 8) sequence += [ nn.Conv2d(ndf * nf_mult_prev, ndf * nf_mult, kernel_size=kw, stride=1, padding=padw, bias=False), # last layer uses stride=1 instead of 2 norm_layer(ndf * nf_mult), nn.LeakyReLU(0.2, True) ] sequence += [nn.Conv2d(ndf * nf_mult, 1, kernel_size=kw, stride=1, padding=padw)] # output 1 channel prediction map self.model = nn.Sequential(*sequence) def forward(self, input): return self.model(input) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值