在为并行系统设计程序时,我有一个关于如何构造并行for循环的一般性问题。
假设我有两个命令,foo1()和foo2(),我想并行地为数组的每个元素执行这两个命令。重要的是,在foo1()对每个元素进行操作之前,根本不执行foo2()。
步骤1:对所有元素调用foo1()
步骤2:当所有步骤1完成时,对所有元素调用foo2()
我的假设是,为了确保foo1()在foo2()开始之前在每个元素上完成,我必须将这两个函数放在单独的parfor循环中:

parfor(each element n in array){      //step 1
   foo1(n);
}
parfor(each element n in array){      //step 2
   foo2(n);
}

然而,这种假设可能是错误的。这样可能达到同样的效果:
parfor(each element n in array){
   foo1(n);                          //step 1
   foo2(n);                          //step 2
}

我对第二个实现的担心是,在所有foo1()操作完成之前,个别处理器可能会转移到foo2()上。
在上面的两个实现中,两者是否都会达到相同的效果?或者我认为只有第一个带有两个独立parfor循环的循环才是正确的吗?
非常感谢您的意见。

最佳答案

你是对的第二个实现不能确保foo1()在foo2()开始之前在每个元素上完成。
如果核心(或线程)的数量小于n,您可以确保您的需求不会保持。即使核心数等于或大于n,其中一个核心很可能在所有其他核心完成foo1()之前启动foo2()。
顺便说一句,你可以试着做一些

foo1(n) { write(f, "foo1 begin", n); do_some_math; write(f, "foo1 end", n); }
foo2(n) { write(f, "foo2 begin", n); do_some_math; write(f, "foo2 end", n); }

(“正确的”输出不能保证什么,但“错误的”输出可以证明实现是“错误的”)。

关于algorithm - 设计并行For循环以强制执行代码执行顺序,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27768403/

10-12 13:56