是否可以关闭特定功能的优化?我的一个朋友有一个问题,gcc优化使一些(我不知道)μ控制器代码不起作用.我们知道它是哪些函数,但是我们对代码本身没有任何线索,所以最简单和最安全的方法可能就是为整个函数关闭它.
遗憾的是http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html显示有一个优化函数属性/ pragma,但它需要gcc 4.4,这是我们没有的.
提前致谢
我有一个看起来像这样的联盟
union bareVec8f {
__m256 m256; //avx 8x float vector
float floats[8];
int ints[8];
inline bareVec8f(){
}
inline bareVec8f(__m256 vec){
this->m256 = vec;
}
inline bareVec8f &operator=(__m256 m256) {
this->m256 = m256;
return *this;
}
inline operator __m256 &() {
return m256;
}
}
Run Code Online (Sandbox Code Playgroud)
__m256需要在32字节边界上对齐以与SSE函数一起使用,并且应该是自动的,即使在联合内也是如此.
而当我这样做
bareVec8f test = _mm256_set1_ps(1.0f);
Run Code Online (Sandbox Code Playgroud)
我遇到了分段错误.由于我制作的构造函数,此代码应该可以工作.但是,当我这样做
bareVec8f test;
test.m256 = _mm256_set1_ps(8.f);
Run Code Online (Sandbox Code Playgroud)
我没有得到分段错误.
因此,因为工作正常,所以联合可能正确对齐,但是看起来构造函数只会导致一些分段错误
我正在使用gcc 64bit windows编译器
---------------------------------编辑Matt设法生成了这里似乎发生的最简单的错误示例.
#include <immintrin.h>
void foo(__m256 x) {}
int main()
{
__m256 r = _mm256_set1_ps(0.0f);
foo(r);
}
Run Code Online (Sandbox Code Playgroud)
我正在编译 -std=c++11 -mavx
当-O3使用GCC 4.8/4.9/5.1 编译程序时,我无法确定段错误的原因.对于GCC 4.9.x,我在Cygwin,Debian 8(x64)和Fedora 21(x64)上看过它.其他人在GCC 4.8和5.1上体验过它.
该程序-O2很好,其他版本的GCC很好,在其他编译器(如MSVC,ICC和Clang)下很好.
下面是GDB下的崩溃,但没有任何事情发生在我身上.源代码misc.cpp:26如下,但它是一个简单的异或:
((word64*)buf)[i] ^= ((word64*)mask)[i];
Run Code Online (Sandbox Code Playgroud)
有问题的代码在演员表之前检查64位字对齐.从反汇编中-O3,我知道它与vmovdqa指令有关:
(gdb) disass 0x0000000000539fc3
...
0x0000000000539fbc <+220>: vxorps 0x0(%r13,%r10,1),%ymm0,%ymm0
=> 0x0000000000539fc3 <+227>: vmovdqa %ymm0,0x0(%r13,%r10,1)
0x0000000000539fca <+234>: add $0x20,%r10
Run Code Online (Sandbox Code Playgroud)
看起来GCC正在使用SSE向量-O3,而不是使用它们-O2.(感谢亚历杭德罗提出的建议).
我会天真地问:vmovdqa对齐要求是否大于64位字?是这样,为什么GCC在单词不是128位对齐时选择它?
是什么导致了这里的段错误?我该如何进一步排除故障?
另请参阅错误66852 - 在64位对齐阵列上发出的vmovdqa指令,导致segfault.它是针对这个问题提交的,所以目前尚未证实.
$ gdb ./cryptest.exe
GNU gdb (Debian 7.7.1+dfsg-5) 7.7.1
...
(gdb) r v
...
Testing MessageDigest algorithm SHA-3-224.
.....
Program received signal SIGSEGV, …Run Code Online (Sandbox Code Playgroud)