我有一个大功能,需要从一个点浮动转换为整数。没有这个转换,我的机器上的功能需要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 –