SPEC2006


SPEC2006常见用法和问题
==================

安装步骤

1
2
3
4
# 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核心数(包括超线程技术):

    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
  • 进入的头文件若是系统库,则不需要具体路径

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

  • 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
    13
      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"
Limin Wang wechat
Welcome!
I'm happy it's useful to you!
Show comments from Gitment