gpt4 book ai didi

c++ - -fno-strict-aliasing 作为函数属性

转载 作者:太空宇宙 更新时间:2023-11-03 17:26:01 26 4
gpt4 key购买 nike

我有一个函数,出于性能原因,我在其中输入双关语。基本上,我有一个存储为 32 个 uint32 数组的 32×32 位数组:

struct Tile {

uint32_t d[32];

};

然后我想计算 32×32 方 block 的 28×28“内部”的总体(“1”的数量)。朴素的方法会调用机器的 popcnt 指令 28 次,每行一次。然而,由于 popcnt 可以采用 64 位参数,这可以减少到 14 个 popcnt 调用:

int countPopulation(Tile* sqt) __attribute__((optimize("-fno-strict-aliasing"))) {

int pop = 0;

for (int i = 2; i < 30; i += 2) {
const uint64_t v = *reinterpret_cast<const uint64_t*>(sqt->d + i);
pop += __builtin_popcountll(v & 0x3ffffffc3ffffffcull);
}

return pop;

}

如果我不包含该属性:

__attribute__((optimize("-fno-strict-aliasing")))

然后 g++ 会因为显而易见的原因不断提示我的类型双关:

warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing]
const uint64_t v = *reinterpret_cast<const uint64_t*>(sqt->d + i);

另一方面,如果我包含该属性,某些版本的 g++ 会报错,而其他版本则不会。在我尝试过的机器中,我得到:

  • g++ (Ubuntu 4.8.4-2ubuntu1~14.04.1) 4.8.4 提示
  • g++-4.6.real (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3 不提示
  • g++ (Debian 5.3.1-5) 5.3.1 20160101 不提示

Ubuntu 风格的 g++ 4.8.4 有什么问题?

最佳答案

不要输入双关语。没有理由这样做。而是正确使用 memcpy() 来复制您的 int64_t 参数。优化器将完成剩下的工作。

关于c++ - -fno-strict-aliasing 作为函数属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36362697/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com