0

我正在進行關於多線程的演示,並且我想演示指令如何以一個大的方式增加。彙編指令執行指令的數量

考慮瑣碎程序

a++; 
b++; 
c++; 

在單線程程序三個彙編指令(讀,添加一個,寫)組成++操作僅具有一個順序(讀取,添加一個至a,寫入內存,讀取b,...)

在只有三個線程並行執行這三條線的程序中,有更多的配置。編譯器可以按照任意順序對這些指令進行優化和重新編寫,其約束條件爲「讀取」,「添加一個」和「寫入」以便abc。有多少有效訂單?

初始想法: (3 + 3 + 3)* 1/= 20160

其中(3 + 3 + 3)(3 3 3!!)!是沒有約束的排列總數,1 /(3!+ 3!+ 3!)是排列正確順序的比例。

+0

如果您試圖並行執行任務,那麼線程0有三個選項,處理a,b或c。線程1然後剩下2,線程2剩下1,3 * 2 * 1 = 6種不同的方式可以處理。在你用a,b或c做某些事情之後,它才真正變得有趣,然後開始混合a,b,c d = a + b。 E = d + C。 –

+0

你所描述的是超標量,而不是多線程。具體而言,它是超標量,無序執行。在多線程環境中,編譯器編譯時只有一個前綴:「讀取,添加,寫入」。 – slebetman

+1

「編譯器」與「多線程」有什麼關係?這是一個相當混亂的問題。在* single *線程中,這個代碼如何被編譯的問題變得有趣,但是在CPU內部的指令重新排序是一個更有趣的方面。在多線程中,通常不能在並行執行的指令中放置*任何*次序。 –

回答

2

這可能是一個更精細的評論,但...

在單個線程版本的編譯器可以重新排列這些添加劑與出輸出的變化。 c++編譯器可以這樣做。所以單線程有3!的可能性。這是假設++是原子。

當你進入多線程時,操作順序感失去了它的意義,這取決於架構,它可以在同一時間完成。事實上,你甚至沒有線程。例如。上證所指示。

你正在嘗試計算的是在單個線程上執行3個添加項,其中load->inc->store不是原子的。國際海事組織,對總共9個要素施加秩序的方式與您的要求類似,但因素將是(3!*3!*3!)

1你拿9!那麼您將3個元素的順序除以3!,然後再重複執行2次。但是我覺得這個因素太大了。

我會問一個數學家,這對combinatorics很好。等效的問題是,有NxM綵球。 N是變量的數量,M是您需要在每個變量上執行的原子操作的數量。球的不同訂單數量是多少?顏色是變量。因爲您知道第一個顏色必須是load,第二個++和第三個store。所以你得到顏色M=3球。也許這種表現對於一個純粹的數學家來說會更好。

編輯:顯然根據wikipedia關於multisets的排列我最初的猜測是正確的。我仍然會檢查自己。