![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C/C++
文章平均质量分 90
一念之卓
这个作者很懒,什么都没留下…
展开
-
处理器协同机制其三C++内存顺序与栅栏(及依赖性读屏障)
读写屏障的硬件原理:取取屏障,保证其前加载先于其後。处理器对此不乱序,且加载的结果有序,是为取取屏障。存存屏障,保证其前存储先于其後。处理器对此不乱序,且存储的结果有序,是为存存屏障。取存屏障,保证其前加载先于其後存储。但需处理器对此不乱序,即为取存屏障。存取屏障,保证其前存储先于其後加载。处理器对此不乱序,且当即处理所有存储缓冲(之後的加载可能即时發生,此前对缓存的更改必须完成),此前无效队列的消息必须在此後相关缓存行的加载之前处理完成(保证之後加载的数据有效)。而处理器实现有三种..原创 2021-09-20 14:37:38 · 935 阅读 · 0 评论 -
处理器协同机制其二内存屏障与内存顺序(及Store Buffer与Invalidate Queue)
三、存储缓冲与无效队列 当处理器需要的数据不在其缓冲中,需要请求,等待内存或其他缓存来响应,这个过程降低了处理器的工作效率。为此,引入存储缓冲,处理器只需要将修改的内容放入存储缓冲,就可以继续执行了,存储缓冲中的数据会适时地刷新到其缓存中。 存储缓冲的引入,可能会出现数据不一致的情况,为此需要存储转發机制。即处理器读取数据优先从存储缓冲中读取。 同时,存储缓冲引入了存储的乱序,处理器先向存储缓冲写入数据,後向其缓存写入数据,对于另一处理器可能会感知写入顺序...原创 2021-09-20 14:33:32 · 814 阅读 · 0 评论 -
处理器协同机制其一缓存一致性协议(MESI)
一、缓存结构 现代CPU的速度远快于内存系统,因此引入缓存(Cache),其结构如下: 缓存和内存以固定大小的数据块进行交互,这些数据块被称为缓存行,其大小一般是2的整数幂次。在硬件上,用哈希表来实现高速缓存。Cache miss : 缓存缺失,CPU要操作的数据不在其缓存中,需要从他处获取(一般是内存)。Cache hit : 缓存命中,CPU要操作的数据在其缓存中,可以直接操作缓存。 提升缓存命中率,能提高系统性能。从缓存为空,CPU不断处...原创 2021-09-20 14:23:41 · 362 阅读 · 0 评论 -
用单精度浮点模拟双精度的运算,实现扩展浮点精度的算法
实际上,任何精度的浮点运算也可以像BigInteger那样计算,可以用多个浮点数据表示更高精度的浮点数据。而这就要求实现带余数的浮点四则运算。带余数的浮点四则运算的定义:加法和减法,余数和结果的和能精确表示运算值。乘法和除法,余数和结果必须同号,对于乘法,余数和结果的和能精确表示运算值,而对于除法,余数就是原来的意思。不多解释,代码如下:(可能存在错误)#include <iostream>#include <xmmintrin.h>using na.原创 2020-11-04 22:20:41 · 1809 阅读 · 0 评论 -
整型和浮点类型的转换,int与float,double互转的快速实现(在没有对应的汇编指令情况下)
如果没有类型转换对应的汇编指令,我们可以用浮点加法来完成整型和浮点类型的互转。如果有对应的汇编指令,调用之明显更简单高效,然而有些情况下类型转换会溢出,这要注意,计算机不会检查溢出而返回错误结果。一般来说,一次整型和浮点类型的互转的消耗和浮点加法一样,实际就是用浮点加法实现的类型转换。代码如下(不解释):typeconvert.h#include <stdint.h>//以下所有实现经过了严格测试,可以保证无误。其中,标准实现不会溢出,而用指令转换可能溢出。/** * 转原创 2020-09-23 16:56:19 · 2090 阅读 · 0 评论 -
定点运算及最优三角函数算法(不使用浮点计算)精度18位二进制小数
内嵌汇编代码:#include "r_math.h"/*** 以下所有函数都是对定点型的运算,该定点型的值乘以10000再以整型来存储。*//*** 将real转化为int,得到其整数部分。*/__declspec(naked) int __fastcall r_int(real i){ _asm{ mov edx,ecx; ...原创 2019-11-16 18:02:29 · 1673 阅读 · 0 评论 -
最优开立方算法(三次牛顿迭代)C/C++
#define CBRT_cbrt(a) cbrt(*(uint64_t*)&a)double cube[2048];double cbrt(uint64_t a){//最优开立方算法 double x; unsigned int exp; if(a==0)return 0.0; exp=((*(uint64_t*)&a)>>...原创 2019-10-06 20:23:00 · 2236 阅读 · 0 评论 -
C/C++ 多线程编程之信号量及其实现代码 semaphore类
仅仅用于多线程同步,不考虑互斥,即不存在共享数据的竞争,我们应该使用信号量,信号量比条件变量高效得多,更利于控制多线程同步,如果要用条件变量模拟信号量,则不得不考虑很多细节。不应该使用信号量代替互斥锁的功能。 千万不要误以为用条件变量和互斥锁可以简单地实现一个信号量,这样实现的信号量很可能不能正常工作。一般而言,Windows下是用信号量实现的条件变量,所以信号量更接近于底层。下...原创 2019-10-06 21:07:01 · 1058 阅读 · 0 评论