GCC 4.8.2 自动矢量化由于 cout 而失败

GCC 4.8.2 auto-vectorization fail due to cout

本文关键字:cout 失败 矢量化 GCC      更新时间:2023-10-16

我的代码如下,我使用 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。

任何人都可以帮助我。

在语句中

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

您正在初始化涉及存储的ostream对象。您还使用与使用n不同的std::endl。删除该语句时,不会涉及所有这些成本。

最后一个cout之前的语句也被编译器优化(删除(,因为a的值未在任何地方使用。

int a = bitmap[1];

此外,编译器优化了两个for循环,因为在删除最后一个cout语句时,不会使用两个for循环计算的bitmap值。而且也不需要bitmap阵列。

您可以使用此处提供的编译器版本和选项查看为代码生成的程序集。您可以清楚地看到当您注释掉和取消注释cout语句时会发生什么。