我编写了以下非常简单的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);
}
注意:我在网上找到的所有答案都说创建线程的开销大于它们正在做的工作。为了测试它,我注释掉了"addNum()"函数中的所有内容。但是,在此之后,无论我创建了多少个线程,代码所花费的时间都是0秒。所以我想没有额外的开销
clock()
计算跨所有线程使用的CPU时间。因此,所有这些都告诉您,您正在使用更多的总CPU时间,这正是您所期望的。
如果你的并行化是有效的,它是总时钟运行时间应该下降。用clock_gettime()
代替clock()
指定CLOCK_MONOTONIC
时钟来测量。