GCC 4.8.2 自动矢量化由于 cout 而失败
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
对象。您还使用与使用n
不同的std::endl
。删除该语句时,不会涉及所有这些成本。
最后一个cout
之前的语句也被编译器优化(删除(,因为a
的值未在任何地方使用。
int a = bitmap[1];
此外,编译器优化了两个for
循环,因为在删除最后一个cout
语句时,不会使用两个for
循环计算的bitmap
值。而且也不需要bitmap
阵列。
您可以使用此处提供的编译器版本和选项查看为代码生成的程序集。您可以清楚地看到当您注释掉和取消注释cout
语句时会发生什么。
相关文章:
- 如果没有malloc,链表实现将失败
- 模板参数替换失败,并且未完成隐式转换
- 具有默认模板参数的多态类的模板推导失败
- 视图中的参数推导失败:take_while
- 请解释这句话(cout<<1+int((a<b)^((b-a)&1) )<<endl
- 链接到自行创建的dll失败
- 带有特殊路径部分的"std::filesystem::weakly_canonical"失败
- std::cout.imbue()多重调用
- GetShortPathName在网络驱动器上使用中文文件夹时失败
- gcc和c++17的过载解析失败
- 为什么使用 P/Invoke 调用 dll 时,某些计算机中的 LoadLibrary 失败?
- 在WSL:configure_file上对config_file的每次调用都失败:配置文件时出现问题
- 使用 GCC 卸载的 OpenMP 卸载失败,并出现"Ptx assembly aborted due to errors"
- GCC 4.8.2 自动矢量化由于 cout 而失败
- C++ Setter/Getter,cout 工作,printf 失败
- 十六进制数组 cout 到文本文件失败
- 为什么语句"cout << '\\\\';"没有失败?
- stringstream.rdbuf 导致 cout 失败
- 调试断言在 cout 函数上失败
- 在c++中并行实现lisp风格的函数到列表的映射,在使用线程后没有cout就会失败