首先,16個單詞並不意味着16個不同的線程。每個線程本身都會帶來諸如同步開銷,不均衡的工作分配,產卵放鬆時間等因素,如果不仔細計算,將會導致完全損害並行性的好處。
如果工作數據之間不存在依賴關係,則可以極大地利用並行性。您的工作與您所表達的任何可能解決方案中的工作數據無關。尋找大量字符中的某些字符,與字符的排列無關(例如,在每個「C」與尋找「++」之後查看「++」)。
現在的問題是如何利用內存帶寬以及如何通過「分支預測」來消除丟失。
公用數據不同線程在內存綁定情況下非常好。讀取數據的第一個線程會將其加載到緩存中,而其他線程最終只會使用這一塊數據。所以數據只能從內存中加載一次。拆分數據也會導致只從內存中加載一次數據,因爲每個線程都會加載它的部分,然後刷新。所以,在這兩種情況下,內存負載非常相似。
你的代碼被稱爲「邏輯綁定」。分支預測是照顧非常重要的方面,但非常棘手。通用數據模塊發生故障的可能性很高。假設你必須找到一個紅色球在百萬個球。預測會傾向於做出「不存在」的自然選擇。但是說它在前100個球內失敗,所有在這次失敗後處理過的球都會以重做的方式結束,而你又回到原點。相反,如果發生分裂,「重做」的最壞情況不會像常見數據那樣糟糕。但我們無法保證。
選擇任何上述模塊,然後完全取決於您處置的架構。
SMT /邏輯核心與物理核心。使用上述任何一種SMT方法都會導致性能下降。物理內核。 您的想法是將一條線程拆分爲子線程是SMT的基礎。每個新的線程加起來追逐資源與同步開銷並且也是分支預測失誤的可能性。在增加物理線程的情況下,分支預測會限制性能。
分裂或公共數據,你的代碼是不可擴展的。最好的做法是利用最低數量。可用的物理內核。常見的數據帶來的複雜程度較低,應該很容易處理。最低數量的線程可以通過實驗找到。在此值之後,性能會保持不變。