找回密码
 注册
查看: 7150|回复: 1

(原创)GotoBLAS+hpl测试之安装

[复制链接]
发表于 2007-12-30 21:53:17 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
前面讲了atlas+hpl的安装,测试了一下,效率不是很理想。传闻使用Goto blas库测得的效率略理想一些,于是今天试了一下,安装成功。将过程贴出来供大家讨论。
GotoBLAS之编译:
1、 到 http://www.tacc.utexas.edu/resources/software/ 网站上下载 Source Code v.1.00或者其他版本,我用的是Source Code v.1.00,网站需要注册,不过是免费的,很快就可以搞定。
2、用 tar -zxvf 解压之,可以看到GotoBLAS的文件夹
3、编辑Makefile.rule,详细情况见附件;更改getarch.c里面的archtecture,使之符合自己的情况
4、make
5、cd exports 执行make so
6、新编辑xerbla.c,内容见附件二,执行gcc -c xerbla.c -o xerbla.o
在GotoBLAS下可以看到libgoto.a,libgoto_opteronp-r1.00.a,libgoto_opteronp-r1.00.so,xerbla.o几个新东西,表明编译成功。
附件一:Makefile.rule
#
#  Beginning of user configuration
#
# This library';s version
REVISION = -r1.00
# Which do you prefer to use for C compiler? Default is gcc.
# I recommend you to use GCC because inline assembler is required.
C_COMPILER = GNU
# C_COMPILER = INTEL
# Which do you prefer to use for C compiler? Default is GNU G77.
# F_COMPILER = G77
# F_COMPILER = G95
# F_COMPILER = GFORTRAN
# F_COMPILER = INTEL
# F_COMPILER = PGI
# F_COMPILER = PATHSCALE
# F_COMPILER = IBM
# F_COMPILER = COMPAQ
# F_COMPILER = SUN
# F_COMPILER = F2C
# If you want to build threaded version.
# You can specify number of threads by environment value
# "OMP_NUM_THREADS", otherwise, it';s automatically detected.
SMP = 2
# You may specify Maximum number of threads. It should be minimum.
MAX_THREADS = 2
# If you need 64bit binary; some architecture can accept both 32bit and
# 64bit binary(EM64T, Opteron, SPARC and Power/PowerPC).
BINARY64  = 1
# If you need 64bit integer interface.
INTERFACE64 = 1
# If you need Special memory management;
# Using HugeTLB file system(Linux / AIX / Solaris)
CCOMMON_OPT+= -DALLOC_HUGETLB
# Using static allocation instead of dynamic allocation
# CCOMMON_OPT+= -DALLOC_STATIC
# If you want to use CPU affinity
CCOMMON_OPT+= -DUSE_CPU_AFFINITY
# If you want to use memory affinity (for NUMA)
# CCOMMON_OPT+= -DUSE_MEMORY_AFFINITY
# If you have special compiler to run script to determine architecture.
GETARCH_CC =
GETARCH_FLAGS =
#
#  End of user configuration
#
MACHINE := $(shell uname -m | sed -e s/i.86/i386/ )
OSNAME  := $(shell uname -s)
ifeq ($(MACHINE), i386)
BINARY64=
NATIVEARCH= YES
endif
ifeq ($(MACHINE), ia64)
BINARY64= YES
NATIVEARCH= YES
endif
ifeq ($(MACHINE), alpha)
BINARY64= YES
NATIVEARCH= YES
endif
ifeq ($(OSNAME), AIX)
NATIVEARCH= YES
endif
ifeq ($(OSNAME), Darwin)
ifndef BINARY64
NATIVEARCH= YES
endif
endif
# If you need to access over 4GB chunk on 64bit system.
ifdef BINARY64
CCOMMON_OPT+= -D__64BIT__
ifdef INTERFACE64
CCOMMON_OPT+= -DUSE64BITINT
endif
endif
# If you need modified GEMV/GEMM to find best parameters;
# CCOMMON_OPT += -DPARAMTEST
# CCOMMON_OPT += -DPREFETCHTEST
# Common Optimization Flag
COMMON_OPT +=  -O2
# Optimization Flag for C compiler
CCOMMON_OPT +=
# Optimization Flag for Fortran Compiler
FCOMMON_OPT +=
# Profiling flags
COMMON_PROF = -pg
################## End of Main Configuration #####################
# TO suppress recursive includes
INCLUDED = 1
ifndef C_COMPILER
C_COMPILER    = GNU
endif
ifndef F_COMPILER
F_COMPILER = G77
endif
ifeq ($(C_COMPILER), GNU)
COMPILER     = gcc
CCOMMON_OPT += -Wall
ifneq ($(OSNAME), CYGWIN_NT-5.1)
CCOMMON_OPT += -fPIC
endif
ifndef NATIVEARCH
ifdef BINARY64
CCOMMON_OPT     += -m64
GETARCH_FLAGS = -m64
else
CCOMMON_OPT     += -m32
GETARCH_FLAGS = -m32
endif
endif
COMMON_PROF += -fno-inline
endif
ifeq ($(C_COMPILER), INTEL)
COMPILER     = icc
CCOMMON_OPT += -fPIC
endif
ifeq ($(F_COMPILER), G77)
COMPILER_F77 = g77
BU     = _
CCOMMON_OPT += -DF_INTERFACE_F2C -DNEED_F2CCONV
FCOMMON_OPT += -Wall
ifneq ($(OSNAME), CYGWIN_NT-5.1)
FCOMMON_OPT += -fPIC
endif
ifndef NATIVEARCH
ifdef BINARY64
FCOMMON_OPT += -m64
else
FCOMMON_OPT += -m32
endif
endif
endif
ifeq ($(F_COMPILER), G95)
COMPILER_F77 = g95
BU     = _
CCOMMON_OPT += -DF_INTERFACE_F2C
FCOMMON_OPT += -Wall
ifneq ($(OSNAME), CYGWIN_NT-5.1)
FCOMMON_OPT += -fPIC
endif
ifndef NATIVEARCH
ifdef BINARY64
FCOMMON_OPT += -m64
else
FCOMMON_OPT += -m32
endif
endif
endif
ifeq ($(F_COMPILER), GFORTRAN)
COMPILER_F77 = gfortran
BU     = _
CCOMMON_OPT += -DF_INTERFACE_GFORT
FCOMMON_OPT += -Wall
ifneq ($(OSNAME), CYGWIN_NT-5.1)
FCOMMON_OPT += -fPIC
endif
ifndef NATIVEARCH
ifdef BINARY64
FCOMMON_OPT += -m64
else
FCOMMON_OPT += -m32
endif
endif
endif
ifeq ($(F_COMPILER), INTEL)
COMPILER_F77 = ifort
BU     = _
CCOMMON_OPT += -DF_INTERFACE_F2C
FCOMMON_OPT += -fPIC
ifdef INTERFACE64
FCOMMON_OPT += -i8
endif
endif
ifeq ($(F_COMPILER), IBM)
COMPILER_F77 = xlf
BU     =
# FCOMMON_OPT+= -qarch=440
ifdef BINARY64
FCOMMON_OPT += -q64
else
FCOMMON_OPT += -q32
endif
endif
ifeq ($(F_COMPILER), COMPAQ)
ifeq ($(OSNAME), Linux)
COMPILER_F77 = fort
FCOMMON_OPT += -fPIC
else
COMPILER_F77 = f77
endif
BU     = _
endif
ifeq ($(F_COMPILER), PGI)
COMPILER_F77 = pgf77
BU      = _
CCOMMON_OPT  += -DF_INTERFACE_F2C
FCOMMON_OPT += -fPIC
COMMON_PROF +=  -DPGICOMPILER
ifndef BINARY64
# FCOMMON_OPT  += -tp k8-32
FCOMMON_OPT += -tp p7
EXTRALIB    += -L/opt/pgi/linux86/6.0/lib -lpgc
else
FCOMMON_OPT += -tp k8-64
EXTRALIB    += -L/opt/pgi/linux86-64/6.0/lib -lpgc -lpgf90rtl
ifdef INTERFACE64
FCOMMON_OPT += -i8
endif
endif
endif
ifdef SMP
EXTRALIB    += -lpthread
endif
ifeq ($(F_COMPILER), PATHSCALE)
COMPILER_F77 = pathf90
BU= _
CCOMMON_OPT  += -DAMD_ABI -DF_PATHSCALE
FCOMMON_OPT += -fPIC
ifndef BINARY64
CCOMMON_OPT  += -DF_INTERFACE_F2C
FCOMMON_OPT += -m32
else
FCOMMON_OPT += -m64
ifdef INTERFACE64
FCOMMON_OPT += -i8
endif
endif
endif
ifeq ($(F_COMPILER), SUN)
COMPILER_F77 = f90
BU     = _
CCOMMON_OPT  += -DF_SUN
FCOMMON_OPT += -pic
ifndef BINARY64
CCOMMON_OPT  += -DF_INTERFACE_F2C
endif
endif
ifeq ($(F_COMPILER), F2C)
COMPILER_F77 = f2cf77
BU     = _
CCOMMON_OPT += -DF_INTERFACE_F2C -DNEED_F2CCONV
FCOMMON_OPT += -Wall -fPIC
endif
# Currently Windows version doesn';t support threads
ifeq ($(OSNAME), CYGWIN_NT-5.1)
SMP =
endif
ifdef SMP
CCOMMON_OPT+= -DSMP_SERVER
ifeq ($(C_COMPILER), GNU)
ifeq ($(OSNAME), Linux)
CCOMMON_OPT+=  -pthread
endif
endif
endif
ifndef GETARCH_CC
GETARCH_CC = gcc
endif
ARCH        := $(shell (cd $(TOPDIR); ./getarch 0 $(GETARCH_CC) $(GETARCH_FLAGS)))
SUBARCH     := $(shell (cd $(TOPDIR); ./getarch 1 $(GETARCH_CC) $(GETARCH_FLAGS)))
ARCHSUBDIR  := $(shell (cd $(TOPDIR); ./getarch 2 $(GETARCH_CC) $(GETARCH_FLAGS)))
CONFIG      := $(shell (cd $(TOPDIR); ./getarch 3 $(GETARCH_CC) $(GETARCH_FLAGS)))
FU          := $(shell (cd $(TOPDIR); ./getarch 4 $(GETARCH_CC) $(GETARCH_FLAGS)))
LIBSUBARCH  := $(shell (cd $(TOPDIR); ./getarch 5 $(GETARCH_CC) $(GETARCH_FLAGS)))
CORE        := $(shell (cd $(TOPDIR); ./getarch 6 $(GETARCH_CC) $(GETARCH_FLAGS)))
ifndef MAX_THREADS
MAX_THREADS := $(shell (cd $(TOPDIR); ./getarch 7 $(GETARCH_CC) $(GETARCH_FLAGS)))
endif
CCOMMON_OPT+= -DMAX_CPU_NUMBER=$(MAX_THREADS)

