簡體   English   中英

操作系統:多線程減速程序(C)

[英]OS: Multiple Threads Slowing Down Program (C)

想法是編寫一個程序,該程序接受要創建的多個隨機數,然后將負載分配給用戶輸入的任意多個線程,並測量使用多個線程時獲得的速度增加。 我的問題; 但是,是我添加的線程越多,程序運行得越慢。 不知道出什么問題了。 到目前為止,這是我的代碼片段:

...
    for (i=0; i<numThreads; i++){
        vals *values;
        values = (vals *)malloc(sizeof(vals));
        values->randoms = count;
        values->id = i;
        pthread_create(&tid[i], NULL, run, (void *) values);
    }

    for (i=0; i<numThreads; i++)
        pthread_join(tid[i], NULL);

    timeElapsed = getMilliSeconds() - timeStart;
    printf("Elapsed time:  %lf seconds\n",(double)(timeElapsed/1000.0));

    exit(EXIT_SUCCESS);
}

void *run(void *arg) {
    vals *values;
    long long int i;
    long long int randoms;

    values = (vals*)arg;
    randoms = values->randoms;
    srandom(values->id);

    for (i = 0; i < randoms; i++) {
        random();
    }

    pthread_exit(NULL);
}

vals是一個包含兩個int值(隨機數和id)的結構。 randoms包含要生成的隨機數除以線程數(以划分負載),id包含每個用作種子的線程的唯一ID。 我需要創建該結構,以便可以將多個值傳遞給線程調用的worker函數。

有什么想法為什么它在更多線程下運行會更慢?

在有多個CPU的環境中,多線程程序可能會顯示出更高的性能。 但是,當缺少可用的CPU資源時,每個線程將必須等待以安排CPU時間。 “上下文切換”是指一個線程從一個CPU中切換出來,而另一個線程已切換成一個線程。“上下文切換”不是一項無關緊要的任務。

因此,線程越多,等待CPU資源的線程就越多,內核花費在進行上下文切換上的時間也就越多(而不是實際工作)。

您很有可能遇到虛假共享 生成隨機數會涉及某些共享狀態的突變,並且多個線程不斷修改相同的值會有效地消除您從CPU的內存緩存中獲得的任何好處。 發生的情況是,每次線程A要訪問該共享狀態時,它都必須等待線程B的CPU內核刷新其緩存。 而且,只要線程B要訪問它,它就必須等待線程A的CPU內核刷新其緩存。

從另一種角度來看,單線程程序將執行以下操作:

Load state into CPU cache
for (i = 0 to randoms ...)
    generate random number

有兩個線程,每個線程都在執行此操作:

for (i = 0 to randoms ...)
    wait for other CPU core to flush its cache
    generate random number

我的問題; 但是,是我添加的線程越多,程序運行得越慢。

如果您的處理線程多於CPU內核,那么您的程序將會變慢。 使用兩個內核,使用計算綁定操作可以做到的絕對最佳結果是運行速度是單線程解決方案的兩倍。 如果您有三個線程,那么線程調度器將不得不停止某個線程,以便第三個線程可以花一些時間。 這些上下文切換需要時間-在計算綁定操作的上下文中,這是相對大量的時間。 通常,您不希望有比CPU內核更多的計算綁定線程。

(當然,沒有超線程。使用超線程,您可能同時運行四個線程,盡管您甚至不可能獲得3倍的改進。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM