Скажите, что у Вас есть немного класса:
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, или действительно ли это действительно только ценно при выполнении объемных операций?
В общем, вам нужно будет предпринять дополнительные шаги, чтобы получить максимальную отдачу от SSE (или любой другой архитектуры SIMD):
данные должны быть 16 выровненные по байтам (в идеале)
данные должны быть непрерывными
вам нужно достаточно данных, чтобы сделать операцию SIMD стоящей
вам необходимо объединить как можно больше операций, чтобы снизить затраты на загрузку / хранение
вам необходимо знать иерархию кеша / памяти и ее влияние на производительность (например, использовать полосовой анализ / тайлинг)
ценно, если ваш случай заключается в том, что вы выполняете множество одинаковых вычислений для диапазона данных. например, вы вычисляете квадратные корни из многих-многих уравнений. вы можете загрузить 4 значения в регистры sse и вызвать операции один раз. это увеличит производительность на 4.
и есть библиотеки, в которых есть вся оптимизация sse. не изобретайте велосипед заново.
Пару лет назад я пробовал использовать Case One на работе, и прирост производительности был едва ощутимым. В конце концов я решил отказаться от него, поскольку все хлопоты с выравниванием всех Point3D
по 16-байтовым границам не имели смысла.
Как вы правильно догадались, SSE больше всего подходит для массовых операций, где они могут дать неплохое ускорение. Прежде чем использовать SSE интринсики, проверьте, какой код уже генерирует компилятор. Я знаю по опыту, что, например, Visual Studio довольно хорошо использует SSE-оптимизацию.