【发布时间】:2019-07-29 23:27:07
【问题描述】:
当我在我的机器上运行代码时,程序出现分段错误。
#include <immintrin.h>
#include <stdint.h>
static inline __m256i load_vector(__m256i const * addr){
__m256i res = _mm256_load_si256(addr);
return res;
}
void test2(){
int32_t *src;
src = _mm_malloc(sizeof(__m256i), 32);
__m256i vec = load_vector((__m256i const * )src);
_mm_free(src);
}
int main(int argc,char *argv[]){
test2();
return 0;
}
我尝试使用 gdb 进行调试,但在调用 _mm256_load_si256 时出现分段错误。
我在 AMD 2990wx CPU 上的 cygwin gcc 上运行代码。 怎么会发生这样的事情?
【问题讨论】:
-
在我的机器上工作;我看不出有什么问题。您可以尝试使用 gdb 更仔细地查看问题所在。什么指令产生了段错误?
-
cygwin gcc 的
_mm_malloc是否损坏且未返回 32 字节对齐的内存? -
读取未初始化内存是未定义行为:stackoverflow.com/a/37184840
-
@chtz 从技术上讲它是 UB,但我们可以做得更好。我不明白这会如何导致 OP 的段错误。 @OP,因为您使用的是 cygwin,这可能意味着 Windows。您使用的是什么编译器标志?如果是
-O0,那么res可能被放入堆栈。 And GCC has a stack alignment problem that has made AVX unusable on Windows since antiquity. -
@Mysticial 我同意这不太可能是段错误的原因。因此,我只是将其作为评论发布(当然,我本可以更清楚地表明这可能是无关的)。