相关疑难解决方法(0)

在gcc 4.2.2中关闭特定功能的优化

是否可以关闭特定功能的优化?我的一个朋友有一个问题,gcc优化使一些(我不知道)μ控制器代码不起作用.我们知道它是哪些函数,但是我们对代码本身没有任何线索,所以最简单和最安全的方法可能就是为整个函数关闭它.

遗憾的是http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html显示有一个优化函数属性/ pragma,但它需要gcc 4.4,这是我们没有的.

提前致谢

c gcc

13
推荐指数
4
解决办法
2万
查看次数

`__m256`的包装器使用构造函数生成分段错误 - Windows 64 + MinGW + AVX问题

我有一个看起来像这样的联盟

 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

c++ g++ avx windows64 mingw-w64

6
推荐指数
1
解决办法
503
查看次数

使用-O3时确定段错误的原因?

-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)

c++ gdb sse gcc4.9

5
推荐指数
1
解决办法
1325
查看次数

标签 统计

c++ ×2

avx ×1

c ×1

g++ ×1

gcc ×1

gcc4.9 ×1

gdb ×1

mingw-w64 ×1

sse ×1

windows64 ×1