例题:考虑下面的程序
const int n=50; int tally;
void total()
{
int count;
for(count =1;count <=n;count ++)
{
tally++;
}
}
void main()
{
tally =0;
parbegin(total(),total(); write(tally);
}
a.确定这个并行程序最终输出变冷tally的合适下界和上界。假设这些进程可以任意相对速度执行,且一个变量只能在被一条单独的机器指令载入到寄存器后自增。
b.在a中假设的基础上,进一步假设允许并行执行任意数量的这种进程,对着tally的上界和下界有何影响?
Answer:
a.
-
首先先确定大致的范围,因为当没有互斥时候可以从0直接加到50,所以先确定tally大概在[50,100]区间
-
但是考虑两个进程交替顺序执行载入、增加、存储的情况,同时变更这个共享变量的取值,过程如下:
1. 进程A载入tally值,tally值加到1,并同时丢失处理器,虽然增加到1,但还没有存储
2. 进程B载入tally值,tally值仍为0,运行完成49次增加操作,将49存储给tally后,丢失处理器
3. 进程A重新获得处理器并存储1,代替之前的49,然后被迫立即放弃处理器
4. 进程B重新开始,将此时为1的tally值载入寄存器,同时被迫放弃处理器,完成最后一次B的载入
5. 进程A重新开始,没有被中断,运行完成剩下的49次载入、增加、存储操作,结束后tally为50
6. 进程B在这之前完成最后一次增加和存储操作,寄存器值变为2,同时存储这个值作为共享变量的最终结果。 -
所以tally的最小值可以为2,最终范围为[ 2, 100 ],一般不会出现低于2的结果。
b.
在有N个进程的情况下,tally的值最终范围是[ 2, N * 50 ],因为对所有进程来说,最初开始运行到第五步的时候完成,但在第六步都会被进程B破坏掉,下界都会回到2 。
所以上界会发生改变,下界不会。