因此,我理解流水线处理器的分支预测中使用的基本技术 - 例如2位饱和计数器,两级自适应预测器等.
这是我的问题:
1)分支目标预测:为什么这很重要,这里使用的机制是什么?当我想到一个分支时,我认为"bne r2,r3,LABEL"表示如果r2!= r3然后分支到LABEL,这意味着做PC(程序计数器)= PC + LABEL.在这里预测目标有什么神秘之处?你知道它将基于LABEL的编译值.我可能在某种程度上忽略了这一点.
2)为什么程序计数器值本身(例如0x4001000C)或至少其最后几位用作分支预测方案的一部分?我看到了一种方案,其中PC的最后4位连接到(4位)分支历史寄存器,并且该8位值用于访问模式历史表.我认为PC很随意!
感谢您帮助理解这些问题
要查看我要执行的操作,请参见以下内容:
我的问题是如何在我的Makefile.am中有条件地设置AM_CPPFLAGS或my_lib_la_CPPFLAGS。这样在运行configure时是否设置了正确的CPPFLAGS?
目前,我正在做一些影响以下方面的事情:
lib_xml_wrapper_la_CPPFLAGS = -I../../
UNAME_S = $(shell uname -s)
UNAME_P = $(shell uname -p)
ifeq ($(UNAME_S),Linux)
lib_xml_wrapper_la_CPPFLAGS += -DLINUX
ifeq ($(UNAME_P),x86_64)
lib_xml_wrapper_la_CPPFLAGS += -D AMD64
endif
ifeq ($(UNAME_P),x86_64)
lib_xml_wrapper_la_CPPFLAGS += -I../../../external/xerces-c-3.1.1-x86_64-linux-gcc-3.4/include/
endif
ifneq ($(filter %86,$(UNAME_P)),)
lib_xml_wrapper_la_CPPFLAGS += -I../../../external/xerces-c-3.1.1-x86-linux-gcc-3.4/include/
endif
ifneq ($(filter arm%,$(UNAME_P)),)
lib_xml_wrapper_la_CPPFLAGS +=
endif
endif
ifeq ($(UNAME_S),Darwin)
lib_xml_wrapper_la_CPPFLAGS += -DOSX
ifneq ($(filter %86,$(UNAME_P)),)
lib_xml_wrapper_la_CPPFLAGS += -I../../../external/xerces-c-3.1.1-x86-macosx-gcc-3.4/include/
endif
ifneq ($(filter arm%,$(UNAME_P)),)
lib_xml_wrapper_la_CPPFLAGS +=
endif
endif
Run Code Online (Sandbox Code Playgroud)
这似乎在Makefile.am中不起作用。我收到以下错误:
xml_wrapper/Makefile.am:26: error: endif without if
xml_wrapper/Makefile.am:35: error: endif without if
automake: warnings …Run Code Online (Sandbox Code Playgroud) 我正在用C++设计一个指令集模拟器,它由CPU,内存和指令集本身组成.我目前正在尝试设计我的内存类,它将包含uint32_t数据类型.
基本上,内存类必须执行以下操作:
我想到的是,我需要一个搜索算法来查找我感兴趣的地址.
我已经实现了最简单的可用版本,它将是一个线性内存搜索,其中所讨论的内存块只是一个简单的结构,*block其值和地址存储在一个vector<block*>.但是,正如您可能猜到的那样,对于大型案例来说这是非常昂贵的.
总而言之,我想实现一个可以轻松找到内存的情况(我正在考虑二进制搜索,但我愿意接受更多建议),而且我也希望有关安排内存块的建议*block.我目前正在使用矢量,因为我不知道我需要的内存大小.
它可以在每个周期执行四次8位操作(SIMD操作)还是只执行一次?通常,较高位被设为零,8位被视为32位字,其较高位为零以执行这种操作.目前处理器中是否有任何硬件功能可以帮助每个周期执行更多数量的低位操作(特别是在NVIDIA GPU中)?
我想知道无序超标量处理器(假设是Intel i7处理器)的每个周期的取指令数是否恒定,或者它可能会根据高速缓存未命中率或分支未命中预测的数量而改变.给出代码/程序?
如果不是常数,如何解释其背后的原因呢?据我所知,在现代多核处理器中,解码器单元总是尝试解决依赖关系并尝试使用独立指令填充管道气泡.那么,对于任何给定的工作负载,获取指令的数量不应总是相同(大约)?
如何在位级检查OS的'endianness'或OS是否甚至关心这些位的存储顺序?
阅读英特尔创造的CPU的不同谱系,我头脑中引起的许多问题需要解决.问题如下:
就8085和8086架构的不同而言,这两种架构的英特尔名称有何不同?
注意:我的朋友告诉我8085是一个8位微处理器,但8086是一个16位处理器,这使得它们彼此不同,这就是为什么,一个叫8085,另一个叫8086.但据我所知,我们现在使用的大部分CPU目前都是基于8086 cpu的80x86架构,它有32位版本,也有64位,老实说这显示我朋友的解释是错误的因为所有这些CPU仍被称为80x86架构,尽管这些位是不同的.
作为后续,80x86架构从8086继承了什么属性,为什么英特尔不会只调用CPU 8087,而是称为80186,80286,80386等?
x86 intel cpu-architecture computer-architecture cpu-registers
我正在我的大学做一个并行计算课程,显然我们需要了解程序员级别的架构.谁能说出开发多核处理器的动机是什么?为什么多线程处理器不够用?为什么我们需要在多个内核上分配管道而不是将它们放在一个大型内核上?
我目前正在参加汇编语言和计算机体系结构课程.我们正在MASM中为x86处理器编程.我有一台Macbook Air,所以当然我必须在虚拟机上运行Windows才能在MASM中为我们的作业编程.
我感到困惑的是:我们正在学习和编写x86架构.当我抬起Macbook Air的处理器时,它似乎出现在x86系列中.考虑到这一点,为什么MASM不能与Mac OS X一起使用?
此外,如果汇编语言直接与硬件通信,为什么仅在Apple硬件上安装Windows操作系统(或通过VM运行它)突然允许我在MASM中编程?
谢谢,伊恩
[编辑澄清:我的理解 - 请告诉我,如果我错了 - 汇编语言是否"尽可能低".即它是预操作系统,并直接向硬件本身提供指令.因此,我不明白为什么x86架构的汇编语言不适用于所有x86机器,无论操作系统如何]
hardware x86 assembly operating-system computer-architecture