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

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

时间:2023-08-27 17:24:28浏览次数:49  
标签:核快 cmake monitor ctags LP memory 比多 order store

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

标签:核快,cmake,monitor,ctags,LP,memory,比多,order,store
From: https://www.cnblogs.com/bai2022/p/17649830.html

相关文章

  • 【转载】CMake从头开始学习-上
    这篇文章写的太好了非常适合新手入门,原文链接是https://subingwen.cn/cmake/CMake-primer/index.html......
  • cmake定义宏
    比如在打印日志信息的时候定义宏test.cpp#include<stdio.h>#defineNUMBER3intmain(){inta=10;#ifdefDEBUGprintf("我是一个程序猿,我不会爬树...\n");#endiffor(inti=0;i<NUMBER;++i){printf("hello,GCC!!!\n");......
  • cmake中list,set的对字符串操作
    cmake中所有的对象都是string,所以我们对这些的操作就是对字符串的操作,里面提供追加和删除的方法 CMakeLists.txtcmake_minimum_required(VERSION3.15)project(test)#方式二file(GLOBSRC${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp)message("=========================")m......
  • cmake动态库
    动态库有传递性,但是通过修饰符修饰public可传递,因为需要用到动态链接库,而且动态链接库只不过是一个文件,只能生成的可执行文件后面,因为只有有了可执行文件才需要链接动态库CMakeLists.txtcmake_minimum_required(VERSION3.15)project(test)#添加头文件aux_source_director......
  • cmake生成动静态库文件及目录
    CMakeLists.txtcmake_minimum_required(VERSION3.15)project(test)#set(SRCadd.cpp;div.cpp;mult.cpp;main.cpp;sub.cpp)#${PROJECT_SOURCE_DIR}指定的就是cmakelists所在的路径aux_source_directory(搜索路径)方式一#aux_source_directory(${PROJECT_SOURCE_DIR}/sr......
  • cmake构建简单项目
    CMakeLists.txtcmake_minimum_required(VERSION3.15)project(test)#set(SRCadd.cpp;div.cpp;mult.cpp;main.cpp;sub.cpp)#${PROJECT_SOURCE_DIR}指定的就是cmakelists所在的路径aux_source_directory(搜索路径)方式一#aux_source_directory(${PROJECT_SOURCE_DIR}/sr......
  • CMake保姆级教程
    来源哔哩哔哩2.编写一个简单的CMakeLists.txt文件_哔哩哔哩_bilibiliCMake保姆级教程(上)|爱编程的大丙(subingwen.cn)......
  • g2o编译出现的问题及解决办法 By not providing "FindG2O.cmake" in CMAKE_MODULE_PAT
    在安装完该g2o之后运行一些程序如高翔的ch6代码会出现如下错误:CMakeWarningatCMakeLists.txt:10(FIND_PACKAGE):Bynotproviding"FindG2O.cmake"inCMAKE_MODULE_PATHthisprojecthasaskedCMaketofindapackageconfigurationfileprovidedby"G2O",bu......
  • 手动将QT项目打包成exe(手动打包,不是CMake自动打包)
    综述:仅记录QT项目打包的过程。构建工具:CMake主要流程:确保项目软件可以正常运行。使用release生成发布文件夹。将发布文件夹中的运行文件和依赖文件打包到另一个文件夹中。步骤:一、确保项目软件可以正常运行。点击左下角的运行按键确保软件正常运行(如果不能正常运行,下......
  • 【Protoc】VS2019 (VS平台) 使用 CMake 编译安装、使用 Protobuf 库
    背景:工作中需要使用到protobuf,看了一些教程,感觉都不是很适合,便自己总结一些开发环境:Win10VS2019CMake3.24.2Protobuf3.21.12(Protoc版本必须于Protobuf版本一致)MinGW版本的编译在之后有空再研究。https://stackoverflow.com/questions/9243816/how-to-build-......