Оптимизируйте эту функцию (в C ++)

У меня есть код, потребляющий процессор, где некоторая функция с циклом выполняется много раз. Каждая оптимизация в этом цикле приносит заметный прирост производительности. Вопрос: Как бы вы оптимизировали этот цикл (хотя оптимизировать особо нечего ...)?

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 , ошибка)
  • функция является методом класса
  • in и put равны int64_t , поэтому отрицательные и положительные
  • `(v> max) могут оцениваться как истинные: рассмотрим ситуацию, когда фактический max отрицателен
  • код работает на 32-битном ПК (разработка) и 64-битном (производственном)
  • N неизвестно во время компиляции
  • Я попробовал несколько SIMD, но мне не удалось увеличить производительность ... ( накладные расходы При использовании переменных в _m128i выполнение и обратное сохранение были выше, чем прирост скорости SSE. Тем не менее, я не эксперт по SSE, так что, возможно, у меня был плохой код)

Результаты:

Я добавил разворачивание цикла, и хороший прием из сообщения Alex'es. Ниже я вставляю некоторые результаты:

  1. оригинал: 14.0s
  2. развернутый цикл (4 итерации): 10.44s
  3. Трюк Alex'es: 10.89s
  4. 2) и 3) сразу: 11.71s

, что 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;

}
7
задан Jakub M. 18 November 2011 в 11:17
поделиться