SPEC2006

Posted 会打代码的扫地王大爷

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SPEC2006相关的知识,希望对你有一定的参考价值。

安装步骤

# Ubuntu16.04
# 注意安装gFortran
. ./install.sh
. ./shrc

        一般情况下经过以上步骤即可安装完毕,进行使用,注意需要执行shrc设置完环境变量以后才可正常执行后续的各种操作。

        此外SPEC官方并不建议使用root权限,因为所有的测试集并不需要修改系统文件。

常用命令

runspec int --noreportable --n=1 --size=test

  • 正式运行SPEC2006之前需要跑一下test尺寸,test尺寸比较小,因此跑起来耗时教短,可用于确保所有测试集都可正常编译运行。
  • int:表明这是整数测试集,这个参数也可用fp,all代替,分表表示只使用浮点测试集和所有测试集。
  • –noreportable 不生成报告 --reportable生成报告,若开启将会生成诸如html,pdf等格式的报告。
  • –n=1:表示只跑一轮,每个测试集只会跑一遍。若要生成报告,则至少跑3轮
  • –size=test:表示这次只跑少量集合,用于测试所有集合是否都已经编译执行正确

runspec int --reportable --size=ref -I

  • -I 表示跑benchmark的适合忽略错误,如果中途出错也不会停下来。
  • 如果没有指定rate和copies则为测试speed,speed只能测试单核性能。
  • 若想测试多核性能,则可通过 --rate=128进行指定,这里讲使用128个线程。
  • rate和speed指标的区别请看
    Q15. What is the difference between a “rate” and a “speed” metric?

如何检测自己的电脑是多少核心的呢?

  • 逻辑CPU核心数(包括超线程技术):
cat /proc/cpuinfo |grep "processor"|sort -u|wc -l
  • 物理CPU个数:
grep "physical id" /proc/cpuinfo|sort -u|wc -l 
或者
grep "physical id" /proc/cpuinfo|sort -u 
  • 每个物理CPU上的真实内核个数:
grep "cpu cores" /proc/cpuinfo|uniq
  • 每个物理CPU上逻辑内核个数:
grep "siblings" /proc/cpuinfo|uniq
  • 若每个核心上的逻辑内核比真实内核多,则说明开启了超线程技术
  • 来源Linux读取CPU信息

runspec 481 --noreportable --n=1

  • 有时候为了修复编译错误,可以让他单独跑481这一项

runspec -c xxx.cfg

  • -c用于指定配置文件,如果没有指定,则默认使用根目录的config文件夹下的default.cfg作为配置文件

常见错误

gcc5.x如何跑SPEC2006

  • 在无法通过的测试集的gcc编译选项上加 --std=gnu89

缺少库文件

  • 在gcc的编译选项上加 -include /usr/include/memory.h include 后面的路径需要换成自己的,这里只是举个例子

447.dealII 遇到 error: ‘ptrdiff_t’ does not name a type

  • linux下需要引入 头文件,使用上述方法在config文件中找到447.dealII的配置在CXXPORTABILITY后面加上 -include cstddef -include cstdlib -include cstring
  • 进入的头文件若是系统库,则不需要具体路径

spec2006 fp test failed with 416.gamess and 481.wrf

  • 416 miscompare 问题是gcc旧版本的bug,当开启O2优化的适合会出错
  • 升级新版本gcc或者用-O0进行编译或者换一个编译器
  • 483 end of file 问题,我是通过把配置文件中的wrf_data_header_size=8注释掉解决的

如果不幸需要自己编译工具链,可能会遇到更多奇怪的问题

Specmd5sum multiple definition of `getline’

  • Specmd5sum文件夹中的库文件跟系统库文件的函数冲突了,打开md5sum.c,注释掉#include "getline.h"

在perl中make时遇到 MAKE: *** NO RULE TO MAKE TARGET ‘<COMMAND-LINE>’

  • 这是因为gcc在高版本中改变了输出,以至于这里没有及时过滤掉,其实只要将makefile(注意不是Makefile)中<command-line>
    的那一行全删掉即可。
  • 这里有个问题是,buildtools每次编译都会将之前生成的东西清空,然后重新生成makefile文件,因此手工删除makefile中的会失败。
  • 于是自己随便在网上找了一段代码用于删除makefile文件中的’<command-line>’
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
void Delete(char* filepath, char str[])

	char buf[4096];    //每读取一行,都将内容放到该数组中
	FILE* fp = fopen(filepath, "r");     //filepath里是原内容 
 
	FILE* fpt = fopen("temp", "w");    //将filepath文件第n行内容删除后存入temp.txt中 
	
	while(!feof(fp)) 
	  
	   fgets(buf,sizeof(buf), fp);  
		if (!strstr(buf,str)) 
		      
		  fprintf(fpt, "%s", buf); 
                  printf("%s\\n",buf);
		
	 
	fclose(fp);
	fclose(fpt);
 
	fpt = fopen("temp", "r");
    fp = fopen(filepath, "w");
    fgets(buf, sizeof(buf), fpt);	
    while(!feof(fpt))
	
	   fprintf(fp, "%s", buf);
       fgets(buf, sizeof(buf), fpt);
	
 
	fclose(fp);
	fclose(fpt);
 

 
 
 
void main()
 
	Delete("x2p/makefile", "command");  
    Delete("makefile", "command"); 


  • 将上述代码另存为delete.c,置于工具链中的perl-5.8.7根目录下
  • 并修改buildtools中的shell脚本,如下打加号的部分
    DYLD_LIBRARY_PATH=`pwd`
    export LD_LIBRARY_PATH DYLD_LIBRARY_PATH
    ./Configure   -dOes -Ud_flock $PERLFLAGS -Ddosuid=undef -Dprefix=$INSTALLDIR -Dd_bincompat3=undef -A ldflags=-L$INSTALLDIR/lib -A ccflags=-I$INSTALLDIR/include -Ui_db -Ui_gdbm -Ui_ndbm -Ui_dbm -Uuse5005threads ; testordie "error configuring perl"
  
  +  gcc -o del delete.c
  +  ./del
  +  cd x2p
  +    $MYMAKE
  +  cd ../
  +  ./del

    $MYMAKE; testordie "error building perl"
    ./perl installperl; testordie "error installing perl"

Blog:Spec2006

以上是关于SPEC2006的主要内容,如果未能解决你的问题,请参考以下文章

SPEC CPU2006怎么用,http://www.spec.org/cpu2006/Docs/

perlbench 导致 SPEC 2006 线束之外的段错误

SPEC2006

SPEC2006

如何使用 SPEC CPU2006

SPEC CPU 2006的测试项目