首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >术语:当数据和指令的概念不能分离时,怎么能说一个程序的数据比指令多呢?

术语:当数据和指令的概念不能分离时,怎么能说一个程序的数据比指令多呢?
EN

Stack Overflow用户
提问于 2014-03-14 01:23:35
回答 3查看 122关注 0票数 1

这是一个关于术语的问题。我使用ARM作为示例,因为它是我唯一熟悉的程序集,但我正在寻找更通用的答案。

基本上,我在区分指令、数据和操作码时遇到了麻烦。

我认为GPU往往比CPU进行更多的内存访问,因为图形计算往往是数据密集型的。我的问题基本上是,在处理器的上下文中数据是什么,因为处理器只能执行指令?

说一个程序的25%是指令,75%是数据,这有意义吗?

在ARM装配中,在.data部分中包含的内容是否被视为数据而不是数据?操作数算不算数据?例如,如果我做mov R0, #5,说整行是指令,mov是操作码,5是数据,这样说对吗?

.text部分中,如果您有ldr R0, =myVar,而在.data部分中有myVar: .word 5,那么什么是指令,什么是操作码?

是不是每条指令都有数据和操作码?但是,像“GPU通常比指令更多的数据”这样的说法怎么能说得通呢?

编辑:让我重新定义这个问题。就特定于数据的L1 cahce和特定于指令的L1缓存而言,如何(在汇编级)区分某些东西是数据还是指令?这看起来很糟糕,因为CPU执行的一切都是一条指令。

EN

回答 3

Stack Overflow用户

发布于 2014-03-14 03:01:26

我认为公平地说,CPU执行的一切都是指令,它加载的一切都是数据……

既然你想知道术语和问题被标记为cpu架构...

任何现代主流计算机体系结构,包括ARM,都可以归类为Modified Harvard Architecture,其中:

哈佛体系结构是一种计算机体系结构,具有物理上分离的存储以及用于指令和数据的信号通路。(修改后的哈佛体系结构机器非常类似于哈佛体系结构机器,但它放松了指令和数据之间的严格分离,同时仍然允许CPU并发访问两条(或更多条)内存总线。)

这样你就有了最好的数据和指令的定义。它简单地告诉我们cpu有两个输入流,指令告诉我们要做什么,数据允许加载/存储信息位。所以从数据端口加载的任何东西都是数据。

这种分离的好处是,创建cpu架构的人可以在他们的计划上做出决定,并添加额外的功能来优化不同的部分。这意味着数据端口可以具有更昂贵的存储器访问接口。

操作数算数据吗?

我猜这取决于你是否将常量数据视为数据。很明显,你不能将变量信息作为操作码嵌入,但据我所知,只要计算机体系结构正常运行,操作数就不是数据。

想象一下,你有一些只有操作数的指令。就像一个计算某个数字的算法。如果所有的数据都是恒定的,你为什么还需要这个算法呢?您将拥有perfect optimization case,一个好的系统将只返回结果,而不是从头到尾执行完全相同的步骤。

从另一个角度,比较CPU和GPU,GPU是一个特定的CPU,它擅长批量处理大量数据,正如您所听到的那样。

假设您想要将彩色图像转换为灰度图像。简单地说,您希望将每个像素更改为灰色像素。你要做的就是加载一个像素(你的数据),做一些计算,然后把它存储回去。你如何通过硬件手段来改进这样的任务?您可以改进内存接口以获得更好的顺序访问,改进cpu以进行适合像素工作的计算,增加可并行工作的cpu数量……但是,瞧!你手上有个GPU。

由于成本的原因,设计和制造硬件的问题充满了权衡。因此,在现实中,如果你想实现一个和GPU一样好的CPU,你需要去掉一些其他的特性来保持成本平衡。

如果你这样做,那么其他一些特定类型的任务将在你的新CPU上运行得更差。我认为最好的例子是操作系统,我认为它具有最高的指令数据处理比率。

票数 1
EN

Stack Overflow用户

发布于 2014-03-14 01:52:56

我认为这个问题不会有一个真正的答案,因为你所困惑的术语对我们来说同样是模糊的。

ARM使用固定长度的指令集。对于可变长度,例如x86,如果你想在一些寄存器中加载一个32位立即数,你会有一些或更少的操作码字节,然后是.text中的32位立即数,其中包含指令。对于像mips或arm这样的固定长度,它真的没有什么不同,而不是加载立即数某个32位数,有时在.text中会有那个32位数,但您将执行pc相对加载指令,这是一个数据周期,而不是提取周期。如果这就是你想要隔离的,祝你好运。很多时候,在编译时,如果有一个外部引用(变量或函数,基本上是一个地址),那么编译器通常会分配空间,然后链接器会填充这些空间。对于可变长度的指令集,编译器将简单地选择远调用、跳转或移动,这与在那里留下一个假地址供链接器稍后填充是相同的。

像x86和6502和z80这样的老处理器和一些相关的处理器有更多的操作码的概念,其中位模式并不真正告诉你什么寄存器是什么,操作码映射可能已经在卡诺图样式中雕刻出来,以便更容易解码,但那些指令组所做的事情不一定直接来自操作码位。RISC和更现代的指令集(甚至一些x86指令)更明显,大多数指令只是gprs,只有几个位被称为操作码。比如说,一条alu指令,几个位将从sub和from or进行相加,但要解码这些操作码位,你必须解码其他位。ARM的编码非常不明显,你必须查看的位,以了解它是什么指令到处都是。另一方面,Mips有几个主要的类,通过做两三次检查,你就知道它是什么指令了。所以操作码和数据这一术语已经没有多大意义了,我想说的是,在ARM中,指令可以同时拥有数据和操作码,虽然不像x86那么多,但仍然有一些指令有意义。

至于.data和.text,这是非常特定的应用程序,可能没有答案,图形处理器,中央处理器,或其他。

票数 0
EN

Stack Overflow用户

发布于 2014-03-14 06:02:04

“像”GPU通常比指令更多的数据“这样的陈述怎么可能有意义呢?”GPU通常一次只对一组数据应用一条指令。因此,与数据获取的数量相比,指令获取的数量很小。它是流处理的一种形式。维基文章:stream processing

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22386241

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档