LIBPREFIX = libgoto
ARFLAGS=
CPP= $(CC) -E
AR= $(COMPILER_PREFIX)ar
AS= $(COMPILER_PREFIX)as
LD= $(COMPILER_PREFIX)ld
RANLIB= $(COMPILER_PREFIX)ranlib
include $(TOPDIR)/Makefile.$(ARCHSUBDIR)
CCOMMON_OPT+= -DASMNAME=$(FU)$(*F) -DASMFNAME=$(FU)$(*F)$(BU) -DNAME=$(*F)$(BU) -DCNAME=$(*F)
ifeq ($(CORE), PPC440)
CCOMMON_OPT+= -DALLOC_QALLOC
endif
ifeq ($(CORE), PPC440FP2)
CCOMMON_OPT+= -DALLOC_STATIC
endif
ifeq ($(FU), _)
CCOMMON_OPT+= -DFUNDERSCORE=$(FU) -DNEEDFUNDERSCORE
endif
ifeq ($(BU), _)
CCOMMON_OPT+= -DBUNDERSCORE=$(BU) -DNEEDBUNDERSCORE
endif
CFLAGS  = $(COMMON_OPT) $(CCOMMON_OPT) -I$(TOPDIR) $(CONFIG)
PFLAGS  = $(COMMON_OPT) $(CCOMMON_OPT) -I$(TOPDIR) $(CONFIG) -DPROFILE $(COMMON_PROF)
# FFLAGS  += $(COMMON_OPT) $(FCOMMON_OPT) $(CONFIG)
FFLAGS  += $(COMMON_OPT) $(FCOMMON_OPT)
FPFLAGS = $(COMMON_OPT) $(FCOMMON_OPT) $(COMMON_PROF)
ifndef SMP
LIBNAME= $(LIBPREFIX)_$(LIBSUBARCH)$(REVISION).a
LIBNAME_P= $(LIBPREFIX)_$(LIBSUBARCH)$(REVISION)_p.a
else
LIBNAME= $(LIBPREFIX)_$(LIBSUBARCH)p$(REVISION).a
LIBNAME_P= $(LIBPREFIX)_$(LIBSUBARCH)p$(REVISION)_p.a
endif
LIBSONAME    = $(LIBNAME:.a=.so)
LIBDLLNAME   = $(LIBNAME:.a=.dll)
LIBDYNNAME   = $(LIBNAME:.a=.dylib)
LIBWIN2KNAME = $(LIBNAME:.a=.lib)
LIBDEFNAME   = $(LIBNAME:.a=.def)
LIBEXPNAME   = $(LIBNAME:.a=.exp)
LIBZIPNAME   = $(LIBNAME:.a=.zip)
LIBS= $(TOPDIR)/$(LIBNAME)
LIBS_P= $(TOPDIR)/$(LIBNAME_P)
ifndef SMP
LIBPTHREAD=
else
LIBPTHREAD= -lpthread
endif
CC= $(COMPILER_PREFIX)$(COMPILER)
FC= $(COMPILER_PREFIX)$(COMPILER_F77)
.SUFFIXES: .po .o .f
.f.o:
&#36;(FC) &#36;(FFLAGS) -c &#36;<
.f.po:
&#36;(FC) &#36;(FPFLAGS) -pg -c &#36;<
附件二:xerbla.c&#35;include <stdio.h>
&#35;include <stdlib.h>
int xerbla_(char *message, int *info, long length){
  fprintf(stderr, " ** On entry to  %6s, parameter number %2d had an illegal value\n", message, *info);
exit(1);
}
现在紧接着安装hpl,解压方式和以前的一样
1、编辑Makefile,使arch = Linux_PII_Goto
2、新建并编辑Make.Linux_PII_Goto,使内容和附件一致,注意位置和自己机器相符
3、make
4、如无错误,在bin下的Linux_PII_Goto就有HPL.at和xhpl

