gpt4 book ai didi

c - C中OpenMP中静态和动态调度的区别

转载 作者:太空狗 更新时间:2023-10-29 16:39:52 25 4
gpt4 key购买 nike

我有两个相似的代码。

首先

#pragma omp parallel for shared(g) private(i) schedule(dynamic, 1)
for(i = (*g).actualNumberOfChromosomes; i < (*g).maxNumberOfChromosomes; i++)
{
AddCrossoverChromosome(g, i); // it doesnt change actualNumberOfChromosomes
#pragma omp atomic
(*g).actualNumberOfChromosomes++;
}

第二

#pragma omp parallel for shared(g) private(i) schedule(static, 1)
for(i = (*g).actualNumberOfChromosomes; i < (*g).maxNumberOfChromosomes; i++)
{
AddCrossoverChromosome(g, i); // it doesnt change actualNumberOfChromosomes
#pragma omp atomic
(*g).actualNumberOfChromosomes++;
}

唯一的区别在于第一行。第一个代码工作正常,但第二个代码崩溃了。为什么?

问题出在 actualNumberOfChromosomes 的某处,但我想了解原因,而不仅仅是解决这个问题。我可以通过创建附加变量 p 并将 actualNumberOfChromosomes 分配给它并更改循环以便 i 等于 p< 来解决这个问题.

最佳答案

static 调度类型和dynamic 调度类型的区别在于,static block 可以预先计算,并决定如何在编译期间安排线程,而使用 dynamic 时,同样的事情在运行时完成。

随着dynamic的使用,它涉及到一些复杂的机制,如死锁处理机制、负载处理等。

您可以在以下位置获得更多信息:http://openmp.blogspot.com .

关于c - C中OpenMP中静态和动态调度的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4261087/

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