Почему я получаю неправильные значения синхронизации с помощью следующего кода хронографического режима в режиме выпуска? - PullRequest
0 голосов
/ 06 марта 2020

РЕДАКТИРОВАТЬ: я исправил это! Итак, теперь мой вопрос состоит в том, как сделать внутреннюю l oop не избыточной, поскольку я все еще хочу, чтобы переменная итерации считалась. В этом коде tst:

template <class T>
void tst(T(*f)(T*, int), T* arr, long long c, int reps, long long its, long long& ctr, T& res) {
    high_resolution_clock::time_point time1, time2;
    nanoseconds dur;

    time1 = steady_clock::now();

    res = (f)(arr, c);

    for (int i = 0; i < reps; ++i) for (long long j = 0; j < its; ++j) (f)(arr, c);

    time2 = steady_clock::now();

    dur = duration_cast<nanoseconds>(time2 - time1);

    ctr += dur.count();
    ctr /= reps;
}

Возвращенные значения верны. Время до первого вызова для сохранения результата: res = (f)(arr, c); работает. Я предполагаю, что поскольку более поздние вызовы имеют ту же функцию, они были оптимизированы из существования!

Оригинальный вопрос:

Я изучал способы встроенных функций в Visual Studio 19 C ++, чтобы сделать некоторые основы c бенчмаркинга.

Тест состоит в том, чтобы иметь большой массив значений и суммировать их как можно быстрее (я знаю, что это не очень хорошее использование встроенных функций, которые я только изучаю).

В режиме отладки код выполняется нормально, хотя и очень медленно, но показанные значения времени разумны. Однако в режиме освобождения функции утверждают, что выполнялись примерно за 30 наносекунд, что просто невозможно. В среднем выполнение кода занимает 12 секунд, однако функция tst сообщает, что эти 12 секунд были, по сути, просто долями секунды. Показанное время не меняется, поскольку я изменяю размер массива и количество итераций, хотя это, очевидно, и должно происходить при использовании режима отладки.

Я использую все доступные оптимизации компилятора, включая avx и max inlining et c. Возможно, встраивание мешает работе функции tst?

Это настройки:

static const unsigned long long iterations = (long long)0xFFFFFFFFFFFFFFFF;
static const unsigned long long arrSize = (long long)0xFFFFFFF;
static const unsigned int repeats = 1

А затем клавиша, имеющая недостатки в режиме разблокировки, функция tst ():

template <class T>
void tst(T(*f)(T*, int), T* arr, long long c, int reps, long long its, long long& ctr, T& res) {
    high_resolution_clock::time_point time1, time2;
    nanoseconds dur;

    res = (f)(arr, c);

    for (int i = 0; i < reps; ++i) {
        time1 = steady_clock::now();
        for (long long j = 0; j < its; ++j) {
            (f)(arr, c);
        }
        time2 = steady_clock::now();
        dur = duration_cast<nanoseconds>(time2 - time1);
        ctr += dur.count();
    }

    ctr /= reps;
}
...