2011-03-25 74 views
0

已經發布了關於同一問題的疑問,但我認爲答案開始走向其他方向,所以我會嘗試着重我的問題:P我應該如何保護對共享變量的訪問?

1)需要用一些數據填充hughe向量。爲了提高速度,我想使用線程來完成這項工作,所以1個線程可以寫入向量的前半部分,而另一個線程寫入下半部分。

由於每個線程都訪問該向量的不同位置......我是否需要保護該訪問?

換句話說,我可以同時寫入這個結構的兩個不同位置而不保護它嗎?

... 

using namespace std; 

... 

main{ 

int n = 256x1024x1024; 
vector<int> vec(n); 

thread t1(fillFunction(std::ref(vector), 0, n/2); 
thread t2(fillFunction(std::ref(vector), n/2, n); 

t1.join; 
t2.join; 

} 

fillFunction(vector<int> &vec, int first, int final){ 
int i; 
for (i = first; i < final; i++){ 
vec[i] = some_data; 
} 

} 

如果我必須保護訪問,我應該使用lock_guard還是unique_lock?

2)這個線程解決方案是否真的會提高速度?

我的意思是,即使我保護着作,矢量足夠大,不適合緩存。線程正在寫入非常不同的位置,所以'for'會產生如此多的緩存未命中。

這些「緩存未命中」會導致比沒有線程更慢的執行嗎?

讓1個線程填充偶數,其他線程奇數可以減少緩存未命中?

thread t1(fillFunction(std::ref(vector), 0, n/2); 
thread t2(fillFunction(std::ref(vector), 1, n); 

[...] 

for (i = first; i < final; i = i+2){ 
vec[i] = some_data; 
} 

謝謝大家:)

+0

我從來沒有得到過關於在C++標記中回答這些問題的廢話。指定您使用的*精確*處理器品牌,型號和步進,主板芯片組和編譯器型號以及版本號,並運行此代碼。可以肯定的是,請提及案件的顏色。 – 2011-03-25 02:17:37

+0

編譯器是gcc 4.5,我知道處理器有兩個核心,但我在大學工作,不知道模型或任何其他信息。無論如何,我需要知道,如果使用線程會導致程序執行速度較慢,這是因爲緩存未命中。 – Kitinz 2011-03-25 02:36:20

+0

我已經評論了我對原始問題的回答,並提供了有關性能和數據競賽的其他信息。 – 2011-03-25 08:07:50

回答

1

1)不,你並不需要保護的載體,如果你保證寫入不同的地址。

2)你真的只需要在你的機器上測試這些東西。嘗試單線程與交錯訪問與分割訪問並僅僅計時結果。