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