C 为什么我在这个程序中没有看到多线程的加速?

C 为什么我在这个程序中没有看到多线程的加速?,c,multithreading,performance,debugging,pthreads,C,Multithreading,Performance,Debugging,Pthreads,我有这个功能。它递归地计算曲线下的竞技场。它在有两个内核的计算机上运行 void* quad(void* argis){ struct args* arg=argis; double m=(arg->l+arg->r)/2; double fm=func(m); double larea=(arg->fl+fm)*(m-arg->l)/2; double rarea = (fm+arg->fr)*(arg->r-m)/

我有这个功能。它递归地计算曲线下的竞技场。它在有两个内核的计算机上运行

void* quad(void* argis){
    struct args* arg=argis;

    double m=(arg->l+arg->r)/2;
    double fm=func(m);
    double larea=(arg->fl+fm)*(m-arg->l)/2;
    double rarea = (fm+arg->fr)*(arg->r-m)/2;

    struct args* arg1 = (struct args*)malloc(sizeof(struct args));
    arg1->l=arg->l;
    arg1->r=m;
    arg1->fl=arg->fl;
    arg1->fr=fm;
    arg1->area=larea;

    struct args* arg2 = (struct args*)malloc(sizeof(struct args));
    arg2->l=m;
    arg2->r=arg->r;
    arg2->fl=fm;
    arg2->fr=arg->fl;
    arg2->area=rarea;

    if(fabs((larea+rarea)-arg->area)>error){
        if(threads<=1){
            void* p1=quad(arg1);
            void* p2=quad(arg2);
            larea=*((double*)p1);
            rarea=*((double*)p2);
            free(p1);
            free(p2);


        }
        else{
            pthread_t thread1, thread2;
            pthread_mutex_lock(&lock1);
            threads-=2;
            pthread_mutex_unlock(&lock1);

            pthread_create(&thread1, NULL, &quad, (void*)arg1);
            pthread_create(&thread2, NULL, &quad, (void*)arg2);

            void* ptr1;
            void* ptr2;

            pthread_join(thread1,&ptr1);
            pthread_join(thread2,&ptr2);


            larea=*(double*)ptr1;
            rarea=*(double*)ptr2;

        }
    }
    free(arg1);
    free(arg2);

    double ret= (larea+rarea);
    double* poin=(double*)malloc(sizeof(double));
    *poin=ret;

    return poin;
}
现在,当我将threads变量设置为2时,它应该创建两个并发执行递归的新线程,我认为这就是这样做的,我得到了一个合理的Pi估计,但是它并不比只在一个线程上运行将threads设置为1快,事实上它稍微慢一些


为什么不快一倍呢?如果您能帮忙解决这个问题,我们将不胜感激。谢谢。

这对于多线程来说是一个足够大的问题吗?创建新线程和管理锁的开销可能大于使用单个线程解决问题的成本。

您的处理器可能有多个内核,但是您的处理器呢?它可能不会,并且会在另一个线程执行FPU计算时阻塞每个线程

另外,请参见本文:

同时进行多线程处理不会带来太多好处的工作负载是指大多数单个软件线程使用处理器或内存中的大量资源的工作负载。例如,浮点密集型工作负载很可能从同步多线程处理中获益甚微,并且最有可能失去性能。这些工作负载大量使用浮点单元或内存带宽。低CPI和低缓存未命中率的工作负载可能会带来一些小的好处


为什么您认为分成线程会加快代码的速度?你如何进行基准测试?哪个站台?火车在哪里?哦,不要在C中使用void*!编程是困难的。对于从多个线程对共享对象进行的非只读、非原子、非同步访问的未定义行为。不太清楚。哪个对象是共享的并且需要同步?@JohnWu:看看我们的链接是否有一个Intel 80287的好图片,但是不是每个核心都有自己的FPU吗?我想这取决于核心,不是吗?如果OP提供了这些信息就好了。代码中还有很多其他问题更可能导致这种情况。请注意,您提供的引文谈到了SMT,如果OP问题中的两个核心是物理核心而不是逻辑核心,那么SMT根本就不适用。也许吧。写一个答案,列出问题,我们就可以讨论了。@JohnWu:我已经在对问题本身的评论中指出了未定义的行为。对于表现出未定义行为的代码的性能争论毫无意义。