cmake学习方法+CHI独占+ctags编写+C/C++语言原子的序+单核比多核快的C代码

发布时间 2023-08-27 17:17:31作者: 大浪淘沙、

cmake学习方法

主要是cmake这个东西好像有点抽象,而我想要的是完完全全的控制,虽然是花里胡哨的;
但是在高手看来,这些东西有点过家家,而不是真正意义上的技术,甚至经常被怼,净是花拳绣腿,不容易阅读,控制效果不好,有时候还有语法错误云云。
因此我还是用的Makefile,但是想必cmake是更好的,因为我写的Makefile往往要手动对其什么的。

学习的源码下载和步骤如下:
https://cmake.org/cmake/help/latest/guide/tutorial/index.html
这里是一个demo:
tutorial.c是同目录下的C文件

cmake_minimum_required(VERSION 3.15)
project(Tutorial)
add_executable(Tutorial tutorial.c)

执行

cmake .
make

CHI的独占访问

独占访问,还是看CHI的spec,看monitor的部分,看注释。

对于snp空间实现两个monitor

● LP monitor:RN-F内的monitor。

○ LP在执行exclusive Load时,LP monitor会置位;
○ LP对该地址产生的store操作会复位,
○ LP在收到相同地址的无效snoop请求(该地址已经被其它LP更新)也会复位,
○ 如果该store操作是普通的store操作而不是一个exclusive store,LP monitor的值会不会复位取决于具体实现,由于这种操作本身store都是成功的,那么数据踩踏是会发生的,属于软件操作的失误,硬件没有让这样使用。
● PoC monitor:HN-F内的PoC monitor,用于判定exclusive Store事务的结果是成功还是失败。
● 两个monitor的配合使用,LP执行的exclusive store在自己的LP monitor中判定失败,则表示被其它LP抢先执行了exclusive store;而LP执行的exclusive store在自己的LP monitor中判定通过,则送入总线,在PoC monitor处再次判定,若没有被其它LP抢占,则返回成功,否则说明其它LP执行过exclusive store,只是snp请求还未生效,抢占失败。

对于non-snp空间实现1个monitor

● System monitor:这个monitor如果是放在设备侧,则和AXI有点像,如果是放在HN侧,则延时和管理性会提升。看下其它协议的实现,用到再读吧。(AXI 没有snp,没有互联层,实现最简单;ACE的实现有snp,似乎没有互联层,有PoS管理。)

ctags编写

一般ctags是使用ctags软件,解析家目录下的.ctags文件(根据里面的正则),从而生成的ctags文件,被vim编辑器使用。
正则的格式是一方面,另一方面是ctags的格式。
在下述的ctags格式中,定义了.out文件被解析,解析的方式是将A0001和A0002进行关联。
--langdef定义语言
--langmap定义语言匹配的后缀名
--regex-out中,当点击后者X0001,跳转到前者X0002

--langdef=out
--langmap=out:.out
--regex-out=/X0002/X0001/label/

C语言原子的序

其实就是利用了原子操作和aq、rl属性进行的内存排序
https://zh.cppreference.com/w/c/atomic/memory_order
relax是没有aqrl属性的。
custom是aq属性,
seq_cst是aqrl属性,
其它的都是正常人能看懂的。
虽然说memory_order_consume的设计尚有缺陷,建议大家不要使用(但是实现层面和aq完全相同,则可使用)。

enum memory_order {
    memory_order_relaxed,
    memory_order_consume,
    memory_order_acquire,
    memory_order_release,
    memory_order_acq_rel,
    memory_order_seq_cst
};

C++语言原子的序也是类似的。里面有一些运算的例子,带着内存序的,可以试试看。
https://zh.cppreference.com/w/cpp/atomic/memory_order

单核比多核快的C代码

https://blog.csdn.net/Rong_Toa/article/details/109498499

因为多核之间存在cache一致性的操作,而对于需要同步的代码,让它在单核上执行可能会更快。以下为测试代码(测试通过):

#include <pthread.h>
#include <unistd.h>
#include <stdio.h>
static int x __attribute__ ((aligned (64)));
static int y __attribute__ ((aligned (64)));
void * thread_fun1(void* param)
{
        for (int i = 0; i < 1000000000; ++i)
                x++;
        return NULL;
}
void * thread_fun2(void* param)
{
        volatile int c;
        for (int i = 0; i < 1000000000; ++i)
                c =x;
        return NULL;
}
int main()
{
        pthread_t tid1,tid2;
        pthread_create(&tid1,NULL,thread_fun1,NULL);
        pthread_create(&tid2,NULL,thread_fun2,NULL);
        pthread_join(tid1,NULL);
        pthread_join(tid2,NULL);
}

测试方法是taskset命令和time命令。注意,需要使用多核环境才能测试,虚拟机也行。
使用taskset指定核,使用time进行测量。

cat /proc/cpuinfo
time ./a.out # 测试多核
time taskset -c 0 ./a.out  # 测试单核0