附件:
&#35;  
&#35;  -- High Performance Computing Linpack Benchmark (HPL)               
&#35;     HPL - 1.0a - January 20, 2004                          
&#35;     Antoine P. Petitet                                                
&#35;     University of Tennessee, Knoxville                                
&#35;     Innovative Computing Laboratories                                 
&#35;     (C) Copyright 2000-2004 All Rights Reserved                       
&#35;                                                                       
&#35;  -- Copyright notice and Licensing terms:                             
&#35;                                                                       
&#35;  Redistribution  and  use in  source and binary forms, with or without
&#35;  modification, are  permitted provided  that the following  conditions
&#35;  are met:                                                            
&#35;                                                                       
&#35;  1. Redistributions  of  source  code  must retain the above copyright
&#35;  notice, this list of conditions and the following disclaimer.        
&#35;                                                                       
&#35;  2. Redistributions in binary form must reproduce  the above copyright
&#35;  notice, this list of conditions,  and the following disclaimer in the
&#35;  documentation and/or other materials provided with the distribution.
&#35;                                                                       
&#35;  3. All  advertising  materials  mentioning  features  or  use of this
&#35;  software must display the following acknowledgement:                 
&#35;  This  product  includes  software  developed  at  the  University  of
&#35;  Tennessee, Knoxville, Innovative Computing Laboratories.            
&#35;                                                                       
&#35;  4. The name of the  University,  the name of the  Laboratory,  or the
&#35;  names  of  its  contributors  may  not  be used to endorse or promote
&#35;  products  derived   from   this  software  without  specific  written
&#35;  permission.                                                         
&#35;                                                                       
&#35;  -- Disclaimer:                                                      
&#35;                                                                       
&#35;  THIS  SOFTWARE  IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
&#35;  ``AS IS';'; AND ANY EXPRESS OR IMPLIED WARRANTIES,  INCLUDING,  BUT NOT
&#35;  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
&#35;  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE UNIVERSITY
&#35;  OR  CONTRIBUTORS  BE  LIABLE FOR ANY  DIRECT,  INDIRECT,  INCIDENTAL,
&#35;  SPECIAL,  EXEMPLARY,  OR  CONSEQUENTIAL DAMAGES  (INCLUDING,  BUT NOT
&#35;  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
&#35;  DATA OR PROFITS; OR BUSINESS INTERRUPTION)  HOWEVER CAUSED AND ON ANY
&#35;  THEORY OF LIABILITY, WHETHER IN CONTRACT,  STRICT LIABILITY,  OR TORT
&#35;  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
&#35;  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
&#35; &#35;&#35;&#35;&#35;&#35;&#35;&#35;&#35;&#35;&#35;&#35;&#35;&#35;&#35;&#35;&#35;&#35;&#35;&#35;&#35;&#35;&#35;&#35;&#35;&#35;&#35;&#35;&#35;&#35;&#35;&#35;&#35;&#35;&#35;&#35;&#35;&#35;&#35;&#35;&#35;&#35;&#35;&#35;&#35;&#35;&#35;&#35;&#35;&#35;&#35;&#35;&#35;&#35;&#35;&#35;&#35;&#35;&#35;&#35;&#35;&#35;&#35;&#35;&#35;&#35;&#35;&#35;&#35;&#35;&#35;
&#35;  
&#35; ----------------------------------------------------------------------
&#35; - shell --------------------------------------------------------------
&#35; ----------------------------------------------------------------------
&#35;
SHELL        = /bin/sh
&#35;
CD           = cd
CP           = cp
LN_S         = ln -s
MKDIR        = mkdir
RM           = /bin/rm -f
TOUCH        = touch
&#35;
&#35; ----------------------------------------------------------------------
&#35; - Platform identifier ------------------------------------------------
&#35; ----------------------------------------------------------------------
&#35;
ARCH         = Linux_PII_Goto
&#35;
&#35; ----------------------------------------------------------------------
&#35; - HPL Directory Structure / HPL library ------------------------------
&#35; ----------------------------------------------------------------------
&#35;
TOPdir       = &#36;(HOME)/hpl
INCdir       = &#36;(TOPdir)/include
BINdir       = &#36;(TOPdir)/bin/&#36;(ARCH)
LIBdir       = &#36;(TOPdir)/lib/&#36;(ARCH)
&#35;
HPLlib       = &#36;(LIBdir)/libhpl.a
&#35;
&#35; ----------------------------------------------------------------------
&#35; - Message Passing library (MPI) --------------------------------------
&#35; ----------------------------------------------------------------------
&#35; MPinc tells the  C  compiler where to find the Message Passing library
&#35; header files,  MPlib  is defined  to be the name of  the library to be
&#35; used. The variable MPdir is only used for defining MPinc and MPlib.
&#35;
MPdir        =
MPinc        =
MPlib        =
&#35;
&#35; ----------------------------------------------------------------------
&#35; - Linear Algebra library (BLAS or VSIPL) -----------------------------
&#35; ----------------------------------------------------------------------
&#35; LAinc tells the  C  compiler where to find the Linear Algebra  library
&#35; header files,  LAlib  is defined  to be the name of  the library to be
&#35; used. The variable LAdir is only used for defining LAinc and LAlib.
&#35;
LAdir        = &#36;(HOME)/GotoBLAS
LAinc        =
LAlib        = &#36;(LAdir)/libgoto_opteronp-r1.00.so &#36;(LAdir)/xerbla.o
&#35;
&#35; ----------------------------------------------------------------------
&#35; - F77 / C interface --------------------------------------------------
&#35; ----------------------------------------------------------------------
&#35; You can skip this section  if and only if  you are not planning to use
&#35; a  BLAS  library featuring a Fortran 77 interface.  Otherwise,  it  is
&#35; necessary  to  fill out the  F2CDEFS  variable  with  the  appropriate
&#35; options.  **One and only one**  option should be chosen in **each** of
&#35; the 3 following categories:
&#35;
&#35; 1) name space (How C calls a Fortran 77 routine)
&#35;
&#35; -DAdd_              : all lower case and a suffixed underscore  (Suns,
&#35;                       Intel, ...),                           [default]
&#35; -DNoChange          : all lower case (IBM RS6000),
&#35; -DUpCase            : all upper case (Cray),
&#35; -DAdd__             : the FORTRAN compiler in use is f2c.
&#35;
&#35; 2) C and Fortran 77 integer mapping
&#35;
&#35; -DF77_INTEGER=int   : Fortran 77 INTEGER is a C int,         [default]
&#35; -DF77_INTEGER=long  : Fortran 77 INTEGER is a C long,
&#35; -DF77_INTEGER=short : Fortran 77 INTEGER is a C short.
&#35;
&#35; 3) Fortran 77 string handling
&#35;
&#35; -DStringSunStyle    : The string address is passed at the string loca-
&#35;                       tion on the stack, and the string length is then
&#35;                       passed as  an  F77_INTEGER  after  all  explicit
&#35;                       stack arguments,                       [default]
&#35; -DStringStructPtr   : The address  of  a  structure  is  passed  by  a
&#35;                       Fortran 77  string,  and the structure is of the
&#35;                       form: struct {char *cp; F77_INTEGER len;},
&#35; -DStringStructVal   : A structure is passed by value for each  Fortran
&#35;                       77 string,  and  the  structure is  of the form:
&#35;                       struct {char *cp; F77_INTEGER len;},
&#35; -DStringCrayStyle   : Special option for  Cray  machines,  which  uses
&#35;                       Cray  fcd  (fortran  character  descriptor)  for
&#35;                       interoperation.
&#35;
F2CDEFS      =
&#35;
&#35; ----------------------------------------------------------------------
&#35; - HPL includes / libraries / specifics -------------------------------
&#35; ----------------------------------------------------------------------
&#35;
HPL_INCLUDES = -I&#36;(INCdir) -I&#36;(INCdir)/&#36;(ARCH) &#36;(LAinc) &#36;(MPinc)
HPL_LIBS     = &#36;(HPLlib) &#36;(LAlib) &#36;(MPlib)
&#35;
&#35; - Compile time options -----------------------------------------------
&#35;
&#35; -DHPL_COPY_L           force the copy of the panel L before bcast;
&#35; -DHPL_CALL_CBLAS       call the cblas interface;
&#35; -DHPL_CALL_VSIPL       call the vsip  library;
&#35; -DHPL_DETAILED_TIMING  enable detailed timers;
&#35;
&#35; By default HPL will:
&#35;    *) not copy L before broadcast,
&#35;    *) call the BLAS Fortran 77 interface,
&#35;    *) not display detailed timing information.
&#35;
HPL_OPTS     =
&#35;
&#35; ----------------------------------------------------------------------
&#35;
HPL_DEFS     = &#36;(F2CDEFS) &#36;(HPL_OPTS) &#36;(HPL_INCLUDES)
&#35;
&#35; ----------------------------------------------------------------------
&#35; - Compilers / linkers - Optimization flags ---------------------------
&#35; ----------------------------------------------------------------------
&#35;
&#35;CC           = /usr/bin/gcc
CC           =mpicc
CCNOOPT      = &#36;(HPL_DEFS)
CCFLAGS      = &#36;(HPL_DEFS) -fomit-frame-pointer -O3 -funroll-loops
&#35;
&#35; On some platforms,  it is necessary  to use the Fortran linker to find
&#35; the Fortran internals used in the BLAS library.
&#35;
&#35;LINKER       = /usr/bin/g77
LINKER        =mpicc
LINKFLAGS    = &#36;(CCFLAGS) -lm
&#35;
ARCHIVER     = ar
ARFLAGS      = r
RANLIB       = echo
&#35;
&#35; ----------------------------------------------------------------------
 楼主| 发表于 2007-12-30 21:58:35 | 显示全部楼层

(原创)GotoBLAS+hpl测试之安装

前面看见人发了个文档,我把我以前写的文章抄过来,一般照着做就可以,也可参考博客
http://onetfbao.spaces.live.com
应该是2007年6月份的文档了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表