我一直在尝试并行化以下功能,但无法弄清楚如何进行。线程简单计算
public static Cell GetClosestCell (Cell cell)
{
// The four calls below should be run in parallel.
Cell temp1 = new FindNorth(cell);
Cell temp2 = new FindSouth(cell);
Cell temp3 = new FindWest(cell);
Cell temp4 = new FindEast(cell);
// Return smallest cell based on [X].
if ((temp1.X < temp2.X) && (temp1.X < temp3.X) && (temp1.X < temp4.X))
{
return (temp1);
}
else if ((temp2.X < temp3.X) && (temp2.X < temp4.X))
{
return (temp2);
}
else if (temp3.X < temp4.X)
{
return (temp3);
}
else
{
return (temp4);
}
}
四个函数调用中的每一个都应该并行运行,但不必启动一个线程。换句话说,应该有4个线程已经在等待输入,我可以发送每个呼叫。
我习惯了并行循环的正常范式,不知道如何处理这个问题(至少不是以一种干净的方式)。
你说FindXxx需要很少的时间。如果是这种情况,则无法将4个步骤并行化:开销将始终支配有用的工作。在更高层次上并行化。 – usr
我不能那样做。比这个函数更高的任何东西都是顺序的,并且取决于之前的迭代。没有办法保持4个线程的运行并轮询队列中的数据,一旦它变得可用,就进行处理。 –
确定存在但是从该队列中取出通常会导致等待下一个项目(这通常需要旋转或OS同步(昂贵))。您的FindXxx方法有多快(每个核心每秒多少个呼叫)?如果他们速度太快,你就无能为力。极端的例子:你将如何并行两个整数加法?不可能。 – usr