我正在撰写有关多线程的演示文稿,我想展示如何以一种有道理的方式增加指令。
考虑一下琐碎的程序
a++;
b++;
c++;
在单线程程序中,构成++
操作的三个汇编指令(读取,添加一个,写入)只有一个订单(读取,添加一个,写入内存,读取) b,...)
在只有三个线程并行执行这三行的程序中,还有更多配置。编译器可以按任何顺序优化和重写这些指令,其约束条件是“读取”,“添加一个”和“写入”,以便a
b
和c
发生。有多少有效订单?
初步想法: (3 + 3 + 3)!* 1 /(3!+3!+3!)= 20160
其中(3 + 3 + 3)!是没有约束的排列总数,1 /(3!+3!+3!)是具有正确顺序的排列的比例。
答案 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
个球。也许这种表现对于纯粹的数学家来说会更好。