加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 使用带有自定义对齐分配器实现的最新g编译SSE和-O3选项时的

发布时间:2020-12-16 07:10:14 所属栏目:百科 来源:网络整理
导读:当使用g(GCC)4.8.3 20140911(Red Hat 4.8.3-7)使用编译命令“g -g -fno-omit-frame-pointer -msse2 -mssse3 -O3 Memory”编译以下代码时. cpp“,可执行文件在执行时引发”非法指令(核心转储)“. 它使用较旧的g版本使用相同的编译器标志编译并运行没有问题.当
当使用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;
}

解决方法

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读