设计并行 For 循环以执行代码执行顺序

Designing Parallel For Loops to Enforce Code Execution Order

我有一个关于在为并行系统设计程序时如何构造并行 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); }

("correct" 输出不会保证任何内容,但 "incorrect" 输出会证明实现是 "wrong")。