56

Advanced Vector Extensions (AVX) の_m256_cmp_psのような比較命令では、最後の引数は比較述語です。述語の選択に圧倒されます。それらは、タイプ、順序付け、シグナリングのトリプルのようです。たとえば、_CMP_LE_OS は「以下、順序付けられた、シグナリング」です。

手始めに、シグナリングまたは非シグナリングを選択するパフォーマンス上の理由はありますか?

そして、「非シグナリング」とは何を意味するのでしょうか? ドキュメントでこれを見つけることができません。いつ何を選択するかについての経験則はありますか?

avxintrin.h からの述語の選択は次のとおりです。

/* Compare */
#define _CMP_EQ_OQ    0x00 /* Equal (ordered, non-signaling)  */
#define _CMP_LT_OS    0x01 /* Less-than (ordered, signaling)  */
#define _CMP_LE_OS    0x02 /* Less-than-or-equal (ordered, signaling)  */
#define _CMP_UNORD_Q  0x03 /* Unordered (non-signaling)  */
#define _CMP_NEQ_UQ   0x04 /* Not-equal (unordered, non-signaling)  */
#define _CMP_NLT_US   0x05 /* Not-less-than (unordered, signaling)  */
#define _CMP_NLE_US   0x06 /* Not-less-than-or-equal (unordered, signaling)  */
#define _CMP_ORD_Q    0x07 /* Ordered (nonsignaling)   */
#define _CMP_EQ_UQ    0x08 /* Equal (unordered, non-signaling)  */
#define _CMP_NGE_US   0x09 /* Not-greater-than-or-equal (unord, signaling)  */
#define _CMP_NGT_US   0x0a /* Not-greater-than (unordered, signaling)  */
#define _CMP_FALSE_OQ 0x0b /* False (ordered, non-signaling)  */
#define _CMP_NEQ_OQ   0x0c /* Not-equal (ordered, non-signaling)  */
#define _CMP_GE_OS    0x0d /* Greater-than-or-equal (ordered, signaling)  */
#define _CMP_GT_OS    0x0e /* Greater-than (ordered, signaling)  */
#define _CMP_TRUE_UQ  0x0f /* True (unordered, non-signaling)  */
#define _CMP_EQ_OS    0x10 /* Equal (ordered, signaling)  */
#define _CMP_LT_OQ    0x11 /* Less-than (ordered, non-signaling)  */
#define _CMP_LE_OQ    0x12 /* Less-than-or-equal (ordered, non-signaling)  */
#define _CMP_UNORD_S  0x13 /* Unordered (signaling)  */
#define _CMP_NEQ_US   0x14 /* Not-equal (unordered, signaling)  */
#define _CMP_NLT_UQ   0x15 /* Not-less-than (unordered, non-signaling)  */
#define _CMP_NLE_UQ   0x16 /* Not-less-than-or-equal (unord, non-signaling)  */
#define _CMP_ORD_S    0x17 /* Ordered (signaling)  */
#define _CMP_EQ_US    0x18 /* Equal (unordered, signaling)  */
#define _CMP_NGE_UQ   0x19 /* Not-greater-than-or-equal (unord, non-sign)  */
#define _CMP_NGT_UQ   0x1a /* Not-greater-than (unordered, non-signaling)  */
#define _CMP_FALSE_OS 0x1b /* False (ordered, signaling)  */
#define _CMP_NEQ_OS   0x1c /* Not-equal (ordered, signaling)  */
#define _CMP_GE_OQ    0x1d /* Greater-than-or-equal (ordered, non-signaling)  */
#define _CMP_GT_OQ    0x1e /* Greater-than (ordered, non-signaling)  */
#define _CMP_TRUE_US  0x1f /* True (unordered, signaling)  */
4

2 に答える 2

38

Ordered vs Unordered は、オペランドの 1 つに NaN が含まれている場合に比較が true であるかどうかと関係があります (順序付けられた / 順序付けられていない比較とはどういう意味ですか?を参照してください)。オペランドに NaN が含まれている場合に例外が発生するかどうかは、シグナリング (S) と非シグナリング (Q for quiet?) によって決まります。

パフォーマンスの観点からは、これらはすべて同じである必要があります (もちろん、例外が発生しないと仮定します)。NaN が発生したときにアラートを受け取りたい場合は、シグナリングが必要です。順序付けされたものと順序付けられていないものについては、NaN をどのように処理するかによって異なります。

于 2013-07-15T23:06:13.987 に答える