汇编指令执行顺序的数量

时间:2013-12-11 04:00:13

标签: multithreading math assembly language-agnostic combinatorics

我正在撰写有关多线程的演示文稿,我想展示如何以一种有道理的方式增加指令。

考虑一下琐碎的程序

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

在单线程程序中,构成++操作的三个汇编指令(读取,添加一个,写入)只有一个订单(读取,添加一个,写入内存,读取) b,...)

在只有三个线程并行执行这三行的程序中,还有更多配置。编译器可以按任何顺序优化和重写这些指令,其约束条件是“读取”,“添加一个”和“写入”,以便a bc发生。有多少有效订单?

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

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

1 个答案:

答案 0 :(得分:2)

这可能更详细,但是......

在单线程版本中,编译器可以对输出中的更改进行重新排序。 c++编译器可以这样做。因此单线程有3!种可能性。这就是假设++是原子的。

当你进入多线程时,操作顺序感失去了意义,取决于架构,它可以在同一时间完成。实际上你甚至没有线程。例如。 SSE指示。

您想要计算的是在单个线程上执行3次添加,其中load->inc->store不是原子的。 IMO,对总共9个元素下达命令的方式与您的相似,但因子将是(3!*3!*3!)

1你拿9!然后你通过将它除以3来对3个元素施加顺序,然后再重复处理2次。但是我觉得这个因素太大了。

我会问一位数学家对组合学有好处。同等的问题是,有NxM个彩球。 N是变量的数量,M是您需要在每个变量上执行的原子操作的数量。球的不同订单数量是多少?颜色是变量。因为您知道第一种颜色必须是load,第二++和第三store。因此,每种M=3颜色都会获得N=3个球。也许这种表现对于纯粹的数学家来说会更好。

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