Я разработал генератор Мандельброта для Windows, который я только что переработал для использования SSE Intrinsics. Чтобы обнаружить конец итераций, в обычной арифметике я делаю больше, чем сравнивать и вырываться. Выполняя это в SSE, я могу сравнить весь вектор с помощью _mm_cmpgt_pd/_mm_cmpgt_ps, однако это напишет новый 128-битный вектор со всеми 1s для случая, о котором я забочусь.SSE Intrinsics: Самый быстрый способ проверить все 0 или 1?
Мой вопрос в том, есть ли более эффективный способ обнаружения для всех 1-х, а не для проверки 2-х упакованных 64 INTs? Или, если более эффективно обнаруживать для всех 0, то я мог бы сравнивать меньше. Вот то, что я в настоящее время:
_m128d CompareResult = Magnitude > EarlyOut;
const __m128i Tmp = *reinterpret_cast< __m128i* >(&CompareResult);
if (Tmp.m128i_u64[ 0 ] == Tmp.m128i_u64[ 1 ] == -1)
{
break;
}
Поэтому я хочу, чтобы найти лучший способ, потому что я не люблю актеров, но и потому, что в соответствии с Vtune более чем на 30% моего времени итерации проводится в этом Последняя линия. Я знаю, что многое будет в самой ветке, но я предполагаю, что смогу уменьшить это с лучшим обнаружением 0 или 1.
Благодаря
См: http://stackoverflow.com/questions/10175711/check-xmm-register -for-all-zeroes –