【问题标题】:Using SSE to round in DelphiDelphi中使用SSE进行舍入
【发布时间】:2015-01-23 08:40:43
【问题描述】:

我写了这个函数来将单数舍入为整数:

function Round(const Val: Single): Integer;
begin
  asm
    cvtss2si eax,Val
    mov Result,eax
  end;
end;

它有效,但我需要更改舍入模式。显然,根据this,我需要设置 MXCSR 寄存器。

我如何在 Delphi 中做到这一点?

我首先这样做的原因是我需要“远离零”的舍入(就像在 C# 中一样),即使通过 SetRoundingMode 也是不可能的。

【问题讨论】:

  • 你不需要mov Result, eax。结果 eax。其实function Round(const Val: Single): Integer; asm cvtss2si eax,Val end; 就够了;)
  • 谢谢。这回答了另一个问题。
  • @BBaz,为什么我不能对这个函数做同样的事情:function MSb(const Val: Integer): Integer;如果 Val = 0 那么 Result := -1 否则 asm BSR EAX, Val MOV Result, EAX end;结束;
  • 因为在我之前的评论中它是一个(几乎)naked asm 函数。您也必须在 asm 中编写分支(如果则不然)。请注意,我忘记了 RET...以使其成为真正的裸 asm 函数。
  • 谢谢。有人帮我解决了这个问题(包括克服似乎是编译器错误):stackoverflow.com/questions/27133303/…

标签: delphi delphi-7 sse rounding inline-assembly


【解决方案1】:

在现代 Delphi 上,要设置 MXCSR,您可以从 System 单元调用 SetMXCSR。要读取当前值,请使用GetMXCSR

请注意SetMXCSR,就像Set8087CW 不是线程安全的。尽管我努力说服 Embarcadero 改变这一点,但似乎这个特殊的设计缺陷将永远存在。

在旧版本的 Delphi 上,您使用 LDMXCSRSTMXCSR 操作码。你可以像这样编写自己的版本:

function GetMXCSR: LongWord;
asm
  PUSH    EAX
  STMXCSR [ESP].DWord
  POP     EAX
end;

procedure SetMXCSR(NewMXCSR: LongWord);
//thread-safe version that does not abuse the global variable DefaultMXCSR
var
  MXCSR: LongWord;
asm
  AND     EAX, $FFC0 // Remove flag bits
  MOV     MXCSR, EAX
  LDMXCSR MXCSR
end;

这些版本是线程安全的,我希望能在较旧的 Delphi 版本上编译和工作。

请注意,为您的函数使用名称 Round 可能会引起很多混淆。我建议你不要这样做。

最后,我查看了英特尔文档,两个英特尔浮点单元(x87、SSE)都提供了 IEEE754 标准指定的舍入模式。它们是:

  • 四舍五入到最近(偶数)
  • 向下取整(朝向 −∞)
  • 向上取整(朝向 +∞)
  • 向零舍入(截断)

因此,您所需的舍入模式不可用。

【讨论】:

  • 谢谢。我在内部称它为“TrueRound”。你写的和我已经写的差不多。我希望为此使用 SSE。
  • 我已经调整了SetMXCSR 的线程安全版本,因此我认为它可以在 D7 中使用。我手头没有D7。 Q 中的代码在 D6 中编译。所以你应该很高兴。
  • 你是个读心者。您添加了我需要的下一个功能。非常感谢:)
  • 假设这个线程处理的一些其他代码依赖于另一种舍入模式。设置模式不会很快变得混乱吗?只需阅读一篇文章,Floating-Point Determinism
  • @LURD 即使你试图成为一个好公民并这样做,你也会被Set8087CWSetMXCSR 的可怕实现所吸引,它们能够从一个线程注入控制字进入另一个。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多