2

假設我正在運行N個線程。 每個線程需要與下一個和前一個線程同步。3by3線程同步:如何避免開銷

for (i = 0 ; i < NITER; i++){ 
     do_something(); 
     sync_with_neighbours (tId - 1, tId + 1); 
    } 

我需要以最有效的方式實現同​​步。 Pthread障礙效率不高,因爲每個線程都會等待最慢的線程到達屏障。

任何想法將受到歡迎

編輯:

不,我們不必等待線程0:

如果這些2個鄰居線程, 「我+ 1」 和「i - 1「,準備好然後線程」我「將運行。

比方說,我們在時間T運行6個線程這種情況:

  • TH0:待定(運行ITER = M)
  • TH1:待定(運行ITER = M)
  • TH2 :準備(等待)
  • TH3:準備(等待)
  • TH4:準備(等待)
  • TH5:待定(運行ITER = M)

現狀在T + 1將是:

  • TH0:待定(運行ITER = M)
  • TH1:待定(運行ITER = M)
  • TH2:準備(等待)
  • TH3:運行ITER = m + 1個
  • TH4:準備(等待)
  • TH5:待定(運行ITER = M)

因此,大家可以看到有沒有必要爲大家等待的Th0

回答

3

我認爲(以下你的例子),您的同步化沒有真正的rendenzvous,但十字狀的信號的意思。因此,任何線程都可以運行,如果它獲得每個鄰居的免費信號。 爲此,您可以使用semaphors,每個線程使用一個。 同步部分看起來像這樣:

UP(left_sem) 
    UP(right_sem) 
    DOWN(own_sem,2) 

(第一個和最後一個線程沒有左或右的鄰居,RESP因此,他們只需要一個簡單的DOWN

關於實施:經典系統V信號似乎是合適的,因爲System V系統已經與信號量數組調用了交易,因此您只需要做一些索引。 但是,每種信號量都應該足夠。

1

只是爲了好玩 - 你可以看看我的遊戲的生命編碼例 -

http://parallel.cc/cgi-bin/bfx.cgi/test_cases.html

但因爲你沒有Parc公園,並且被卡住並行線程這是一個有點棘手。最快的同步方法通常是使用一個簡單的信號量機制,其中(p)線程保持熱點,只是讀取一個內存位置直到它改變(例如等待它爲非零)。

事情要牢記:

如果你單獨的數據和信號,使得通過存儲子系統的寫是不是原子和/或有序的東西可能不工作(有時),這樣至少確保一切在可能的情況下在同一個緩存行上,否則檢查你的數據,因此接收方知道它有一組完整的數據。注意1:我假設你的意思是「速度」而不是「效率」,並且你擁有與線程一樣多的核心。注2:pThreads從操作系統級多線程(粗糙)發展而來,只是在這個級別上(很好)。