Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

add atomic support. #6197

Closed
wants to merge 2 commits into from
Closed

add atomic support. #6197

wants to merge 2 commits into from

Conversation

Guozhanxin
Copy link
Member

@Guozhanxin Guozhanxin commented Jul 28, 2022

拉取/合并请求描述:(PR description)

[
添加 原子操作

  • 原子类型定义
  • 用户使用 API 列表
  • 架构移植接口
  • 测试用例
  • ARM 架构实现
  • RISC-V 架构实现
  • X86 架构实现
  • 其他架构

性能测试

  • 单核下相比于关中断性能比较
  • 多核下相对于关中断性能比较
  • 将内核中全局变量关中断的地方改完原子操作能否提升内核性能?(线程切换时间?中断响应延时?网络吞吐速度?)

如何融合到内核中,提升内核性能?

]

以下的内容不应该在提交PR时的message修改,修改下述message,PR会被直接关闭。请在提交PR后,浏览器查看PR并对以下检查项逐项check,没问题后逐条在页面上打钩。
The following content must not be changed in the submitted PR message. Otherwise, the PR will be closed immediately. After submitted PR, please use a web browser to visit PR, and check items one by one, and ticked them if no problem.

当前拉取/合并请求的状态 Intent for your PR

必须选择一项 Choose one (Mandatory):

  • 本拉取/合并请求是一个草稿版本 This PR is for a code-review and is intended to get feedback
  • 本拉取/合并请求是一个成熟版本 This PR is mature, and ready to be integrated into the repo

代码质量 Code Quality:

我在这个拉取/合并请求中已经考虑了 As part of this pull request, I've considered the following:

  • 已经仔细查看过代码改动的对比 Already check the difference between PR and old code
  • 代码风格正确,包括缩进空格,命名及其他风格 Style guide is adhered to, including spacing, naming and other styles
  • 没有垃圾代码,代码尽量精简,不包含#if 0代码,不包含已经被注释了的代码 All redundant code is removed and cleaned up
  • 所有变更均有原因及合理的,并且不会影响到其他软件组件代码或BSP All modifications are justified and not affect other components or BSP
  • 对难懂代码均提供对应的注释 I've commented appropriately where code is tricky
  • 本拉取/合并请求代码是高质量的 Code in this PR is of high quality
  • 本拉取/合并使用formatting等源码格式化工具确保格式符合RT-Thread代码规范 This PR complies with RT-Thread code specification

@Guozhanxin Guozhanxin marked this pull request as draft July 28, 2022 02:46
@Guozhanxin Guozhanxin marked this pull request as ready for review July 29, 2022 01:58
@aozima
Copy link
Member

aozima commented Jul 29, 2022

赞! RISC-V计划啥时候上线?

关联 #1339

@Guozhanxin
Copy link
Member Author

赞! RISC-V计划啥时候上线?

关联 #1339

risc-v 好像有工具链内联函数哎

/*
* atomic interfaces
*/
void rt_atomic_add(rt_atomic_t *ptr, rt_atomic_t val);
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

放这边吗?如果是这边,API前缀应该是rt_hw_

@BernardXiong
Copy link
Member

PR title是否也需要调整的,stomic or atomic?

@BernardXiong
Copy link
Member

@GuEe-GUI 麻烦关注其中的aarch64实现情况;

@Guozhanxin 对于ARM32来说,需要分别来多做验证,包括:arm7,arm cortex-m0/m3/../m7(后面几个估计都有对应的,前面的可能反而是麻烦的),arm cortex-a的情况。

@GuEe-GUI
Copy link
Contributor

GuEe-GUI commented Aug 8, 2022

建议增加以下接口:

使用频率较高的接口

rt_atomic_t  rt_atomic_read(rt_atomic_t *ptr);
void rt_atomic_inc(rt_atomic_t *ptr);
void rt_atomic_dec(rt_atomic_t *ptr);

可能调用方想要知道独占的情况:

rt_atomic_t rt_atomic_add_return(rt_atomic_t *ptr, rt_atomic_t val);
rt_atomic_t rt_atomic_sub_return(rt_atomic_t *ptr, rt_atomic_t val);
rt_atomic_t rt_atomic_inc_return(rt_atomic_t *ptr);
rt_atomic_t rt_atomic_dec_return(rt_atomic_t *ptr);

@Guozhanxin Guozhanxin changed the title add stomic support. add atomic support. Aug 8, 2022
@Guozhanxin
Copy link
Member Author

是的,M0没有,其他的都有。在scons脚本里做了处理。其他的都能正常编译通过。

image

@Guozhanxin
Copy link
Member Author

建议增加以下接口:

使用频率较高的接口

rt_atomic_t  rt_atomic_read(rt_atomic_t *ptr);
void rt_atomic_inc(rt_atomic_t *ptr);
void rt_atomic_dec(rt_atomic_t *ptr);

可能调用方想要知道独占的情况:

rt_atomic_t rt_atomic_add_return(rt_atomic_t *ptr, rt_atomic_t val);
rt_atomic_t rt_atomic_sub_return(rt_atomic_t *ptr, rt_atomic_t val);
rt_atomic_t rt_atomic_inc_return(rt_atomic_t *ptr);
rt_atomic_t rt_atomic_dec_return(rt_atomic_t *ptr);

rt_atomic_read 不应该本身就是原子的吗?

@GuEe-GUI
Copy link
Contributor

GuEe-GUI commented Aug 8, 2022

建议增加以下接口:
使用频率较高的接口

rt_atomic_t  rt_atomic_read(rt_atomic_t *ptr);
void rt_atomic_inc(rt_atomic_t *ptr);
void rt_atomic_dec(rt_atomic_t *ptr);

可能调用方想要知道独占的情况:

rt_atomic_t rt_atomic_add_return(rt_atomic_t *ptr, rt_atomic_t val);
rt_atomic_t rt_atomic_sub_return(rt_atomic_t *ptr, rt_atomic_t val);
rt_atomic_t rt_atomic_inc_return(rt_atomic_t *ptr);
rt_atomic_t rt_atomic_dec_return(rt_atomic_t *ptr);

rt_atomic_read 不应该本身就是原子的吗?

读内存数据至少需要两条指令。

@Guozhanxin
Copy link
Member Author

建议增加以下接口:
使用频率较高的接口

rt_atomic_t  rt_atomic_read(rt_atomic_t *ptr);
void rt_atomic_inc(rt_atomic_t *ptr);
void rt_atomic_dec(rt_atomic_t *ptr);

可能调用方想要知道独占的情况:

rt_atomic_t rt_atomic_add_return(rt_atomic_t *ptr, rt_atomic_t val);
rt_atomic_t rt_atomic_sub_return(rt_atomic_t *ptr, rt_atomic_t val);
rt_atomic_t rt_atomic_inc_return(rt_atomic_t *ptr);
rt_atomic_t rt_atomic_dec_return(rt_atomic_t *ptr);

rt_atomic_read 不应该本身就是原子的吗?

读内存数据至少需要两条指令。

为什么会需要两条指令呢?地址不对齐?

@GuEe-GUI
Copy link
Contributor

GuEe-GUI commented Aug 8, 2022

为什么会需要两条指令呢?地址不对齐?

1.将目的地址加载入寄存器。
2.从内存或缓存上加载目的地址的数据到寄存器。

@Guozhanxin
Copy link
Member Author

寄存器

可是第一步“将目的地址加载入寄存器”,寄存器属于私有化的数据吧,不存在原子操作的说法吧。也不会有人再操作这个寄存器。
就算这两个指令中间被打断,也不会对结果有影响啊。

@GuEe-GUI
Copy link
Contributor

GuEe-GUI commented Aug 8, 2022

寄存器

可是第一步“将目的地址加载入寄存器”,寄存器属于私有化的数据吧,不存在原子操作的说法吧。也不会有人再操作这个寄存器。 就算这两个指令中间被打断,也不会对结果有影响啊。

主要是屏障方面的问题,请参考:https://www.kernel.org/doc/html/v4.12/core-api/atomic_ops.html

@BernardXiong
Copy link
Member

是的,M0没有,其他的都有。在scons脚本里做了处理。其他的都能正常编译通过。

image

这个,如果M0没有,但是代码中使用了原子操作,这个时候怎么处理?符号找不到?

@Guozhanxin
Copy link
Member Author

是的,M0没有,其他的都有。在scons脚本里做了处理。其他的都能正常编译通过。
image

这个,如果M0没有,但是代码中使用了原子操作,这个时候怎么处理?符号找不到?

目前就是会报找不到,后面计划用开关中断实现一份通用的放进来。

@mysterywolf mysterywolf added v5.0.0 and removed v4.1.1 labels Aug 16, 2022
return result;
}

void rt_atomic_add(rt_atomic_t *ptr, rt_atomic_t val)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

似乎不是这样支持的,针对add操作,似乎是这样:

libcpu等相关的,可以提供rt_hw_atomic_add接口;
src/atomic.c可以提供rt_atomic_add接口;

同时,针对没有机器级指令来确保atomic操作的,需要由函数实现的方式确保对应操作是原子话操作的,例如rt_atomic_add操作,它由可能在一些或某些代码中被直接使用,而不会考虑底层硬件平台是否支持atomic操作。

@BernardXiong
Copy link
Member

v5.0建议重点推进这份 PR

@BernardXiong
Copy link
Member

这里是一份无锁的rb,如果支持了atomic操作,也可以尝试下:
https://github.com/DNedic/lfbb

@aozima
Copy link
Member

aozima commented Oct 11, 2022

最近在项目中有使用#include <stdatomic.h>,感觉挺方便的,是否可以直接考虑兼容呢。
或是直接用,但给不支持C11的环境做个适配?。

@mysterywolf
Copy link
Member

v5.0建议重点推进这份 PR

坚决支持,尤其是基于无锁操作衍生的例如上面提到的无锁ringbuffer等上层基础无锁设施

@Guozhanxin
Copy link
Member Author

最近在项目中有使用#include <stdatomic.h>,感觉挺方便的,是否可以直接考虑兼容呢。 或是直接用,但给不支持C11的环境做个适配?。

参见 #6931

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

5 participants