00:00
好,同学们,请继续,我们再接再厉,请再坚持一下啊,这些内容可能你出听会有点难受,但是请一定跟下来。那么。记着,胜利往往在最后坚持一下的努力当中,我们马上就要突破玄关了,同学们请继续跟我走,下面我们继续加深内存屏障,那么注意现在这些内容可能会让同学们暂时。身心不合适,不爽,但是我细致给你讲解,我分几次啊,两次讲解我们会来复习,OK,这讲一次啊,下面还会讲,最后拿我们的什么代码说话,所以呢。第一次啊,你听到这个知识点,你的表情包应该是像这只猫一样,是有点懵逼的,这个是正常的啊,因为第一次呢,听这些什么内存屏障啊,如果你是非计算机专业的同学,也不知道什么叫计算机操作系统这门课的话有点吃力,但是没关系啊,同学们,我们呢继续走,那么首先。可见你改了以后,马上让大家知道我已经把主内存的东西。
01:04
最新版提交了卡密了,大家去去好说,那么什么叫保证有序呢?那么禁止指令重盘来进重盘,怎么进重盘?通过内存屏障进重盘?前面是不是说过什么load load store load load store store store说过四大屏障,这次就说,比方说store store store1 store store store2,一写完了。二才能写,你们两个顺序不能对调,所以说加了这个屏障,那不好意思啊,武警人墙。挡在你中间了,你只能是什么重新顺序执行,你不能说踩过这个人墙再走,对吧,否则这个屏障就失去意义了,所以说这个内存屏障来实现了。进重拍,那么来。重排呢,有可能影响程序的执行和实现,有所以呢,只要不影响最终结果,且不。存在数据依赖性的话,默认我们是允许编译器、内存和指令集自作主张可以去重排的,只要能达到更好的程序性能。但是有时候我们希望告诉你GVM,你不要自作聪明。
02:08
来给我安排程序,重排我。这儿不需要重排,我们主人陈璇儿自己决定。第二个对于编译器的重排序,GMM加va内存模型会根据重排序的规则禁止特定的编译器重排,哎,那么比方说它底层源码写了if,比方说叉叉叉系统或者说是某种CPU,那么就不允许重盘了,那么对于处理器,那么编译器在指令生成的实弹位置插入内存屏障的指令,来禁止特定类型的处理器来排序,哎屏尽量的屏蔽底层操作系统和硬件对我们程序的影响,所以说。我们呢?结合before先行发生原则,它的变量规则是一张表搞定。来这个时候啊。我们这个是为来变量,那么在这个变量读取反问或者判断的时候,在前和在后就会有。
03:05
前面有个tell操作,后面有可能是一些普通的读写操作,那么这个时候他们的规矩是什么样的?我们来同学们请看。但第一个操作是VE读,就是要读一个V修饰的一个变量,比方说我现在某个线程要读这个A级,这个A级就是对某一个V的关键字修饰的一个变量,这个就叫vlaile读。那么不论第二个操作是什么,怎么着都不能重排序。这个操作保证了外读之后的操作不会被重排到读之前就说我要去读的时候就说明什么,我先要读完了以后,你再去修改这个数据,否则我一边读你一边修改,那我这个数据不就乱了吗?所以说。完了,他要多。第二个操作是普通的毒,是普通的鞋,不可以排到我的前面,先等我读完了再说。第二个操作是不是要读,不可以冲白。第二个操作不跳写不可以重排,那么第一条就是这个蓝色框框,好,下面第二个操作手不跳写的时候,不论第一个操作是什么,也就是第二,注意第二个操作是VE,就是说假设我要对VE变量这个A解进行写操作的时候,抱歉。
04:15
我第二个操作要写第一个操作和。这一切怎么着?不论第一个操作是什么,假设我第二个操作不要写,第一个操作是普通鞋。第二,第一个操作是不读,第一个操作是不写,那对不起,当第二个操作是写的时候,竖的这个啊,不论第一个操作是什么都不能重排序,你等我写完了以后再说,也就是说这个操作保证了VE来写之前的操作不会被重排到V来之后,哎,这是一个语义的顺序,那么保证数据不会什么一边写一边读,那么这不就乱了吗?好,所以说当第一个操作。OK we来跳写的时候,第二个操作来跳读的时候也不可以重排,其他你随便排,那么所以说这三种情况是不可以重排的,那么来同学们再过一下蓝色的横的。
05:10
红色的竖的和最终第三个一个特殊的,哎,所以说第一个操作是为了跳读的时候,不论第二个操作是什么都不可以重排,那么当第二个操作是我跳写的时候。不论第一个操作是什么,都不能重拍,那么当第一个操作是VE写,第二个操作是VE读的时候,也不可以重拍,哎。我不着急,同学们你一定懵逼,现在肯定可能会觉得啊,这个老师好像就是把这个理论知识过了一遍,没办法,第一遍先大家混个耳熟,一定先要有这个概念灌到你脑子里面,后面我跟你说来tell的代码和更底层的源码和分析图,你才能听得到。所以说非常抱歉,同学们先辛苦一点,受点罪,把这个先了解就清楚了,那就是宏宽。
06:00
蓝条紫色的圈圈先有个印象好,那么所以说呢,在这块啊,你不要担心,你看啊,我这后面是不是有加强第二次说明,我知道这里听的可能有点懵逼啊,不要着急,那么所以说同学们,那接下来我们先回到圆规矩,那么GMM就将内存屏障差的策略分为了几种四轴来。那么这个呢?就是我们刚才的这张图啊,再继续加深和巩固load load store load store load,那么好,下面请看读屏站load load load store。它的意思是什么意思呢?在每个外的读操作,注意这两个都是什么,后面插入一个load load的屏障,或者是后面插入一个load store能说明什么?插完了,他要读插入内存比上后生成的指令,我们的蓄意图是这样的,来根据前面所说啊。从上到下直零,从上到下的执行顺序,这是不来要读看着。
07:02
在每个读操作的后面,每个V读操作啊,就是我要读一个变量的时候。插入load load屏障先有它。再插入load store,也就是说我先读完了,你再去读,或者你再去写,那么说白了。插漏漏意思是禁止处理器把上面的读和下面的普通读重排序,假设这个读和这个普通读重排序不可以。现在。你必须要按照屏障一层层过,这有个路障,一定是先过完它才能塌,所以说这个漏漏的就是禁止下面所有的普通毒操作和上面的外套毒。怎么着重排序?明白这是第一步,第二个在每个的独操的后面插入一个load store load store啊就是禁止处理器把上面的读与下面的普通的斜重排序。
08:01
读和什么普通的写重排序不可写,所以说上面只要是为了他有读啊,下面都不可以,普通的读写都不可以跟他重排序,那么劳德store禁止下面。所有的普通鞋。操作和上面的读重排序,一句话,先读完了,咱们再说,你再去写,OK,这是第一步,那么第二个呢,什么叫写操作呢?来这个时候注意所谓写操作,在每个外写操作的什前面插入一个死多死do,在每个写的操作什么后面插入一个什么store load,那么它的序图是这样的。普通图普通写,这是个外写啊,那么在这儿在每个外写操作的前面插入一个store store屏障作用是什么?可以保证在外的。写之前前面的所有普通写操作都已经刷新到是吗?
09:00
主内存里面就是说你这个普通鞋。碰上这个了,卡密特,OK,我也要去写了,你先提交一下,在每个巴拉跳写操作的后面插入一个什么多。漏屏障,避免tell的写与后面可能有的来的读写操作,重排序不可以一定是先你看写后读嘛,先等我们来套写完了你再去读啊,那么这样我们的版本的一致性和可见性是不是才能获得保证?哎,所以说同学们这个就是我们的指令顺序,它怎么做到?通过tell禁止指令重排,哎,保证你不重排了,大家就没有多种顺序,尤且仅有一种顺序了,那么反而这个顺序是一致了,所以说这个时候一定要注意,对于我们的外来跳的读操作的后面。两个都是后面只要是读。Load load load store OK,都在后面,听懂了吗?来读的话,Load load load store都在后面,不允许。
10:02
各种重排,那对于写的话呢,是一个前一个后,那么弟兄们也不允许。重排,那么下面的这个store上面的普通鞋和下面的外套鞋重排,这个和这个不可以,你碰上这个了,你现在呢,先给我去提交一下,OK,那么保证碰到写之前,前面的所有普通写操作都已经刷到内存里面了,第二个。写到后面,防止上面的写和下面的可能的这个写和下面的V的读写重排序,好,那么所以说这个就是我们对应的内存屏障插入的策略供给这四种他们怎么加的屏障好,那么同学们这个就先给大家介绍到这儿,我们接下来继续通过后面的再给大家进行讲解和分享。
我来说两句