Практика SSE int и float

При работе как с целыми числами, так и с числами с плавающей запятой в SSE (AVX) рекомендуется ли преобразовывать все целые числа в числа с плавающей запятой и работать только с числами с плавающей запятой? Потому что после этого нам нужно всего несколько инструкций SIMD, и все, что нам нужно использовать, это инструкции сложения и сравнения (<, <=, ==), которые это преобразование, я надеюсь, должно полностью сохранить.


person Cartesius00    schedule 24.02.2012    source источник
comment
В идеале лучше избавиться от чисел с плавающей запятой, а не целых чисел. Инты быстрее, лучше и сильнее :)   -  person    schedule 25.02.2012
comment
Даже на ССЕ??? Я не уверен. Очевидно, что мы не можем избавиться от чисел с плавающей запятой :) Преобразование int 4 -> 4.00000 допустимо, но равенство должно быть сохранено.   -  person Cartesius00    schedule 25.02.2012
comment
Вам нужно будет показать пример того, что вы пытаетесь сделать. int != float. А также AVX пока не поддерживает 256-битную целочисленную арифметику. (AVX2 будет) Итак, я понимаю, почему вы хотите это сделать. Будет ли это быстрее, будет сильно зависеть от того, что вы пытаетесь сделать.   -  person Mysticial    schedule 25.02.2012
comment
int и float разные и не взаимозаменяемые. Используйте тип, который лучше всего представляет ваши данные.   -  person David Heffernan    schedule 25.02.2012
comment
@Mysticical: все, что нам нужно, это несколько инструкций, упомянутых выше. Нам нужно разработать какой-нибудь нетривиальный алгоритм, которому нужны только эти инструкции, а на вход он может получить int[] или float[]. Итак, наша идея состоит в том, чтобы преобразовать все в __m256 (поплавки) и работать только с ними. Будет ли это хорошим подходом?   -  person Cartesius00    schedule 25.02.2012
comment
@Джеймс: Действительно. Если вы можете использовать int, а не float/double, вы всегда выбираете int. Будь то SSE или нет. Ну, если только вы не пользуетесь аппаратным ускорителем, разработанным специально для чисел с плавающей запятой и без поддержки целых чисел. К сожалению, иногда использование математики с фиксированной точкой приводит к большим проблемам. Банк CHASE, например, когда-то вложил кучу денег, чтобы избавиться от поплавков в одной из своих систем, немного обработки транзакций из банкоматов + анализ ценообразования, если не ошибаюсь. В конце концов они остановились на ints и FPGA.   -  person    schedule 25.02.2012
comment
В настоящее время целочисленный SSE имеет более высокую пропускную способность и меньшую задержку, чем FP-AVX. Поэтому, если вы выполняете только сложение и сравнение, я бы предпочел целочисленный SSE вместо FP-AVX. Вы также получите преимущества AVX2, когда он выйдет. Подмножество приложений, которые выигрывают от использования чисел с плавающей запятой для целочисленной арифметики, довольно узкое. (но они действительно существуют)   -  person Mysticial    schedule 25.02.2012
comment
@Mysticial: Итак, вы бы разделили наш алгоритм на две части: int-input-version, работающий с __m128i, и float-input-version, работающий с __m256, верно?   -  person Cartesius00    schedule 25.02.2012


Ответы (1)


Разверните мои комментарии в ответ.

В основном вы взвешиваете следующий компромисс:

Придерживайтесь целого числа:

  • Целочисленный SSE отличается малой задержкой и высокой пропускной способностью. (двойной выпуск на Sandy Bridge)
  • Ограничено 128-битной шириной SIMD.

Преобразовать в число с плавающей запятой:

  • Воспользуйтесь преимуществами 256-битного AVX.
  • Более высокие задержки и сложение/вычитание только одной проблемы (на Sandy Bridge)
  • Берет на себя первоначальные накладные расходы на преобразование.
  • Ограничивает ввод теми, которые вписываются в float без потери точности.

Я бы сказал, что пока придерживайтесь целого числа. Если вы не хотите дублировать код с версиями float, то это ваш выбор.

Единственный раз, когда я видел, что эмуляция целых чисел с плавающей запятой становится быстрее, это когда вам нужно выполнять деление.


Обратите внимание, что я не упомянул о читабельности, поскольку погружение в ручную векторизацию, вероятно, подразумевает, что производительность важнее.

person Mysticial    schedule 24.02.2012
comment
AVX с плавающей запятой не является единственной проблемой Sandy Bridge. Точные характеристики трудно сформулировать вкратце, но Sandy Bridge может выполнять сложение и умножение FP в каждом цикле (а также некоторую комбинацию загрузки, сохранения и перестановки). Подробную информацию см. в разделе 2.1.4 Руководства по оптимизации Intel. (Честно говоря, спрашивающий, кажется, не делает никаких умножений, так что вы не совсем ошиблись) - person Stephen Canon; 25.02.2012
comment
Я полностью осведомлен о проблеме add + mul (наряду с каким-то перемешиванием). Но да, я имел в виду, что добавление FP является единственной проблемой. (Хотя я признаю, что мог бы быть немного более ясным в этом.) - person Mysticial; 25.02.2012