Questions tagged «computer-architecture»

有关计算机硬件的组织和设计的问题。

3
纯粹为功能编程设计的CPU有何不同?
在一定程度上,CPU在设计时会考虑人们会为它隐式或显式编写的软件。 在我看来,如果您看一下指令集体系结构的设计,就每个指令编码一个命令式样式命令的意义而言,它们是非常“必要的”。在我看来,当前的指令集架构在某种程度上是基于程序员产生的代码类型而发展的。 如果一个人从头开始设计CPU,并且知道它只会运行以功能编程风格编写的程序,那么该CPU的设计将与现有CPU有何不同?

7
在CPU级别如何执行程序?
我知道这是一个非常普遍的问题。但是我的想法却不同。我将在这里尝试阐明。 据我所知,由于ALU及其晶体管(如果我们在硬件级别上),CPU执行的每条指令都是机器语言,并且所有CPU都可以执行一些算术运算。 但是,此类型比理解起来容易。因此,如果所有CPU都在执行加,减等操作,那么用这些算术运算如何执行一个程序,比如说打印Hello World的JAVA程序? 我的意思是该程序如何转换为CPU的附加功能? 附言:如果此问题不适用于本网站,则表示歉意。 - - -第二部分 - - - 好的。感谢所有人以如此迅速的热情回答。我认为最好修改一下我的问题,而不是去评论所有答案并再次询问。 就是这样 首先,所有人都专门回答了Hello World的示例。这是我的错。我应该保持这种通用。您好,世界示例带来了输出设备的问题,以及它的处理方式不仅限于CPU,而这在您的答案中是正确的。 你们中的许多人也注意到我,CPU的作用不只是加法。我同意这一点。我只是没有写,而是一直假设。据我了解,这是一个过程: 从内存中读取指令(使用数据和地址总线以及程序计数器的内容) 将数据存储在CPU内部的寄存器中 现在,ALU当然会在解码指令后进行算术运算,或者如果它是if指令,则进行跳转 然后在需要时与其他资源进行通信,例如与输出设备等等。目前,除此以外的过程都是微不足道的。 因此,在步骤3中,CPU对一条指令进行解码并决定执行算术运算(此处我们假设没有其他操作要执行,例如跳转当前指令。由于算术运算大部分已完成。因此,我们坚持这样做)这就是我的可视化结束的地方。我的程序中的指令如何仅仅是CPU的算术运算。它执行该算术运算,并且该指令达到其目的。 希望这次我能说清楚。 PS:我在这里假设一个很大的假设,即ALU不仅限于我们在程序中执行的实际算术运算,而是执行所有指令(现在为二进制形式),方法是将它们相加或相减,以得出它们的结果。屈服。如果我在这里错了,那么下面的答案可以正确回答我的问题。

6
在一个间隔中找到两个数字的最大异或:我们能做得比二次更好吗?
lllrrrmax(i⊕j)max(i⊕j)\max{(i\oplus j)}l≤i,j≤rl≤i,j≤rl\le i,\,j\le r 天真的算法只检查所有可能的对。例如在红宝石中,我们有: def max_xor(l, r) max = 0 (l..r).each do |i| (i..r).each do |j| if (i ^ j > max) max = i ^ j end end end max end 我感觉到,我们可以做得比二次。是否有针对此问题的更好算法?


1
在实践中评估缓存遗忘性能的研究
Frigo等人介绍了忽略缓存的算法和数据结构是一个相当新的事物。在Cache-oblivious算法,1999年。普罗科普(Prokop)同年的论文也介绍了早期的想法。 Frigo等人的论文。目前的一些实验结果表明了该理论以及忽略高速缓存的算法和数据结构的潜力。许多可忽略缓存的数据结构都是基于静态搜索树的。存储和导航这些树的方法已经发展了很多,也许是Bender等人最著名的。以及Brodal等人的著作。Demaine给出了一个很好的概述。 至少由Ladner等人完成了研究缓存行为的实验工作。使用程序工具,2002年在“缓存感知和缓存遗忘的静态搜索树”的比较中取得成功。Ladner等。使用经典算法,忽略缓存的算法和了解缓存的算法,对解决二进制搜索问题的算法的缓存行为进行了基准测试。每种算法都使用隐式和显式导航方法进行基准测试。除此之外,Rønn,2003年的论文对相同的算法进行了非常详细的分析,并对Ladner等人的相同算法进行了更彻底的测试。 我的问题是 从那以后,在实践中是否有任何新的研究对基准缓存不了解算法的缓存行为进行基准测试?我对静态搜索树的性能特别感兴趣,但我也对其他任何忽略缓存的算法和数据结构感到满意。

3
中断后,处理器如何找到内核代码?
发生中断时,处理器会抢占当前进程并调用内核代码来处理中断。处理器如何知道在哪里输入内核? 我知道可以为每条中断线安装中断处理程序。但由于处理器仅执行“硬连线逻辑”,因此必须存在一些预定义的位置,该位置指向中断处理程序本身或在该处理程序之前执行的某些代码(因为一个中断行可以有多个处理程序,因此我假设后者)。

2
CPU体系结构是否偏向于程序运行时?
是否可以对CPU进行任何更改,以使它们在诸如Rust的并行运行时性能更好?例如,是否对分支预测实现或缓存大小进行了更改,以帮助并发运行时? 我的印象是,当前的CPU设计可能会针对诸如C之类的过程运行时进行更多优化。如果我们改为针对并发运行时进行优化,那么CPU看起来会有什么不同? 出于重要性,分支预测是基于分析过程代码的研究论文中得出的概括来实现的。我想知道并发抽象是否会给运行时添加一个重要的工作集,从而对现有分支预测算法产生不利影响。例如,在for循环中进行预测是一回事,但是当分支的目标始终是内存的某些新部分(图形,文本等)时,它将始终是缓存未命中,并且永远不会存在分支它的历史-因为还没有人碰过它。 这可能是一个愚蠢的问题,因为尽管内容可能始终位于RAM中,但其内容将被分支到比将要使用的数量级小(一旦被加载到缓存中)...但是仍然在过程运行时中,它应该是存储在缓存和分支预测变量中的上下文的可观察时间边界,这在更加并行化的环境中将表现为抽象边界。所以我想知道...是否遵守了这些界限?有研究论文对此进行分析吗? CPU体系结构是否偏向于过程代码而不是并发代码?还是现代的CPU具有足够的通用性而不会遭受高并发语言的困扰?

3
是否有可以捕获功耗的抽象机?
当报告一种算法的算法复杂性时,人们假定底层计算是在某种近似现代CPU的抽象机器(例如RAM)上执行的。这种模型使我们能够报告算法的时间和空间复杂性。现在,随着GPGPU的普及,人们想知道是否存在众所周知的模型,其中也可以考虑功耗。 众所周知,GPU会消耗大量功率,并且某些指令会根据其复杂性和在复杂芯片上的位置而分为不同的功耗类别。因此,从能量的角度来看,指令不是单位(甚至是固定的)成本。一个简单的扩展将为操作成本分配权重,但是我正在寻找一个功能强大的模型,其中操作/指令可能会消耗非恒定单位的能量,例如多项式量(或更复杂的例如:自开始以来经过的时间的函数)的算法;或考虑到冷却系统发生故障的可能性,这将使芯片发热,并降低时钟频率等。) 是否存在可以纳入非平凡成本和错误的模型?

1
如果我们有GPGPU,为什么还要使用SIMD?
我认为这个问题最好在Stack Exchange的CS部分中解决。既然我们已经拥有使用CUDA和OpenCL等语言的GPGPU,那么多媒体SIMD扩展(SSE / AVX / NEON)是否仍然可以满足目的? 最近,我阅读了一篇有关SSE指令如何用于加速分类网络的文章。我以为这很整洁,但是当我告诉我的首席教授时,他笑了,并说在GPU上运行类似的代码会破坏SIMD版本。我毫不怀疑,因为SSE非常简单,GPU是大型的高度复杂的加速器,具有更多的并行性,但是让我思考的是,在许多情况下,多媒体SIMD扩展比使用GPU更有用吗? 如果GPGPU使SIMD冗余,为什么英特尔会增加对SIMD的支持?SSE是128位,现在是AVX的256位,明年将是512位。如果GPGPU可以更好地处理具有数据并行性的代码,为什么英特尔要推出这些SIMD扩展?他们可能能够将等效资源(研究和区域)放入更大的缓存和分支预测器中,从而提高串行性能。 为什么使用SIMD代替GPGPU?

5
未来的量子计算机会使用二进制,三进制或四进制数字系统吗?
我们当前的计算机使用位,因此它们使用二进制数字系统。但是我听说未来的量子计算机将使用量子位而不是简单位。 因为在“ qubit”一词中有“ bi”一词,所以我首先认为这意味着量子计算机将使用二进制(基数2)。 但是后来我听说,量子位具有三个可能的状态:0、1或0和1的叠加。于是我以为这必须表示它们将使用三进制(基数为3)。 但是后来我看到一个qubit最多可以容纳两位信息。因此,我认为这可能意味着他们将使用四元(基数4)。 那么未来的量子计算机将使用哪种数字系统:二进制,三元或四元?

2
计算机实际上是否使用超前超前加法器?
在大学CS课程中,有很多关于超前进位加法器的详细信息,例如Kogge-Stone,Lander-Fischer等。它们被描述为“业界常见”。但是,我最近没有发现任何证据(除了曼彻斯特进位链),也没有发现它们确实在任何特定地方使用过。Google搜索仅返回期刊和学术研究的页面。最多给出假设的实现。 我的问题是,是否使用了任何特定的地方/实现携带超前加法器?还是它们与现实世界无关?

5
为什么OS设计能够降低功耗?
我已经读到,像Android和iOS这样的操作系统在某种程度上已经过优化,可以延长电池寿命。 我的理解是,CPU在一定时间内执行一定数量的操作,因此我认为您可以通过减少所需的操作数量来加快应用程序的速度,但是由于CPU仍会在y时间内执行x次操作,因此不应影响力量? 另外,如果一个进程占用更多RAM,是否会消耗更多功率?

2
哪种分支预测更重要?
我观察到分支预测中有两种不同类型的状态。 在超标量执行中,分支预测非常重要,主要是执行延迟而不是获取延迟。 在指令流水线中,由于指令直到稍后才真正被执行,因此获取的问题更多。 其中哪一项非常重要(因为当今CPU中哪些真正重要)?如果两者都同等重要,或者如果第二个同等重要,那么为什么我们没有两个指令流水线(可能是一半的长度),然后根据分支,只选择其中一个,然后再次从分支开始填充开始?

2
“无模式位”的数据常规MV / 8000优点
我正在阅读Tracy Kidder的“新机器的灵魂”,Data General的团队在其中设计了新机器(代号为“ Eagle”,后来称为MV / 8000)。它是先前体系结构(16位Eclipse)的32位扩展。不断变化的主题之一似乎是,他们不想创建带有模式位的机器,并且他们成功做到了这一点。 但是,它没有说明如何从技术上实现这一点,也没有涉及为什么创建没有模式位的机器如此吸引人的原因。这本书不是一本技术性的书,因此细节可能以某种方式被扭曲了。但是,您会在阅读本书时感到“模式位”解决方案在当时很普遍(因此很可行),但工程师可能出于美学原因认为它没有吸引力。这本书还使得创建没有模式位的设计似乎是一项艰巨的任务,而这个特定团队却以某种方式克服了这一难题。 我发现了如何实现的描述: http://people.cs.clemson.edu/~mark/330/kidder/no_mode_bit.txt 这似乎基本上是关于将操作码空间的先前未使用的部分用于新指令。我必须承认,我对“就是那样”感到有些失望。我也认为这仍然使一些问题无法解决: 首先,16位进程如何生活在32位地址空间中?因为我认为这是“不带模式位”进行32位扩展的关键挑战。另一方面,扩展指令集是一项相对常见的工作。由于没有描述它是如何发生的,因此可以假设16位代码像往常一样简单地访问内存,也许它看到某种类型的内存虚拟化/存储视图(由新的CPU寄存器控制第一个地址在哪里)或这样的事情。但是我不知道还有什么。在那种情况下,可以说它是一种“模式位”解决方案。16位模式进程可以通过添加到CPU的特殊功能与其他进程一起运行。 其次,为什么创建没有模式位的机器如此吸引人?书中吹捧的许多好处是客户希望运行旧软件。但这似乎并不反对使用模式位,因为使用模式位的全部目的是为了具有向后兼容性。当AMD将x86扩展到64位时,至少根据我对“模式位”一词的理解,他们所做的就是添加一个模式位。一个特殊的位,它将使CPU处于64位模式。还有一点将使进程在64位模式的“子模式”中执行(以实现与32位应用程序的兼容性)。子模式的本质是CPU将指令流解释为旧的32位指令,但是使用新的页表格式(由64位可识别的操作系统设置)可解决对32位存储器的访问。映射到完整的物理地址空间。同样,32位代码可以被64位代码取代。与Data General解决方案一样,这也允许32位程序在64位程序下运行(在DG情况下为16位vs 32位)。因此,从客户的角度看,根本没有区别。因此,唯一的好处可能是实现,简化了设计,但是书中并未讲到这就是要关注的问题,因为即使在那时,模式位似乎仍然很常见(而且以后的架构似乎也如x64案例所示使用它)。 我敢肯定我错过了一些东西,所以如果有人可以讨论更多有关这种“无模式位”设计的技术细节和优点的信息,那将是很棒的。

1
为什么使用超线程会导致性能下降
我在不同的地方,如阅读此,超线程导致性能下降。 我无法弄清楚超线程导致退化的原因或原因。 为什么这样,即使在超线程允许OS使用免费资源的情况下,降级也会发生。 尽管基准测试确实表明超线程是罪魁祸首,但是有人可以向我解释其原因。 谢谢

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.