gpt4 book ai didi

windows - 并行化具有多个导出点的算法?

转载 作者:可可西里 更新时间:2023-11-01 13:30:22 25 4
gpt4 key购买 nike

我面临着并行化一种算法,该算法在其串行实现中检查一个更大的三维数组中的数组位置立方体的六个面。 (也就是说,选择一个数组元素,然后围绕该元素定义一个立方体或长方体,该立方体或长方体在 x、y 和 z 中距离较远,以数组的边界为界。

每个工作单元看起来像这样(Fortran 伪代码;串行算法在 Fortran 中):

do n1=nlo,nhi
do o1=olo,ohi
if (somecondition(n1,o1) .eq. .TRUE.) then
retval =.TRUE.
RETURN
endif
end do
end do

或者C伪代码:

for (n1=nlo,n1<=nhi,n++) {
for (o1=olo,o1<=ohi,o++) {
if(somecondition(n1,o1)!=0) {
return (bool)true;
}
}
}

整个算法中有六个这样的工作单元,其中'lo'和'hi'值一般在10到300之间。

我认为最好的办法是安排六个或更多的执行线程,如果没有那么多 CPU 内核,则循环执行,理想情况下循环执行并行,目标与串行算法相同: somecondition() 变为 True,所有线程之间的执行必须立即停止,并在共享位置设置 True 值。

Windows 编译器中存在哪些技术可以促进此类任务的并行化?显然,我需要一个等待信号量或工作线程完成的主线程,因此需要嵌套和发信号,但此时我对 OpenMP 的体验只是介绍性的。

OpenMP 中是否有消息传递机制?

编辑:如果“nlo”和“nhi”或“olo”和“ohi”之间的最大差异是 8 到 10,这意味着此嵌套循环的迭代次数不超过 64 到 100 次,并且不超过 384 次六个工作单元一起进行 600 次迭代。基于此,是否值得并行化?

最佳答案

将数组元素上的循环并行化并让这个算法串行化,让多个线程在不同的数组元素上运行算法会更好吗?我从你的评论中想到这一点“时间消耗来自这样一个事实,即数组中的每个元素都必须像这样进行测试。数组通常有四百万到两千万个元素。”实现数组元素并行化的设计在线程数方面也很灵活。除非有理由必须按某种顺序检查数组元素?

看来您向我们展示的部分执行时间并不长,因此通过使其并行化来减少时钟时间可能并不容易……多线程总会有一些开销,如果没有太多时间可以获得,并行代码可能不会更快。

关于windows - 并行化具有多个导出点的算法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9952257/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com