2013-06-07 11 views
23

In den Advanced Vector Extensions (AVX) die Vergleichsanweisungen wie _m256_cmp_ps, das letzte Argument ist ein Vergleichsprädikat. Die Entscheidungen für das Prädikat überwältigen mich. Sie scheinen ein Tripple von Typ, Reihenfolge, Signalisierung zu sein. Zum Beispiel _CMP_LE_OS ist 'weniger als oder gleich, geordnet, signalisierend.So wählen Sie AVX vergleichen Prädikat Varianten

Für den Anfang, gibt es einen Leistungsgrund für die Auswahl Signalisierung oder nicht Signalisierung, und ähnlich ist bestellt oder ungeordnet schneller als die anderen?

Und was bedeutet 'nicht signalisieren' überhaupt? Ich kann das in den Dokumenten überhaupt nicht finden. Gibt es eine Faustregel, wann was auszuwählen?

Hier sind die Prädikats Auswahl von 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

Wenn Sie nicht auf NaN's treffen, dann ist es wirklich egal. –

Antwort

21

bestellt vs Ungeordnete mit dem zu tun hat, ob der Vergleich wahr ist, wenn einer der Operanden ein NaN enthält (siehe What does ordered/unordered comparison mean?). Signalisierung (S) vs Nicht-Signalisierung (Q für Ruhe?) Wird bestimmen, ob eine Ausnahme ausgelöst wird, wenn ein Operand ein NaN enthält.

Aus Performance-Sicht sollten diese alle gleich sein (unter der Annahme, dass keine Ausnahmen ausgelöst werden). Wenn Sie benachrichtigt werden möchten, wenn ein NaN vorhanden ist, möchten Sie Signalisierung. Wie für geordnete vs ungeordnet, hängt alles davon ab, wie Sie mit NaNs umgehen wollen.