GCC 4.8.2 ошибка авто-векторизации из-за cout - PullRequest
0 голосов
/ 23 октября 2018

Мой код выглядит следующим образом, и я использую GCC 4.8.2:

#include <iostream>
#include <stdint.h>
#include <sys/time.h>
#include <ctime>

using namespace std;

int main(int argc, char *argv[]) {
    struct timespec time_start={0, 0},time_end={0, 0};
    uint8_t bitmap[20240];
    int cost;
    clock_gettime(CLOCK_REALTIME, &time_start);
    for (int i = 0; i < 20240; ++i) {
        bitmap[i >> 3] |= 1 << (i&7);
    }
    clock_gettime(CLOCK_REALTIME, &time_end);
    cost = time_end.tv_nsec - time_start.tv_nsec;
    cout << "case COST: " << cost << endl;
    clock_gettime(CLOCK_REALTIME, &time_start);
    for (int i = 0; i < 20240; ++i) {
        bitmap[i >> 3] &= 1 << (i&7);
    }
    clock_gettime(CLOCK_REALTIME, &time_end);
    cost = time_end.tv_nsec - time_start.tv_nsec;
    cout << "case COST: " << cost << endl;
    int a = bitmap[1];
    std::cout << "TEST: " << a << endl;

}

Я компилирую его с

gcc -lstdc++ -std=c++11 -O2 -ftree-vectorize -ftree-vectorizer-verbose=7 -fopt-info test.cpp

и получаю test.cpp:14: note: not vectorized: not enough data-refs in basic block..

Затем я запускаю двоичный файл a.out и получаю COST больше 20000.

Если я удаляю std::cout << "TEST: " << a << endl;, этот код векторизован, а COST меньше 100.

Любой может помочь мне.

1 Ответ

0 голосов
/ 23 октября 2018

В операторе

std::cout << "TEST: " << a << endl

Вы инициализируете объект ostream, который включает в себя хранилище.Вы также используете std::endl, что не то же самое, что \n.Когда вы удаляете это заявление, все эти затраты не связаны.

Оператор перед последним cout также оптимизируется (удаляется) компилятором, поскольку значение a нигде не используется.

int a = bitmap[1];

Более того, обаЦиклы for оптимизируются компилятором, поскольку значения bitmap, рассчитанные обоими циклами for, НЕ будут использоваться при удалении последнего оператора cout.И нет необходимости в массиве bitmap.

Вы можете увидеть сборку, сгенерированную для вашего кода с версией компилятора и опциями, которые вы указали здесь .И вы можете ясно видеть, что происходит, когда вы закомментируете и раскомментируете оператор cout.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...