【问题标题】:Number of assembly instruction execution orders汇编指令执行顺序数
【发布时间】:2013-12-11 04:00:12
【问题描述】:

我正在做一个关于多线程的演示文稿,我想演示指令如何以阶乘方式增加。

考虑一个简单的程序

a++;
b++;
c++;

在单线程程序中,构成++ 操作的三个汇编指令(读、加一、写)只有一个顺序(读 a、给 a 加一、写 a 到内存、读 b、 ...)

在只有三个线程并行执行这三行的程序中,还有更多配置。编译器可以以任何顺序优化和重写这些指令,约束条件是“读”、“加一”和“写”的出现顺序为abc。有多少有效订单?

初步想法: (3+3+3)!* 1/(3!+3!+3!)=20160

在哪里 (3+3+3)!是没有约束的排列总数,1/(3!+3!+3!) 是具有正确顺序的排列的比例。

【问题讨论】:

  • 如果您尝试并行执行操作,那么线程 0 有三个选择,处理 a、b 或 c。然后线程 1 剩下 2,线程 2 剩下 1,3*2*1 = 6 种不同的处理方式。直到你用 a、b 或 c 做某事,然后开始混合 a、b、c d = a+b,它才真正变得有趣。 e=d+c。
  • 您所描述的是超标量,而不是多线程。具体来说,它是无序执行的超标量。在多线程环境中,编译器编译到的正是一个前突变:read, add, write
  • “编译器”与“多线程”有什么关系?这是一个相当混乱的问题。正是在线程中,如何编译这段代码的问题变得很有趣,但是CPU 中的指令重新排序是一个更有趣的方面。在多线程中,您通常不能对并行执行的指令设置任何顺序。

标签: multithreading math assembly language-agnostic combinatorics


【解决方案1】:

这可能是更详尽的评论,但是...

在单线程版本中,编译器可以在不改变输出的情况下对这些添加重新排序。 c++ 编译器可以这样做。所以单线程有3! 的可能性。这是假设++ 是原子的。

当您进入多线程时,操作顺序的意义就失去了意义,取决于架构,它可以精确地同时完成。事实上,你甚至没有线程。例如。 SSE 说明。

您要计算的是在单个线程上执行 3 个添加,其中 load->inc->store 不是原子的。 IMO,对总共 9 个元素施加顺序的方式与您的类似,但因子为 (3!*3!*3!)

第一次你拿9!然后通过将其除以 3 来对 3 个元素施加顺序!然后再重复该过程 2 次。但是我感觉这个因素太大了。

我会问一个擅长组合数学的数学家。等价的问题是,有NxM 彩球。 N 是变量的数量,M 是您需要在每个变量上执行的原子操作的数量。球的不同顺序的数量是多少。颜色是变量。因为您知道第一个颜色必须是load、第二个++ 和第三个store。所以你会得到M=3 球的N=3 每种颜色。也许这种表示对于纯数学家来说会更好。

编辑:显然,根据wikipedia 关于多重集的排列,我最初的猜测是正确的。我还是会检查自己。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-10
    • 2014-03-07
    • 2022-01-02
    • 1970-01-01
    • 2022-01-23
    相关资源
    最近更新 更多