A и B - векторы или длина N, где N может находиться в диапазоне от 20 до 200. Я хочу рассчитать квадрат расстояния между этими векторами, i.e. d^2 = || A-B ||^2.Как векторизовать расчет расстояний с использованием SSE2
До сих пор у меня есть:
float* a = ...;
float* b = ...;
float d2 = 0;
for(int k = 0; k < N; ++k)
{
float d = a[k] - b[k];
d2 += d * d;
}
Это, кажется, работает хорошо, за исключением того, что я профилированного мой код, и это узкое место (более 50% времени тратится только делает это). Я использую Visual Studio 2012, на Win 7, с этими вариантами оптимизации: /O2 /Oi /Ot /Oy-
. Я понимаю, что VS2012 должен автоиндексировать этот цикл (используя SSE2). Однако, если я вставляю #pragma loop(no_vector)
в код, я не получаю заметное замедление, поэтому я думаю, что цикл не является векторизованным. Компилятор подтверждает, что с этим сообщением:
info C5002: loop not vectorized due to reason '1105'
Мои вопросы:
- Можно ли исправить этот код, чтобы VS2012 может векторизации это?
- Если нет, было бы целесообразно попытаться сами векторизовать код?
- Можете ли вы порекомендовать мне веб-сайт, чтобы узнать о кодировании SSE2?
- Есть ли какое-то значение N, ниже которого векторизация будет контрпродуктивной?
- Что такое
reason '1105'
?
+1 для опции/fp: fast - это приводит к векторизации кода. Благодаря! Однако ваш код (даже с/fp: fast) на самом деле занимает в два раза длиннее моего исходного кода (без/fp: fast). Новый []/delete [] является большим хитом. Замена выделенного кучи выделенным буфером, выделенным стеком, сокращает половину времени, чтобы вернуть время возврата туда, где я начал. Захватывание данных дважды - также большой успех. Оказалось, что лучше всего сохранить мой оригинальный код и использовать/fp: быстро для увеличения 2x. – Bull
Также спасибо за страницу с кодом ошибки 1105 в MSDN, не уверен, почему я не смог ее найти (я действительно был на этой странице!). Если вы удалите свой код, я приму этот ответ. Мой исходный код с/fp: fast - мое предпочтительное решение. – Bull
@ user2151446 Я удалил код, хотя в моем тестовом примере код из вашего примера не был векторизован, следовательно, добавлена сложность. Я собираюсь задать вопрос об этом завтра. – masrtis