2016-08-29 83 views
1

有禍了,我必須確保GPU和CPU上的浮點結果相同。好吧,我瞭解IEEE已經照顧了我,並提供了一個很好的標準來堅持幾個舍入選項;並且CUDA部分被整理出來(有不同舍入模式的內部函數),所以這只是動機。在C++中使用不同的IEEE浮點舍入模式

但在主機端C++代碼中 - 如何在特定的舍入模式下執行浮點運算(我的意思是在特定的語句中,而不是在我的翻譯單元中)?有沒有在引擎蓋下使用程序集的包裝函數?有不同舍入模式的浮點數代理的一組類嗎?

我也在提問有關翻譯單元級別的問題。編譯翻譯單元時,如何使編譯器(gcc/clang/MSVC)默認爲某個舍入模式?

+0

http://en.cppreference.com/w/cpp/numeric/fenv/FE_round IEEE四捨五入模式是CPU的運行時配置屬性,我不認爲您可以在編譯時選擇特定的舍入模式。 –

+0

@AndreasPapadopoulos,但你也許可以將其設置http://en.cppreference.com/w/cpp/numeric/fenv/feround(或者發現你不能和重新組合) – StoryTeller

+0

@StoryTeller是的,這基本上是什麼我在我上面的評論中鏈接了。 –

回答

0

在從@AndreasPapadopoulos鉛,它看起來像there is an official way改變舍入模式:

int fesetround(int round) 
int fegetround() 

但有幾個注意事項:

  1. 這是C++ 11,而不是C + +98(儘管在實踐中你可能只是使用你的系統的<fenv.h>這是C99
  2. 它需要通過#pragma
  3. 此切換可能會很慢。

我不確定這在實踐中有多廣泛使用(以及是否有任何更好的抽象概念,這些抽象更常用)。