diff options
author | Xianyi Zhang <traits.zhang@gmail.com> | 2011-01-24 14:54:24 +0000 |
---|---|---|
committer | Xianyi Zhang <traits.zhang@gmail.com> | 2011-01-24 14:54:24 +0000 |
commit | 342bbc3871d1b43f548e9d1ae9d380a1d4989cb3 (patch) | |
tree | 385fc6d27e282ae1bb06d685833c5325615c8169 /cpuid_power.c | |
download | openblas-342bbc3871d1b43f548e9d1ae9d380a1d4989cb3.tar.gz openblas-342bbc3871d1b43f548e9d1ae9d380a1d4989cb3.tar.bz2 openblas-342bbc3871d1b43f548e9d1ae9d380a1d4989cb3.zip |
Import GotoBLAS2 1.13 BSD version codes.
Diffstat (limited to 'cpuid_power.c')
-rw-r--r-- | cpuid_power.c | 190 |
1 files changed, 190 insertions, 0 deletions
diff --git a/cpuid_power.c b/cpuid_power.c new file mode 100644 index 000000000..46ff30a3a --- /dev/null +++ b/cpuid_power.c @@ -0,0 +1,190 @@ +/*********************************************************************/ +/* Copyright 2009, 2010 The University of Texas at Austin. */ +/* All rights reserved. */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* 1. Redistributions of source code must retain the above */ +/* copyright notice, this list of conditions and the following */ +/* disclaimer. */ +/* */ +/* 2. Redistributions in binary form must reproduce the above */ +/* copyright notice, this list of conditions and the following */ +/* disclaimer in the documentation and/or other materials */ +/* provided with the distribution. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE UNIVERSITY OF TEXAS AT */ +/* AUSTIN ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, */ +/* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF */ +/* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE */ +/* DISCLAIMED. IN NO EVENT SHALL THE UNIVERSITY OF TEXAS AT */ +/* AUSTIN OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, */ +/* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES */ +/* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE */ +/* GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR */ +/* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF */ +/* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT */ +/* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT */ +/* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE */ +/* POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/* The views and conclusions contained in the software and */ +/* documentation are those of the authors and should not be */ +/* interpreted as representing official policies, either expressed */ +/* or implied, of The University of Texas at Austin. */ +/*********************************************************************/ + +#include <sys/utsname.h> +#ifdef _AIX +#include <sys/vminfo.h> +#endif +#ifdef __APPLE__ +#include <mach/mach.h> +#include <mach/mach_host.h> +#include <mach/host_info.h> +#include <mach/machine.h> +#endif + +#define CPUTYPE_UNKNOWN 0 +#define CPUTYPE_POWER3 1 +#define CPUTYPE_POWER4 2 +#define CPUTYPE_PPC970 3 +#define CPUTYPE_POWER5 4 +#define CPUTYPE_POWER6 5 +#define CPUTYPE_CELL 6 +#define CPUTYPE_PPCG4 7 + +char *cpuname[] = { + "UNKNOWN", + "POWER3", + "POWER4", + "PPC970", + "POWER5", + "POWER6", + "CELL", + "PPCG4", +}; + +char *lowercpuname[] = { + "unknown", + "power3", + "power4", + "ppc970", + "power5", + "power6", + "cell", + "ppcg4", +}; + +char *corename[] = { + "UNKNOWN", + "POWER3", + "POWER4", + "POWER4", + "POWER4", + "POWER6", + "CELL", + "PPCG4", +}; + +int detect(void){ + +#ifdef linux + FILE *infile; + char buffer[512], *p; + + p = (char *)NULL; + infile = fopen("/proc/cpuinfo", "r"); + while (fgets(buffer, sizeof(buffer), infile)){ + if (!strncmp("cpu", buffer, 3)){ + p = strchr(buffer, ':') + 2; +#if 0 + fprintf(stderr, "%s\n", p); +#endif + break; + } + } + + fclose(infile); + + if (!strncasecmp(p, "POWER3", 6)) return CPUTYPE_POWER3; + if (!strncasecmp(p, "POWER4", 6)) return CPUTYPE_POWER4; + if (!strncasecmp(p, "PPC970", 6)) return CPUTYPE_PPC970; + if (!strncasecmp(p, "POWER5", 6)) return CPUTYPE_POWER5; + if (!strncasecmp(p, "POWER6", 6)) return CPUTYPE_POWER6; + if (!strncasecmp(p, "Cell", 4)) return CPUTYPE_CELL; + if (!strncasecmp(p, "7447", 4)) return CPUTYPE_PPCG4; + + return CPUTYPE_UNKNOWN; +#endif + +#ifdef _AIX + return CPUTYPE_POWER5; +#endif + +#ifdef __APPLE__ + host_basic_info_data_t hostInfo; + mach_msg_type_number_t infoCount; + + infoCount = HOST_BASIC_INFO_COUNT; + host_info(mach_host_self(), HOST_BASIC_INFO, (host_info_t)&hostInfo, &infoCount); + + if (hostInfo.cpu_subtype == CPU_SUBTYPE_POWERPC_7450) return CPUTYPE_PPCG4; + if (hostInfo.cpu_subtype == CPU_SUBTYPE_POWERPC_970) return CPUTYPE_PPC970; + + return CPUTYPE_PPC970; +#endif +} + +void get_architecture(void){ + printf("POWER"); +} + +void get_subdirname(void){ + printf("power"); +} + + +void get_subarchitecture(void){ + printf("%s", cpuname[detect()]); +} + +void get_cpuconfig(void){ +#if 0 +#ifdef _AIX + struct vminfo info; +#endif +#endif + + printf("#define %s\n", cpuname[detect()]); + printf("#define CORE_%s\n", corename[detect()]); + + printf("#define L1_DATA_SIZE 32768\n"); + printf("#define L1_DATA_LINESIZE 128\n"); + printf("#define L2_SIZE 524288\n"); + printf("#define L2_LINESIZE 128 \n"); + printf("#define DTB_ENTRIES 128\n"); + printf("#define DTB_SIZE 4096\n"); + printf("#define L2_ASSOCIATIVE 8\n"); + +#if 0 +#ifdef _AIX + if (vmgetinfo(&info, VMINFO, 0) == 0) { + if ((info.lgpg_size >> 20) >= 1024) { + printf("#define ALLOC_HUGETLB\n"); + } + } +#endif +#endif + +} + +void get_libname(void){ + printf("%s", lowercpuname[detect()]); +} + +char *get_corename(void){ + return cpuname[detect()]; +} |