2016-12-14 49 views
4

如果我用C語言編寫的計算,如矩陣矩陣加法或矩陣矩陣乘法,其中工作在for循環中完成,並且在每次迭代中發生相同數量和類型的算術運算,輸入數據的值會影響計算速度?例如,如果矩陣元素是值在0和127之間的32位整數,以便它們的表示僅在每四個相應字節中的一箇中變化,那麼其運行速度會快於如果值在0和INT_MAX之間變化(假設不是未定義的行爲發生)?給定數據類型的算術運算的代價是否隨操作數值而變化?

如果我不得不猜測我會說不,因爲無論值是小還是非常大,因爲它被定義爲32位整數,所以它將被屏蔽以適應相同數量的存儲空間,所以小的和大的值將最終在內存中具有相同的字節量。我是否正確思考這個問題?單/雙精度浮點數不同嗎?

+1

目前尚不清楚你的問題是什麼。如果你想基準測試,請閱讀如何正確執行。如果你有其他問題,你應該更具體。 – Olaf

+6

在現代CPU硬件上,具有數據相關性能的唯一操作是(int和FP)除法和sqrt。 (它們通常是可變延遲,並且不是完全流水線的;請參見[最近的Collat​​z-conjecture手寫的asm問題,瞭解更多關於DIV與shift的內容,例如](http://stackoverflow.com/questions/40354978/why- IS-這個-C-代碼快於我,手寫具組件進行測試最collat​​/40355466#40355466))。 add/sub/mul/shift都是固定的延遲/吞吐量。這在所有當前的[x86 CPU](http://agner.org/optimize)上都是如此,在大多數其他系統上幾乎肯定如此。 –

+0

@Olaf我沒有特別的問題,我只是好奇而已。我脫掉了基準標籤,以防它看起來像我有一個特定的基準問題。我認爲內核基準將是一個很好的例子來說明我想要問什麼。 –

回答

1

變量中包含的數據不會影響性能,它只是一個存儲空間。如果必須以某種方式操縱此存儲空間中的數據,則可能會遇到一些性能問題。以下是可能會影響與此相關的性能的幾件事情。

  1. 根據CPU的硬件結構(即HW FPU VS SW浮點實現中,流水線相較於未流水線等...)執行一個CPU密集的數學運算(即除法,平方根等。 )在不同的數據集上可能會影響性能。

  2. 可能影響性能的另一種情況是該變量駐留在內存中。變量字節的對齊方式是隻需要一個指令週期來訪問數據?或者它沒有對齊,所以需要額外的指令週期來檢索所有數據。通常在這些情況下,編譯器會有特殊的關鍵字,甚至是可以強制變量進行優化的編譯指示。

最好的問候!

+2

正常平臺(如x86)的普通編譯器始終將整數,浮點數和雙精度值對齊到它們的自然對齊方式(例如,8字節值爲8個字節)。你必須特別使用'__attribute __((packed))'或者一個類似的編譯指示來覆蓋結構體內的這個。但是,將數據排列在結構中以避免填充可以使整個結構與一個緩存行之間的差異變小,但是會導致對多個結構的大規模緩存命中率的影響。 –

+0

好點!我主要在嵌入式世界工作,但不幸的是,情況並非總是如此:(開發人員需要強制對齊,並如上所述進行覈算。 – Brandon83

+0

擴展OP的問題並提供與原始問題相關的額外信息不要在沒有提供任何關於該主題的任何有用信息或對如何使答案更好的建設性批評中標記回答 – Brandon83

相關問題