gpt4 book ai didi

c++ - 使用带有自定义对齐分配器实现的最新 g++ 使用 SSE 和 -O3 选项编译时出现非法指令(核心转储)

转载 作者:IT王子 更新时间:2023-10-29 00:35:07 24 4
gpt4 key购买 nike

当使用 g++ (GCC) 4.8.3 20140911 (Red Hat 4.8.3-7) 编译以下代码时,使用编译命令 "g++ -g -fno-omit-frame-pointer -msse2 -mssse3 - O3 Memory.cpp”,可执行文件在执行时引发“非法指令(核心转储)”。

它使用与旧版 g++ 完全相同的编译器标志编译和运行没有问题。当编译器标志“-mssse3 -O3”被删除或替换为较低的优化级别(例如“-O2”)时,它也可以毫无问题地编译和运行。

如果同时使用旧版和新版 g++ 编译器,需要编译器标志“-msse2 -mssse3 -O3”,并且需要可移植的对齐内存分配器,那么存在哪些选项?以下代码中是否存在可以轻松修复的简单错误?最后,为什么会出现这个错误?

使用 gdb 时,触发此错误的行是:“memory[i] = (unsigned char)i;”。

提前致谢。

#include <iostream>
using std::cerr;
using std::cout;
using std::endl;
using std::flush;
#include <stdlib.h>

void *aligned_alloc(int alignment, int size){
const int pointer_size = sizeof(unsigned char *);
const int requested_size = size + alignment - 1 + pointer_size;
unsigned char *base = (unsigned char *)malloc(requested_size);
if (base == NULL) return NULL;
unsigned char *start = base + pointer_size;
const int trim_offset = (int)(((unsigned long long)(start+alignment-1)) & (alignment-1));
unsigned char *aligned = start + alignment - 1 - trim_offset;
*(unsigned char **)(aligned-pointer_size) = base;
return aligned;
}
void aligned_free(void **aligned){
if (*aligned == NULL) return;
unsigned char *base = *(unsigned char **)((unsigned char *)(*aligned) - sizeof(unsigned char *));
free(base);
*aligned = NULL;
}

int main(){
unsigned char *memory = (unsigned char *)aligned_alloc(16, 120);
if (memory == NULL){
cout<<"ERROR: Unable to allocate memory."<<endl;
exit(1);
}

for (int i=0; i<120; i++){
memory[i] = (unsigned char)i;
}

aligned_free((void **)&memory);

return 0;
}

最佳答案

这是由于不支持 SSSE3(补充流式 SIMD 扩展 3)指令子集(特别是某种风格的 3GHZ P4)的 CPU 试图运行为支持该指令子集的 CPU 编译的代码;只需从 GCC 命令行中删除 -mssse3 标志就足以使违规指令消失。

关于c++ - 使用带有自定义对齐分配器实现的最新 g++ 使用 SSE 和 -O3 选项编译时出现非法指令(核心转储),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26902968/

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