首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >pthreads代码不能扩展

pthreads代码不能扩展
EN

Stack Overflow用户
提问于 2015-08-07 23:28:46
回答 1查看 143关注 0票数 0

我写了以下非常简单的pthread代码来测试它是如何扩展的。我在一台有8个逻辑处理器的机器上运行代码,并且我创建的线程永远不会超过8个(以避免上下文切换)。随着线程数量的增加,每个线程要做的工作也越来越少。此外,从代码中可以明显看出,线程之间没有共享数据结构,这可能是一个瓶颈。但是,随着线程数量的增加,我的性能也会下降。谁能告诉我我到底做错了什么。

代码语言:javascript
复制
#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秒。因此,我认为没有这样的开销。

EN

回答 1

Stack Overflow用户

发布于 2015-08-08 19:00:18

clock()统计所有线程使用的CPU时间。因此,所有这些都告诉您,您使用的总CPU时间稍微多一点,这正是您所期望的。

这是总的挂钟运行时间,如果你的并行化是有效的,它应该是下降的。使用clock_gettime()指定CLOCK_MONOTONIC时钟而不是clock()来测量它。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31881452

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档