為什麼並行沒有比序列快?

2021-09-08 02:41:01 字數 1928 閱讀 6012

要統計乙個整型陣列中3出現的次數,寫乙個並行程式:

#include

#include

#include

#include

#include

#include

#include

#define arrlen 200000000 //

int型陣列的長度,我們的程式就是要統計這個陣列中元素3出現了多少次

struct padded_int*private_counter;

int counter=0;

int arr[arrlen]=;

pthread_mutex_t lock=pthread_mutex_initializer;

int max_threads=0; //

令最多開闢的執行緒數等於核數

/*用隨機數初始化陣列

*/void initarr()

/*從/proc/cpuinfo檔案中獲取cpu的核數

*/void getcorenum(int *num)

int cn=0;

char buf[256];

memset(buf,0x00,sizeof(buf));

while((fgets(buf,sizeof(buf),fp))!=null)

memset(buf,0x00,sizeof(buf));

}fclose(fp);

*num=cn;

printf("

您的計算機是%d核的\n

",cn);}/*

每個執行緒負責統計陣列的一段區域內3出現的次數

*/void *count_thread(void* id)

}printf("

private_counter[%d].value=%d\n

",index,private_counter[index].value);

pthread_mutex_lock(&lock);

counter+=private_counter[index].value;

pthread_mutex_unlock(&lock);}/*

序列方法統計3出現的次數

*/void count()

/*主函式

改進歷史:

由於自加執行並不是原子操作,所以在每個執行緒中counter++前要獲得互斥鎖。

頻繁地加鎖和解鎖會使執行效率降低。下面我們給每個執行緒乙個私有的計數器private_counter,計算結束後一次性更新全域性變數counter。

私有計數器private_counter從int演變為struct padded_int的原因是:int型的private_counter並不是真正私有的。cache一致性協議兩個處理器看到的儲存映象是相同的。cache一致性的單位是cache行,本機有cahche行大小是64位元組(我猜是這樣的,因為/proc/cpuinfo檔案中寫著:cache_alignment: 64 )。private_counter[0]和private_counter[1]被放在了同乙個cache行中,對cache行中任一部分的修改等同於對整個cache行的修改。邏輯上不同的資料共享cache行的現象叫做假共享。所以當處理器1修改private_counter[0]之前,處理器2必須把自己手中相應的cache行廢棄掉;當處理器1修改完private_counter[0]之後,處理器2再能重新獲取private_counter[1]所在的cache行的操作權。為了不讓private_counter[0]和private_counter[1]在同了個cache行內,所以把它們都填充成了64位元組。

現在的體系結構已經可以把多執行緒對映到不同的處理器上,可為什麼平行計算的速度還是沒有序列的快呢?

為什麼並行沒有比序列快?

要統計乙個整型陣列中3出現的次數,寫乙個並行程式 include include include include include include include define arrlen 200000000 int型陣列的長度,我們的程式就是要統計這個陣列中元素3出現了多少次 struct pad...

epoll為什麼快

epoll是linux下的一種i o多路復用的操作方式,是event poll的意思 i o多路復用,舉個栗子,在酒吧,乙個服務員,10個顧客在喝酒,服務員有這麼幾種服務方式 服務員從第乙個顧客開始問,你要酒嗎,再問第二個,你要酒嗎,依次問下去,問完一圈,再從頭開始,服務員就是不停的在bbb,要酒嗎...

kafka 為什麼快

一般的 mq 每個訊息都有乙個狀態,這樣每個訊息狀態改變都要更新,增加了很多隨機讀寫。kafka 對每個 partition 只有乙個指標,而不是儲存每個訊息的狀態,所有在指標後面的訊息都是被消費過的訊息。這就去掉了很多 確認訊息 動作的隨機讀寫,通過一次移動指標,來確認多個訊息。很多訊息中介軟體,...