Сколько усилия необходимо вставить для получения усилений от использования SSE?

Заключите тот в корпус

Скажите, что у Вас есть немного класса:

class Point3D
{
private:
  float x,y,z;
public:
  operator+=()

  ...etc
};

Point3D &Point3D::operator+=(Point3D &other)
{
  this->x += other.x;
  this->y += other.y;
  this->z += other.z;
}

Наивное использование SSE просто заменило бы эти тела функции использованием нескольких intrinsics. Но мы ожидали бы, что это будет иметь много значения? MMX раньше включал дорогостоящие изменения состояния IIRC, делает SSE или является ими точно так же, как другие инструкции? И даже если нет никакого прямого "использования SSE" наверху, был бы, перемещая значения в регистры SSE, и отступите, снова действительно делают его немного быстрее?

Случай два

Вместо этого Вы работаете с менее основанной на OO кодовой базой. Вместо массива/вектора объектов Point3D, у Вас просто есть большой массив плаваний:

float coordinateData[NUM_POINTS*3];

void add(int i,int j) //yes it's unsafe, no overlap check... example only
{
  for (int x=0;x<3;++x)
  {
    coordinateData[i*3+x] += coordinateData[j*3+x];
  }
}

Что относительно использования SSE здесь? Немного лучше?

В заключении

Попытка состоит в том, чтобы оптимизировать единственные векторные операции с помощью на самом деле стоящего SSE, или действительно ли это действительно только ценно при выполнении объемных операций?

5
задан Mr. Boy 12 April 2010 в 16:18
поделиться

3 ответа

В общем, вам нужно будет предпринять дополнительные шаги, чтобы получить максимальную отдачу от SSE (или любой другой архитектуры SIMD):

  • данные должны быть 16 выровненные по байтам (в идеале)

  • данные должны быть непрерывными

  • вам нужно достаточно данных, чтобы сделать операцию SIMD стоящей

  • вам необходимо объединить как можно больше операций, чтобы снизить затраты на загрузку / хранение

  • вам необходимо знать иерархию кеша / памяти и ее влияние на производительность (например, использовать полосовой анализ / тайлинг)

6
ответ дан 14 December 2019 в 04:33
поделиться

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

и есть библиотеки, в которых есть вся оптимизация sse. не изобретайте велосипед заново.

1
ответ дан 14 December 2019 в 04:33
поделиться

Пару лет назад я пробовал использовать Case One на работе, и прирост производительности был едва ощутимым. В конце концов я решил отказаться от него, поскольку все хлопоты с выравниванием всех Point3D по 16-байтовым границам не имели смысла.

Как вы правильно догадались, SSE больше всего подходит для массовых операций, где они могут дать неплохое ускорение. Прежде чем использовать SSE интринсики, проверьте, какой код уже генерирует компилятор. Я знаю по опыту, что, например, Visual Studio довольно хорошо использует SSE-оптимизацию.

0
ответ дан 14 December 2019 в 04:33
поделиться
Другие вопросы по тегам:

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