由于 cout,GCC 4.8.2 自动矢量化失败
GCC 4.8.2 auto-vectorization fail due to 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。
任何人都可以帮助我。
在声明中
std::cout << "TEST: " << a << endl
您正在初始化一个涉及存储的 ostream
对象。您还使用 std::endl
,这与使用 \n
不同。当您删除该语句时,所有这些费用都不涉及。
最后一个 cout
之前的语句也被编译器优化掉(删除),因为 a
的值没有在任何地方使用。
int a = bitmap[1];
此外,编译器优化了两个 for
循环,因为当您删除最后一个 cout
语句。而且也不需要 bitmap
数组。
您可以看到使用您提供的编译器版本和选项为您的代码生成的程序集 here。你可以清楚地看到当你注释掉和取消注释 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。
任何人都可以帮助我。
在声明中
std::cout << "TEST: " << a << endl
您正在初始化一个涉及存储的 ostream
对象。您还使用 std::endl
,这与使用 \n
不同。当您删除该语句时,所有这些费用都不涉及。
最后一个 cout
之前的语句也被编译器优化掉(删除),因为 a
的值没有在任何地方使用。
int a = bitmap[1];
此外,编译器优化了两个 for
循环,因为当您删除最后一个 cout
语句。而且也不需要 bitmap
数组。
您可以看到使用您提供的编译器版本和选项为您的代码生成的程序集 here。你可以清楚地看到当你注释掉和取消注释 cout
语句时会发生什么。