为什么多线程比单线程慢?? (Linux,C,使用 pthread)
Why MultiThread is slower than Single?? (Linux,C,using pthread)
我对多线程有疑问。
这段代码是关于比较单线程和多线程的简单示例。
(单线程与 4 多线程的总和为 0~400,000,000)
//Single
#include<pthread.h>
#include<unistd.h>
#include<stdio.h>
#include<stdlib.h>
#define NUM_THREAD 4
#define MY_NUM 100000000
void* calcThread(void* param);
double total = 0;
double sum[NUM_THREAD] = { 0, };
int main() {
long p[NUM_THREAD] = {MY_NUM, MY_NUM * 2,MY_NUM * 3,MY_NUM * 4 };
int i;
long total_nstime;
struct timespec begin, end;
pthread_t tid[NUM_THREAD];
pthread_attr_t attr[NUM_THREAD];
clock_gettime(CLOCK_MONOTONIC, &begin);
for (i = 0; i < NUM_THREAD; i++) {
calcThread((void*)p[i]);
}
for (i = 0; i < NUM_THREAD; i++) {
total += sum[i];
}
clock_gettime(CLOCK_MONOTONIC, &end);
printf("total = %lf\n", total);
total_nstime = (end.tv_sec - begin.tv_sec) * 1000000000 + (end.tv_nsec - begin.tv_nsec);
printf("%.3fs\n", (float)total_nstime / 1000000000);
return 0;
}
void* calcThread(void* param) {
int i;
long to = (long)(param);
int from = to - MY_NUM + 1;
int th_num = from / MY_NUM;
for (i = from; i <= to; i++)
sum[th_num] += i;
}
我想更改使用 4-MultiThread 代码,所以我将计算函数更改为使用 MultiThread。
...
int main() {
...
//createThread
for (i = 0; i < NUM_THREAD; i++) {
pthread_attr_init(&attr[i]);
pthread_create(&tid[i],&attr[i],calcThread,(void *)p[i]);
}
//wait
for(i=0;i<NUM_THREAD;i++){
pthread_join(tid[i],NULL);
}
for (i = 0; i < NUM_THREAD; i++) {
total += sum[i];
}
clock_gettime(CLOCK_MONOTONIC, &end);
...
}
Result(in Ubuntu)
但是,它比单功能代码慢。我知道多线程更快。
我不知道这个问题:( 怎么了?
你能给我一些建议吗?非常感谢!
"I know MultiThread is faster"
情况并非总是如此,因为通常您会 CPU 以某种方式受到限制,无论是由于核心数量,它是如何在 OS 级别安排的,以及硬件水平。
这是一个平衡,多少线程值得分配给一个进程,因为您可能 运行 遇到一个旧的 Linux 问题,在该问题中您将花费比实际更多的时间来安排进程 运行宁他们。
因为这是非常依赖硬件的,并且 OS 依赖,所以很难确切地说出问题可能是什么,但请确保您为 CPU 安装了适当的微码(通常由默认为 Ubuntu),但以防万一,请尝试:
sudo apt-get install intel-microcode
否则看看其他进程正在运行什么 运行,可能有很多其他进程正在 运行正在分配给进程的内核上。
我对多线程有疑问。 这段代码是关于比较单线程和多线程的简单示例。 (单线程与 4 多线程的总和为 0~400,000,000)
//Single
#include<pthread.h>
#include<unistd.h>
#include<stdio.h>
#include<stdlib.h>
#define NUM_THREAD 4
#define MY_NUM 100000000
void* calcThread(void* param);
double total = 0;
double sum[NUM_THREAD] = { 0, };
int main() {
long p[NUM_THREAD] = {MY_NUM, MY_NUM * 2,MY_NUM * 3,MY_NUM * 4 };
int i;
long total_nstime;
struct timespec begin, end;
pthread_t tid[NUM_THREAD];
pthread_attr_t attr[NUM_THREAD];
clock_gettime(CLOCK_MONOTONIC, &begin);
for (i = 0; i < NUM_THREAD; i++) {
calcThread((void*)p[i]);
}
for (i = 0; i < NUM_THREAD; i++) {
total += sum[i];
}
clock_gettime(CLOCK_MONOTONIC, &end);
printf("total = %lf\n", total);
total_nstime = (end.tv_sec - begin.tv_sec) * 1000000000 + (end.tv_nsec - begin.tv_nsec);
printf("%.3fs\n", (float)total_nstime / 1000000000);
return 0;
}
void* calcThread(void* param) {
int i;
long to = (long)(param);
int from = to - MY_NUM + 1;
int th_num = from / MY_NUM;
for (i = from; i <= to; i++)
sum[th_num] += i;
}
我想更改使用 4-MultiThread 代码,所以我将计算函数更改为使用 MultiThread。
...
int main() {
...
//createThread
for (i = 0; i < NUM_THREAD; i++) {
pthread_attr_init(&attr[i]);
pthread_create(&tid[i],&attr[i],calcThread,(void *)p[i]);
}
//wait
for(i=0;i<NUM_THREAD;i++){
pthread_join(tid[i],NULL);
}
for (i = 0; i < NUM_THREAD; i++) {
total += sum[i];
}
clock_gettime(CLOCK_MONOTONIC, &end);
...
}
Result(in Ubuntu) 但是,它比单功能代码慢。我知道多线程更快。 我不知道这个问题:( 怎么了? 你能给我一些建议吗?非常感谢!
"I know MultiThread is faster"
情况并非总是如此,因为通常您会 CPU 以某种方式受到限制,无论是由于核心数量,它是如何在 OS 级别安排的,以及硬件水平。
这是一个平衡,多少线程值得分配给一个进程,因为您可能 运行 遇到一个旧的 Linux 问题,在该问题中您将花费比实际更多的时间来安排进程 运行宁他们。
因为这是非常依赖硬件的,并且 OS 依赖,所以很难确切地说出问题可能是什么,但请确保您为 CPU 安装了适当的微码(通常由默认为 Ubuntu),但以防万一,请尝试:
sudo apt-get install intel-microcode
否则看看其他进程正在运行什么 运行,可能有很多其他进程正在 运行正在分配给进程的内核上。