是否有可以同时更改变量的CPU?

时间:2009-10-23 20:18:39

标签: c variables

如果我写:

a = 0;
b = 0;
c = 0;
d = 0;
e = 0;
f = 0;

我认为(可能是错的)CPU将逐行排列,例如:

CPU says:
let me assign a to 0
then let me assign b to 0
then let me assign c to 0
then let me assign d to 0
etc...

我只是想知道是否有可以同时更改变量的处理器......?

...谢谢 Y_Y

7 个答案:

答案 0 :(得分:5)

你所拥有的是一行代码,而不是方法调用。

编辑:响应您编辑的问题......您需要的是矢量处理器(下面将详细讨论)。正如我记得的那样,这个想法是你拥有一系列价值观,并且你同时在所有这些价值上并行地重复执行相同的操作。它们通常用于大型数学/物理,模拟和图形类型的东西(包括PC /控制台3D图形,我认为)。

如果我没记错的话,在C中,你可以在一行“代码”上粘贴多个语句,如下所示:

int a, b, c;
a = 1, b = 2, c = 3;

但是,这与写作没有什么不同:

int a, b, c;
a = 1; b = 2; c = 3;

又与

相同
int a, b, c;
a = 1;
b = 2;
c = 3;

并且所有这些在编译器中转换为相同的东西。因此,虽然其中一个只使用一个语法“语句”,并且其中两个写在一行上,但除语法外,它们都是相同的。

有些语言可以生成多个值,只需调用一种正常的语言基本元素;例如,在Lisp中,您可以使用maphash在哈希表的每个元素上运行相同的函数,如果函数再次写回哈希表,则一行“代码”正在写入许多值。但这是一个毫无意义的措施,因为一行代码在很多东西下运行。

可能更好的例子是某些并行编程模型。矢量处理器旨在允许您同时并行地在(4/8/16 / N)个不同数据元素上运行一条指令;你可以有意义地说它正在做你正在询问的事情,但是你需要学习如何在矢量机器的装配中进行编码。此外,一些并行编程模型假设您有一条并行的代码,它们同时在N个线程中运行,从N个不同的输入数据集开始,并为每个输入数据计算正确的输出。该模型的任何实现都应该能够保证不同的执行在代码中的特定点“聚集”,其中所有内容都会同步,并且它们可以读取其他进程的数据并对其进行操作。

所以,呃,是的,这可能是一个非常简单的问题,也可能是一个非常深的问题,这取决于你想要去兔洞的距离。

答案 1 :(得分:4)

除非在数据库或其他一些支持事务的软件中进行分配,否则您提供的两个代码示例最有可能导致CPU执行100%相同的指令

E.g。它们将由编译器/解释器转换为相同的操作码序列。

更新:

  1. 要明确,正如其他人所说,a = b = c = 0;仅仅是C(和其他语言)的语法糖,实际上转化为:

    c = 0;
    b = c;
    a = b;
    
  2. 可能存在语言/框架,其中3个分配在某种意义上是“原子的”,作为交易一次性执行,如果这是“1个呼叫”的意思。最明显的例子是SQL,其中UPDATE table SET a=0,b=0,c=0 ...实际上不仅要保证3次更新是作为一个“调用”发生的,而且是一个事务 - 要么全部更新,要么都没有。

答案 2 :(得分:1)

我认为你可能有点混乱。你甚至无法使用线程实现这一点。 “呼叫”究竟是什么意思?一行代码?第一行只是在许多C语言的声明中提供的便利。

我的意思是,您可以创建某种函数,通过引用获取变量列表,然后是值列表,然后您可以调用该函数。我不确定你要完成什么。

但是没有,没有一个语句没有在大多数C语言中使用函数(你没有指定语言)会这样做,除非你想让所有的变量具有相同的值(即{{ 1}})。

答案 3 :(得分:1)

为什么不将值放在数组中并使用memset或ZeroMemory宏(在内部使用memset。

答案 4 :(得分:1)

也许不是CPU,但这可以通过FPGA轻松完成。

例如,有一种名为 Handel C 的类C语言,用于FPGA开发。因为代码被转换为硬件,所以在语句级别可以实现真正的并行性。

句柄C具有 par seq 构造,用于确定语句是并行还是顺序发生。 par块的执行时间是最慢语句(或嵌套块或调用)的执行时间,变量赋值需要1个时钟周期,因此:

// Three assignments in one clock
par
{
   a = 1;
   b = 2;
   c = 3;
}

// Three assignments in three clocks
seq
{
   a = 1;
   b = 2;
   c = 3;
}

这是一个有趣的特征,例如你有:

par
{
  a++ ;
  b = a ;
}

分配给b的值是 par par之前的的值,因为它们同时发生(并且语句的顺序无关紧要)。使用此功能可以实现流水线执行,因此需要多个时钟周期的复杂算法可以在每个时钟周期生成一个结果(尽管会延迟管道长度)。

答案 5 :(得分:1)

虽然与上面的代码没有严格的关系,但这只是人类可读的指令表示,只要翻译维护了特定语言和环境的定义语义,就可以翻译成任何机器代码。

智能编译器可以翻译: int8 c = 1, c = 2;成为单个int16赋值(可能将两个值都存储在单个寄存器中),如果它是这样写的话。另一方面,int16 d = 4;可能需要在8位硬件上进行多个循环(读取:非原子)。去图。

是的,某些CPU可以在原子(“同时”)操作中更改两个变量(多个存储槽)。

其中最常见的是硬件安全同步的基础。

CMPXCNG - Compare and Exchange

CMPSWP - Compare and Swap

为了优化岁月(甚至为矢量化处理等设计的驱逐系统),我会惊讶地发现没有更专业的指令。此外,虽然更简单的分配,上下文切换和寄存器文件交换也可以原子方式完成。

答案 6 :(得分:0)

如果你真的想知道硬件层面发生了什么,这是一个非常深刻的话题。你是正确的,分配(很可能)不会同时发生。更糟糕的是,它们可能不会按照您最初指定的顺序发生。

编译器和硬件保证从单个线程的角度来看,代码将按顺序执行。但是为了使代码执行得更快,他们可以打破其他线程的错觉。在多CP​​U或多核环境中尤其如此。

或者,如果您真正感兴趣的是如何加速代码:首先学习使用分析器并找出如何衡量代码缓慢的位置。我保证它不会在你期望的地方。然后,为了加速您的物理仿真代码,请开始阅读编译器最有可能为您的CPU提供的矢量内在函数。您不需要学习如何使用汇编语言进行编程。