Почему вектор AVX и операция принимают float-векторы? [Дубликат]

SET ORACLE_SID=<YOUR SID HERE>

sqlplus scott/tiger@DB < sql1.sql > data1.txt
sqlplus scott/tiger@DB < sql2.sql > data2.txt
14
задан Paul R 11 June 2015 в 21:27
поделиться

3 ответа

Я думаю, что все три фактически одинаковы, то есть 128-битные побитовые операции. Причина, по которой существуют разные формы, вероятно, историческая, но я не уверен. Я предполагаю, что возможно , что может быть некоторое поведение в версиях с плавающей точкой, например. когда есть NaNs, но это чистое догадки. Для нормальных входов инструкции кажутся взаимозаменяемыми, например

#include <stdio.h>
#include <emmintrin.h>
#include <pmmintrin.h>
#include <xmmintrin.h>

int main(void)
{
    __m128i a = _mm_set1_epi32(1);
    __m128i b = _mm_set1_epi32(2);
    __m128i c = _mm_or_si128(a, b);

    __m128 x = _mm_set1_ps(1.25f);
    __m128 y = _mm_set1_ps(1.5f);
    __m128 z = _mm_or_ps(x, y);

    printf("a = %vld, b = %vld, c = %vld\n", a, b, c);
    printf("x = %vf, y = %vf, z = %vf\n", x, y, z);

    c = (__m128i)_mm_or_ps((__m128)a, (__m128)b);
    z = (__m128)_mm_or_si128((__m128i)x, (__m128i)y);

    printf("a = %vld, b = %vld, c = %vld\n", a, b, c);
    printf("x = %vf, y = %vf, z = %vf\n", x, y, z);

    return 0;
}

$ gcc -Wall -msse3 por.c -o por

$ ./por

a = 1 1 1 1, b = 2 2 2 2, c = 3 3 3 3
x = 1.250000 1.250000 1.250000 1.250000, y = 1.500000 1.500000 1.500000 1.500000, z = 1.750000 1.750000 1.750000 1.750000
a = 1 1 1 1, b = 2 2 2 2, c = 3 3 3 3
x = 1.250000 1.250000 1.250000 1.250000, y = 1.500000 1.500000 1.500000 1.500000, z = 1.750000 1.750000 1.750000 1.750000
3
ответ дан Paul R 23 August 2018 в 02:24
поделиться
  • 1
    ORPD / ORPS - это только SSE, а не MMX. – Potatoswatter 10 May 2010 в 20:10
  • 2
    @Potatoswatter: извините - я имел в виду 64-разрядный SSE (1) - обновлен. – Paul R 10 May 2010 в 21:39
  • 3
    Но Intel представила orps и позже orpd как после por. И физическая основа SSE никогда не менялась. – Potatoswatter 10 May 2010 в 21:53
  • 4
    Физическая основа SSE изменила lot , особенно с Woodcrest, когда она наконец стала полной 128-битной единицей. Однако это, вероятно, не имеет значения - похоже, что я ошибаюсь в том, почему существуют отдельные побитовые инструкции OR. Я думал, что это было наследие, связанное с переключением контекста между целыми и SSE-операциями с плавающей запятой в старые времена, но, возможно, нет. – Paul R 10 May 2010 в 22:06
  • 5
    re: предположение в первом абзаце: все версии побитового логического кода полностью идентичны, за исключением размера и производительности инструкции. Создание NaN с побитовыми опциями FP не будет делать ничего особенного. IDK, если наибольшее мотивирующее значение имеет производительность (пересылка данных с доменом FP ​​по отношению к домену vector-int) или ортогональность ортогональности программиста / insn (без использования int ops на данных FP). Я должен написать ответ, так как я прочитал кое-что, о котором никто не упоминал ... – Peter Cordes 5 July 2015 в 15:54
8
ответ дан Community 23 August 2018 в 02:24
поделиться

В соответствии с рекомендациями по оптимизации Intel и AMD смешивание типов op с типами данных приводит к удару по производительности, поскольку ЦП внутренне пропускает 64-битные половинки регистра для определенного типа данных. Это, по-видимому, в основном влияет на облицовку труб, когда команда декодируется, и запланированы команды. Функционально они дают одинаковый результат. Более новые версии для целых типов данных имеют большую кодировку и занимают больше места в сегменте кода. Поэтому, если размер кода является проблемой, используйте старые операционные системы, поскольку они имеют меньшую кодировку.

7
ответ дан Phernost 23 August 2018 в 02:24
поделиться
  • 1
    «типы смешивания типа с типами данных создают производительность ...» Можете ли вы объяснить, что дальше или дайте мне ссылки на это, спасибо. – user0002128 25 January 2013 в 00:21
  • 2
    @ user0002128 Подробности в этом ответе . – Raymond Chen 24 December 2013 в 09:05
Другие вопросы по тегам:

Похожие вопросы: