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
заявление.