2013-06-07 2 views
23

В расширенных расширениях векторов (AVX) инструкции сравнения, такие как _m256_cmp_ps, последним аргументом является предикат сравнения. Выбор предиката подавляет меня. Они кажутся тройным типом, упорядочением, сигнализацией. . _CMP_LE_OS «меньше или равно, упорядочено, сигнализирует.Как выбрать варианты предиката AVX

Для начала, есть ли причина для выбора сигнализации или отсутствия сигнализации, и аналогичным образом упорядочена или неупорядочена быстрее, чем другая?

И что означает «не сигнализация»? Я не могу найти это в документах вообще. Любое эмпирическое правило о том, когда выбрать что?

Вот выбор предикатные из 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) */ 
+0

Если вы не собираетесь встречаться с NaN, тогда это действительно не имеет значения. –

ответ

21

Заказанный против неупорядоченных связано с ли сравнение верно, если один из операндов содержит NaN (см What does ordered/unordered comparison mean?). Сигнализация (S) против несигнальной сигнализации (Q для тихих?) Определит, возникает ли исключение, если операнд содержит NaN.

С точки зрения эффективности, все они должны быть одинаковыми (при условии, что, конечно, не возникают исключения). Если вы хотите, чтобы вас предупреждали, когда есть NaN, вам нужна сигнализация. Что касается упорядоченного и неупорядоченного, все зависит от того, как вы хотите иметь дело с NaN.

Смежные вопросы