При работе как с целыми числами, так и с числами с плавающей запятой в SSE (AVX) рекомендуется ли преобразовывать все целые числа в числа с плавающей запятой и работать только с числами с плавающей запятой? Потому что после этого нам нужно всего несколько инструкций SIMD, и все, что нам нужно использовать, это инструкции сложения и сравнения (<, <=, ==
), которые это преобразование, я надеюсь, должно полностью сохранить.
Практика SSE int и float
Ответы (1)
Разверните мои комментарии в ответ.
В основном вы взвешиваете следующий компромисс:
Придерживайтесь целого числа:
- Целочисленный SSE отличается малой задержкой и высокой пропускной способностью. (двойной выпуск на Sandy Bridge)
- Ограничено 128-битной шириной SIMD.
Преобразовать в число с плавающей запятой:
- Воспользуйтесь преимуществами 256-битного AVX.
- Более высокие задержки и сложение/вычитание только одной проблемы (на Sandy Bridge)
- Берет на себя первоначальные накладные расходы на преобразование.
- Ограничивает ввод теми, которые вписываются в
float
без потери точности.
Я бы сказал, что пока придерживайтесь целого числа. Если вы не хотите дублировать код с версиями float
, то это ваш выбор.
Единственный раз, когда я видел, что эмуляция целых чисел с плавающей запятой становится быстрее, это когда вам нужно выполнять деление.
Обратите внимание, что я не упомянул о читабельности, поскольку погружение в ручную векторизацию, вероятно, подразумевает, что производительность важнее.
person
Mysticial
schedule
24.02.2012
AVX с плавающей запятой не является единственной проблемой Sandy Bridge. Точные характеристики трудно сформулировать вкратце, но Sandy Bridge может выполнять сложение и умножение FP в каждом цикле (а также некоторую комбинацию загрузки, сохранения и перестановки). Подробную информацию см. в разделе 2.1.4 Руководства по оптимизации Intel. (Честно говоря, спрашивающий, кажется, не делает никаких умножений, так что вы не совсем ошиблись)
- person Stephen Canon; 25.02.2012
Я полностью осведомлен о проблеме add + mul (наряду с каким-то перемешиванием). Но да, я имел в виду, что добавление FP является единственной проблемой. (Хотя я признаю, что мог бы быть немного более ясным в этом.)
- person Mysticial; 25.02.2012
4 -> 4.00000
допустимо, но равенство должно быть сохранено. - person Cartesius00   schedule 25.02.2012int
!=float
. А также AVX пока не поддерживает 256-битную целочисленную арифметику. (AVX2 будет) Итак, я понимаю, почему вы хотите это сделать. Будет ли это быстрее, будет сильно зависеть от того, что вы пытаетесь сделать. - person Mysticial   schedule 25.02.2012int[]
илиfloat[]
. Итак, наша идея состоит в том, чтобы преобразовать все в__m256
(поплавки) и работать только с ними. Будет ли это хорошим подходом? - person Cartesius00   schedule 25.02.2012__m128i
, и float-input-version, работающий с__m256
, верно? - person Cartesius00   schedule 25.02.2012