SPEC2006常见用法和问题
==================
安装步骤
| 1 | # Ubuntu16.04 | 
一般情况下经过以上步骤即可安装完毕,进行使用,注意需要执行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核心数(包括超线程技术): - 1 - cat /proc/cpuinfo |grep "processor"|sort -u|wc -l 
- 物理CPU个数: - 1 - grep "physical id" /proc/cpuinfo|sort -u|wc -l 
或者
| 1 | grep "physical id" /proc/cpuinfo|sort -u | 
- 每个物理CPU上的真实内核个数: - 1 - grep "cpu cores" /proc/cpuinfo|uniq 
- 每个物理CPU上逻辑内核个数: - 1 - 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 
- 进入的头文件若是系统库,则不需要具体路径
- 416 miscompare 问题是gcc旧版本的bug,当开启O2优化的适合会出错
- 升级新版本gcc或者用-O0进行编译或者换一个编译器
- 483 end of file 问题,我是通过把配置文件中的1 
 2
 3
 4
 5
 6
 #### 如果不幸需要自己编译工具链,可能会遇到更多奇怪的问题
 > 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>‘ - 1 
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44- #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脚本,如下打加号的部分1 
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13DYLD_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"
 
     
          