我写了以下非常简单的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秒。因此,我认为没有这样的开销。
发布于 2015-08-08 19:00:18
clock()统计所有线程使用的CPU时间。因此,所有这些都告诉您,您使用的总CPU时间稍微多一点,这正是您所期望的。
这是总的挂钟运行时间,如果你的并行化是有效的,它应该是下降的。使用clock_gettime()指定CLOCK_MONOTONIC时钟而不是clock()来测量它。
https://stackoverflow.com/questions/31881452
复制相似问题