我正在進行關於多線程的演示,並且我想演示指令如何以一個大的方式增加。彙編指令執行指令的數量
考慮瑣碎程序
a++;
b++;
c++;
在單線程程序三個彙編指令(讀,添加一個,寫)組成++
操作僅具有一個順序(讀取,添加一個至a,寫入內存,讀取b,...)
在只有三個線程並行執行這三條線的程序中,有更多的配置。編譯器可以按照任意順序對這些指令進行優化和重新編寫,其約束條件爲「讀取」,「添加一個」和「寫入」以便a
b
和c
。有多少有效訂單?
初始想法: (3 + 3 + 3)* 1/= 20160
其中(3 + 3 + 3)(3 3 3!!)!是沒有約束的排列總數,1 /(3!+ 3!+ 3!)是排列正確順序的比例。
如果您試圖並行執行任務,那麼線程0有三個選項,處理a,b或c。線程1然後剩下2,線程2剩下1,3 * 2 * 1 = 6種不同的方式可以處理。在你用a,b或c做某些事情之後,它才真正變得有趣,然後開始混合a,b,c d = a + b。 E = d + C。 –
你所描述的是超標量,而不是多線程。具體而言,它是超標量,無序執行。在多線程環境中,編譯器編譯時只有一個前綴:「讀取,添加,寫入」。 – slebetman
「編譯器」與「多線程」有什麼關係?這是一個相當混亂的問題。在* single *線程中,這個代碼如何被編譯的問題變得有趣,但是在CPU內部的指令重新排序是一個更有趣的方面。在多線程中,通常不能在並行執行的指令中放置*任何*次序。 –