gpt4 book ai didi

c - 为什么我在这个程序中没有看到多线程带来的任何加速?

转载 作者:行者123 更新时间:2023-11-30 20:34:39 24 4
gpt4 key购买 nike

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

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 时,它应该创建两个同时执行递归的新线程,我认为这就是这样做的,我得到了一个合理的估计然而,它并不比仅在一个线程上运行(将 threads 设置为 1)快,事实上,它有点慢。

为什么速度没有快两倍?任何解决这个问题的帮助将不胜感激。谢谢。

最佳答案

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

关于c - 为什么我在这个程序中没有看到多线程带来的任何加速?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41902052/

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