Я написал несколько векторных методов, которые выполняют простую математику на месте или копируют и имеют одинаковое наказание для варианта на месте.
Самое простое можно свести к следующему:
void scale(float* dst, const float* src, int count, float factor)
{
__m128 factorV = _mm_set1_ps(factorV);
for(int i = 0; i < count; i+= 4)
{
__m128 in = _mm_load_ps(src);
in = _mm_mul_ps(in, factorV);
_mm_store_ps(dst, in);
dst += 4;
src += 4;
}
}
код тестирования:
for(int i = 0; i < 1000000; i++)
{
scale(alignedMemPtrDst, alignedMemPtrSrc, 256, randomFloatAbsRange1);
}
При тестировании, т. Е. Многократном использовании этой функции в тех же буферахЯ обнаружил, что если dst и src одинаковы, скорость одинакова.Если они разные, это примерно в 70 раз быстрее.Основные циклы, записанные при записи (т. Е. _Mm_store_ps)
Интересно, что такое же поведение не выполняется для сложения, то есть + = работает хорошо, только * = это проблема ..
-
На это ответили в комментариях.Это ненормально во время искусственного тестирования.