0

どのようにスケールアップするかをテストするために、次の非常に単純な 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 秒です。したがって、オーバーヘッドはないと思います。

4

1 に答える 1

0

clock()すべてのスレッドで使用された CPU 時間をカウントします。つまり、CPU 時間の合計を少し多く使用していることがわかります。これは、まさに予想どおりの結果です。

並列化が効果的である場合、これは経過時間の合計です。の代わりにクロックをclock_gettime()指定して測定します。CLOCK_MONOTONICclock()

于 2015-08-08T11:00:18.397 に答える