我编写了以下非常简单的pthread代码来测试它如何扩展。我在具有8个逻辑处理器的机器上运行代码,并且我在任何时候都不会创建超过8个线程(以避免上下文切换)。 随着线程数量的增加,每个线程必须做更少的工作。此外,从代码中可以明显看出,线程之间没有可能是瓶颈的共享数据结构。但是,当我增加线程数时,我的性能会下降。 谁能告诉我这里我做错了什么。
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int NUM_THREADS = 3;
unsigned long int COUNTER = 10000000000000;
unsigned long int LOOP_INDEX;
void* addNum(void *data)
{
unsigned long int sum = 0;
for(unsigned long int i = 0; i < LOOP_INDEX; i++) {
sum += 100;
}
return NULL;
}
int main(int argc, char** argv)
{
NUM_THREADS = atoi(argv[1]);
pthread_t *threads = (pthread_t*)malloc(sizeof(pthread_t) * NUM_THREADS);
int rc;
clock_t start, diff;
LOOP_INDEX = COUNTER/NUM_THREADS;
start = clock();
for (int t = 0; t < NUM_THREADS; t++) {
rc = pthread_create((threads + t), NULL, addNum, NULL);
if (rc) {
printf("ERROR; return code from pthread_create() is %d", rc);
exit(-1);
}
}
void *status;
for (int t = 0; t < NUM_THREADS; t++) {
rc = pthread_join(threads[t], &status);
}
diff = clock() - start;
int sec = diff / CLOCKS_PER_SEC;
printf("%d",sec);
}
注意:我在网上找到的所有答案都说创建线程的开销超过了他们正在做的工作。为了测试它,我在&#34; addNum()&#34;中注释了所有内容。功能。但是,无论我创建多少个线程,在执行此操作之后,代码所花费的时间为0秒。所以我认为没有这样的开销。
答案 0 :(得分:0)
clock()
计算所有线程使用的CPU时间。因此,所有这些都告诉您,您需要使用更多的总CPU时间,这正是您所期望的。
如果您的并行化有效,那么应该减少的总挂钟时间。通过clock_gettime()
指定CLOCK_MONOTONIC
时钟而不是clock()
来衡量。