1

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

如果我 delete std::cout << "TEST: " << a << endl;,则此代码是矢量化的并且COST小于 100。

任何人都可以帮助我。

4

1 回答 1

1

在声明中

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

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

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

int a = bitmap[1];

此外,这两个for循环都被编译器优化掉了,因为当你删除最后一个语句时bitmap,两个循环计算的值for将不会被使用。cout而且也不需要bitmap数组。

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

于 2018-10-23T04:31:46.697 回答