【发布时间】:2013-07-22 23:07:46
【问题描述】:
我有这种嵌套循环:我想知道如何以最佳形式并行化它:
第二个和第三个
for以及第五个和第六个for运行相同 时间第一个和第四个
for串行
如果我有 24 个核心,并且想在 16 个线程之间划分外部并使用其余的与它们一起执行内部 for,例如使用 8 个线程执行第二个 for 而不仅仅是一个线程,我该怎么办?
void main()
{
//first_for
for(int y=0; y< height; y++)
{
//second_for
for(int x=0; x< width-1; x++)
{
func1();
}
//third_for
for(int x=0; x< width-1; x++)
{
func2();
}
}
//fourth_for
for(int x=0; x<width; x++)
{
//fifth_for
for(int y=0; y< height-1; y++)
{
func3();
}
//sixth_for
for(int y=0; y< height-1; y++)
{
func4();
}
}
}
【问题讨论】:
-
但是第一个和第四个是否与其他 4 个同时运行?
-
第一个 first_for 和之后的第四个_for ? OpenMP 中嵌套循环的最佳处理是什么?
-
我认为您误解了 OpenMP 的嵌套并行性。如果您在 16 个线程上运行外部循环并在该范围内请求 8 个线程,您将获得(假设您的实现支持嵌套并行)
16*8==128线程总数;也就是说,外 16 根螺纹中的每根都有 8 根内螺纹。在 24 核机器上,这可能总是一个坏主意,因为线程争夺对处理器内核的访问权限,因为它们每个都会破坏其他缓存,等等。 -
是的@Mark你是对的Mark,以及在for中使用sections指令如何并行执行两个内部for,我注意到你的观点,但我想同时执行这两个for同一时间
标签: c++ c performance openmp