GCC 4.8.2 ошибка авто-векторизации из-за cout

Мой код выглядит следующим образом, и я использую 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

Решение

В заявлении

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

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

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

int a = bitmap[1];

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

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

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector