我有一個大功能,需要從一個點浮動轉換爲整數。沒有這個轉換,我的機器上的功能需要11-12 ns /循環。通過轉換,它需要約400納秒/循環。爲什麼我會收到這些彙編錯誤?
經過一番閱讀,我找到了一種方法來加快使用一些內聯彙編的轉換。我的函數的第一次迭代如下:
inline int FISTToInt (float f)
{
int i;
asm("fld %1;"
"fistp %0;"
:"=r" (i)
:"r" (f)
:
);
return i;
}
當我整理,我得到了以下錯誤:
src/calcRunner.cpp: Assembler messages:
src/calcRunner.cpp:43: Error: operand type mismatch for `fld'
src/calcRunner.cpp:43: Error: operand type mismatch for `fistp'
想到了一個位所提供的答案,我忘了指令後綴,所以我改爲如下功能:
inline int FISTToInt (float f)
{
int i;
asm("flds %1;"
"fistps %0;"
:"=r" (i)
:"r" (f)
:
);
return i;
}
但是這並沒有解決問題,而不是我得到這個:
src/calcRunner.cpp: Assembler messages:
src/calcRunner.cpp:43: Error: invalid instruction suffix for `fld'
src/calcRunner.cpp:43: Error: invalid instruction suffix for `fistp'
這是怎麼回事?
它可以跨x86體系結構移植,在這種情況下,我需要的速度遠遠超過我需要的可移植性,尤其是考慮到它將運行的網格由x86機器組成。這個循環運行數百萬億次,我只能使用我的大學網格規則獲得600個核心,因此循環需要非常快速,因此需要組裝。如果您運行在一組有限的體系結構上,則可移植性無關緊要。 –
我想我知道問題是什麼(我也不相信它會加速很多!)。在使用fpu時,你需要使用內存加載/存儲,而不是寄存器。我會測試並寫出答案。 –
如果你打算爲速度編寫程序集,你應該考慮SIMD指令:http://en.wikipedia.org/wiki/Streaming_SIMD_Extensions –