C 为什么并行执行函数会显著降低程序的速度?

C 为什么并行执行函数会显著降低程序的速度?,c,openmp,C,Openmp,我正在尝试使用OpenMP并行化代码,当前输入大小的串行时间约为9秒,我有一个以下形式的代码: int main() { /* do some stuff*/ myfunction(); } void myfunction() { for (int i=0; i<n; i++) { //it has some parameters but that is beyond the point I guess int rand

我正在尝试使用OpenMP并行化代码,当前输入大小的串行时间约为9秒,我有一个以下形式的代码:

int main()
{
    /* do some stuff*/ 
    myfunction();
}

void myfunction()
{
    for (int i=0; i<n; i++)
    {
        //it has some parameters but that is beyond the point I guess
        int rand = custom_random_generator();
        compute(rand);
    }
}
结果:45秒


从理论上讲,为什么会发生这种情况?我知道,对于任何人来说,要说出我的确切问题,他们都需要一个最小的可重复的例子,但我的问题目标是理解可以解释我的问题并自己应用的不同理论,为什么要并行化一个“令人尴尬的并行”呢一段代码导致性能大大降低一种理论可能是与创建和维护多个线程相关的开销

只有在每次迭代都必须执行更复杂的处理器密集型任务时,才能看到并行编程的优势


带有简单例程的简单for循环不会利用它。

我的随机生成器非常复杂,但我的计算函数只返回一个简单等式的结果,我想我将尝试将其并行化then@Sergio好主意。任务成功失败!它将时间提高到18秒,但仍然是串行的2倍,但我想这证实了任务创建是在创建开销。其他原因导致所有这些开销的不仅仅是线程创建,我怀疑是错误共享,缓存失效等等:公平地说,我认为问题在于OP示例并不能准确地表示并行化所在的代码,因此人们只能推测导致所有这些开销的原因不仅仅是线程创建,我会怀疑错误共享、缓存失效等等,你有多少个内核?我有一个带有intel core i5的macbook air 2019,所以我有2个内核,但并行运行4个线程,因为它支持超线程@DreamCrashc。你能告诉我使用“pragma omp parallel for num#threads(1),然后num#threads(2)”的时间吗?没问题,查找竞争条件共享状态这包括外部函数调用您的任务代码没有并行性!(代码中没有任何并行指令)。您可能还想看看关于并行随机数生成的论文,这不是一项琐碎的任务。(例如,平行随机数:简单到1、2、3——萨尔蒙斯)
void myfunction()
{
    for (int i=0; i<n; i++)
    {
        #pragma omp task 
        {
            //it has some parameters but that is beyond the point I guess
            int rand=custom_random_generator();
            compute(rand);
        }
    }
}
void myfunction()
{
    #pragma omp parallel for
    for (int i=0; i<n; i++)
    {
        //it has some parameters but that is beyond the point I guess
        int rand=custom_random_generator();
        compute(rand);
    }
}