У меня есть код, потребляющий процессор, где некоторая функция с циклом выполняется много раз. Каждая оптимизация в этом цикле приносит заметный прирост производительности. Вопрос: Как бы вы оптимизировали этот цикл (хотя оптимизировать особо нечего ...)?
void theloop(int64_t in[], int64_t out[], size_t N)
{
for(uint32_t i = 0; i < N; i++) {
int64_t v = in[i];
max += v;
if (v > max) max = v;
out[i] = max;
}
}
Я пробовал несколько вещей, например, я заменил массивы указателями, которые увеличивались в каждом цикле, но (что удивительно) я потерял некоторую производительность вместо увеличения ...
Редактировать:
itsMaximums
, ошибка) int64_t
, поэтому отрицательные и положительные N
неизвестно во время компиляции _m128i
выполнение и обратное сохранение были выше, чем прирост скорости SSE. Тем не менее, я не эксперт по SSE, так что, возможно, у меня был плохой код) Результаты:
Я добавил разворачивание цикла, и хороший прием из сообщения Alex'es. Ниже я вставляю некоторые результаты:
, что 4) не быстрее, чем 3) и 4). Ниже код для 4):
for(size_t i = 1; i < N; i+=CHUNK) {
int64_t t_in0 = in[i+0];
int64_t t_in1 = in[i+1];
int64_t t_in2 = in[i+2];
int64_t t_in3 = in[i+3];
max &= -max >> 63;
max += t_in0;
out[i+0] = max;
max &= -max >> 63;
max += t_in1;
out[i+1] = max;
max &= -max >> 63;
max += t_in2;
out[i+2] = max;
max &= -max >> 63;
max += t_in3;
out[i+3] = max;
}