gpt4 book ai didi

c - 增加 pthreads 线程数对速度没有影响

转载 作者:太空宇宙 更新时间:2023-11-04 01:33:06 25 4
gpt4 key购买 nike

在下面的程序中,增加线程数根本不会产生任何提速的好处(用linux下的time命令测得)。我已经在以下处理器上运行它:

  • 英特尔 i5 M520
  • 英特尔至强 X5650

在我看来,在线程之间分工的逻辑是正确的。我什至尝试过移除锁,这显然给出了错误的结果,但速度仍然没有提高。有什么想法吗?

#include <pthread.h>
#include <stdio.h>
#include <math.h>
#include <stdlib.h>

double sum;
pthread_mutex_t mutex;
typedef struct {
int start;
int end;
}sumArg;

void *sumRoots(void *arg) {
sumArg s = *((sumArg *) arg);
int i = s.start;
double tmp;
while(i <= s.end) {
tmp = sqrt(i);
pthread_mutex_lock(&mutex);
sum += tmp;
pthread_mutex_unlock(&mutex);
i++;
}
free(arg);
}

int main(int argc, char const *argv[]) {
int threadCount = atoi(argv[1]);
int N = atoi(argv[2]);
if (N < 1 || threadCount < 1) printf("Usage: ./sumOfRoots threads N\n");

pthread_t tid[threadCount];
pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_mutex_init(&mutex, NULL);

sumArg *s;
int i = 0;
while(i < threadCount) {
s = (sumArg *) malloc(sizeof(sumArg));
s->start = ((N/threadCount) * i) + 1;
s->end = (N/threadCount) * (i + 1);
pthread_create(&tid[i], &attr, sumRoots, s);
i++;
}

i = 0;
while(i < threadCount) pthread_join(tid[i++], NULL);
printf("sum: %f\n", sum);
return 0;
}

编辑:以下是该程序的一些运行,全部运行在 i5 M520 上:

time ./sumOfRoots 1 1000000000
sum: 21081851083600.558594

real 0m21.933s
user 0m21.268s
sys 0m0.000s

time ./sumOfRoots 2 1000000000
sum: 21081851083600.691406

real 0m21.207s
user 0m21.020s
sys 0m0.008s

time ./sumOfRoots 4 1000000000
sum: 21081851083600.863281

real 0m21.488s
user 0m21.116s
sys 0m0.016s

time ./sumOfRoots 8 1000000000
sum: 21081851083601.777344

real 0m21.432s
user 0m21.092s
sys 0m0.020s

我认为总和的变化是由浮点精度损失引起的。

最佳答案

时序之所以几乎保持不变,是因为它以同步为主。在我的计算机上,单线程解决方案甚至更快!

如下更改代码使时间符合预期:

void *sumRoots(void *arg) {
sumArg s = *((sumArg *) arg);
int i = s.start;
double tmp = 0;
while(i <= s.end) {
tmp += sqrt(i++);
}
pthread_mutex_lock(&mutex);
sum += tmp;
pthread_mutex_unlock(&mutex);
free(arg);
return 0;
}

现在你的线程在没有同步的情况下运行了一段时间,然后在添加过程中只同步了一次。

我在系统上看到的时间如下:

> time ./a.out 1 1000000000
sum: 21081851083600.558594
real 0m13.220s
user 0m13.098s
sys 0m0.009s

> time ./a.out 2 1000000000
sum: 21081851083600.863281

real 0m6.613s
user 0m12.930s
sys 0m0.027s

关于c - 增加 pthreads 线程数对速度没有影响,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19616895/

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