【发布时间】:2013-12-11 04:00:12
【问题描述】:
我正在做一个关于多线程的演示文稿,我想演示指令如何以阶乘方式增加。
考虑一个简单的程序
a++;
b++;
c++;
在单线程程序中,构成++ 操作的三个汇编指令(读、加一、写)只有一个顺序(读 a、给 a 加一、写 a 到内存、读 b、 ...)
在只有三个线程并行执行这三行的程序中,还有更多配置。编译器可以以任何顺序优化和重写这些指令,约束条件是“读”、“加一”和“写”的出现顺序为ab 和c。有多少有效订单?
初步想法: (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