是否可以在RAM中执行一些计算?

时间:2017-06-28 06:30:30

标签: assembly x86 cpu-architecture

理论上,有没有办法在RAM中执行任何计算,使用与moveclflush等内存相关的指令,例如两个相邻行之间的xor示例

由于我对RAM和装配的了解有限,我想不出任何这样的可能性。

2 个答案:

答案 0 :(得分:5)

不,任何计算都在CPU(或GPU,或其他可以加载/存储到RAM的系统设备)中完成。甚至@PaulR在注释中链接的Turing-complete mov stuff只是使用CPU的地址生成硬件和寄存器中的数据来进行计算。

当CPU缓存未命中时,内存仍会看到64B突发加载和64B突发存储。

有关DDR协议如何工作的一些背景信息,请参阅What Every Programmer Should Know About Memory(发送地址,然后向RAM传输数据脉冲串)

相关:is num++ atomic in C, or with x86 inc [mem]

lock inc [mem]实际上在CPU内部实现了一个加载/修改/存储,CPU使看起来原子到系统中所有可能的其他观察者(例如其他CPU核心和PCIe)设备)。但是不包括将逻辑分析器连接到内存总线之类的东西,这不符合CPU内核在执行原子读取 - 修改 - 写入时用来保存缓存行的独占权的缓存一致性协议。 / p>

有些人认为添加是在内存芯片“内部”完成的,但它们是错误的。 DRAM芯片(或连接到DDR4总线的接口芯片)中没有加法器,甚至布尔AND / OR / XOR硬件;它所能做的只是从给定的地址加载或存储。任何可以做得更多的芯片不仅仅是DRAM。

显然存储器接口芯片中存在逻辑,但它并没有连接到数据上。

如果确实有,那将是Computational RAM的类型。 (感谢在评论中链接,BTW。有趣的计算机架构理念。但AFAIK,没有主流CPU或GPU使用C-RAM。)

你甚至不能要求DDR4 DRAM将页面归零。 CPU必须通过内存控制器来实现。

答案 1 :(得分:4)

令人惊讶的是,根据Paul R的评论:mov is Turing complete

然而,这种仅mov的计算机将是(高度)不切实际的。 更不用说为它编写编译器会非常困难。有一个c编译器可以翻译general purpose c programs into x86 mov instructions。令人惊讶的是它确实允许浮点计算 因为它基于图灵机,而不是冯·诺依曼计算机,所以速度非常慢,(但这是混淆代码的好方法:-1)。

出于所有实际目的,您只能通过寄存器进行计算 仅AFIAK movs需要2个存储器操作数,访问存储器的每个其他指令另外使用常量或寄存器操作数。

Rowhammer不是一种计算机制,因为它是非确定性的 它也是实现dram的方式的一个人工制品,缓存不受此影响。