spec: abstract runcpu to a library
This commit is contained in:
@@ -1,13 +1,17 @@
|
|||||||
import assert from 'assert';
|
import assert from 'assert';
|
||||||
import { ChildProcessByStdio, spawn } from 'child_process';
|
import { ChildProcessByStdio, spawn } from 'child_process';
|
||||||
|
import crypto from 'crypto';
|
||||||
import * as fs from "fs";
|
import * as fs from "fs";
|
||||||
import * as path from 'path';
|
import * as path from 'path';
|
||||||
import { createInterface } from 'readline';
|
import { createInterface } from 'readline';
|
||||||
import { Readable, Writable } from 'stream';
|
import { Readable, Writable } from 'stream';
|
||||||
import { promisify } from "util";
|
import { promisify } from "util";
|
||||||
import specTemplate from '../../assets/specTemplate.cfg';
|
import specTemplate from '../../assets/specTemplate.cfg';
|
||||||
|
import { sw64TargetOptions } from '../commands/compiler.js';
|
||||||
import { RunCPUOptions, runcpuOptions } from '../commands/spec.js';
|
import { RunCPUOptions, runcpuOptions } from '../commands/spec.js';
|
||||||
import { SPECBenchData, benchpath, buildpath, exepath } from './benchData.js';
|
import * as sunway from '../sunway.js';
|
||||||
|
import { cflangLibs, toolchain, ToolchainSuite } from '../toolchain/index.js';
|
||||||
|
import { benchpath, buildpath, exepath, SPECBenchData } from './benchData.js';
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -242,3 +246,131 @@ export async function spawnSPECWithID(
|
|||||||
...runcpuConfig,
|
...runcpuConfig,
|
||||||
}), { env: spec.getEnvironment() });
|
}), { env: spec.getEnvironment() });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
interface SPECRunOptions {
|
||||||
|
compilerPrefix: string;
|
||||||
|
compilerSuite: 'llvm' | 'gcc';
|
||||||
|
workload?: 'test' | 'train' | 'ref';
|
||||||
|
optimizeProfile: 'O2' | 'base' | 'openmp';
|
||||||
|
allowMisaligned?: boolean;
|
||||||
|
spec: string;
|
||||||
|
output: string;
|
||||||
|
platform?: '8a' | '6b' | 'host';
|
||||||
|
benchmarks?: string[];
|
||||||
|
action?: 'build' | 'buildstep' | 'validate' | 'runsetup';
|
||||||
|
buildType?: 'nobuild' | 'rebuild';
|
||||||
|
simd: boolean;
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function runSPEC({
|
||||||
|
compilerPrefix,
|
||||||
|
compilerSuite,
|
||||||
|
workload = 'ref',
|
||||||
|
optimizeProfile,
|
||||||
|
allowMisaligned = false,
|
||||||
|
spec,
|
||||||
|
output,
|
||||||
|
platform = 'host',
|
||||||
|
benchmarks = ['intspeed', 'fpspeed'],
|
||||||
|
action = 'validate',
|
||||||
|
buildType = 'rebuild',
|
||||||
|
simd
|
||||||
|
}: SPECRunOptions) {
|
||||||
|
// Determine platform configuration
|
||||||
|
const sunwayGeneration = platform === "host"
|
||||||
|
? sunway.getHostGeneration()
|
||||||
|
: platform as sunway.SunwayGeneration;
|
||||||
|
|
||||||
|
const sysrootFlag = sunwayGeneration === "6b"
|
||||||
|
? ["--sysroot", "/usr/sw/standard-830-6b-test/"]
|
||||||
|
: [];
|
||||||
|
|
||||||
|
// Generate unique ID for this run
|
||||||
|
const uuid = crypto.randomUUID();
|
||||||
|
const prefix = path.resolve(compilerPrefix);
|
||||||
|
|
||||||
|
// Define optimization profiles
|
||||||
|
const optimizeProfiles = {
|
||||||
|
base: [
|
||||||
|
"-O3",
|
||||||
|
"-flto=thin",
|
||||||
|
],
|
||||||
|
openmp: [
|
||||||
|
"-O3",
|
||||||
|
"-flto=thin",
|
||||||
|
"-DSPEC_OPENMP",
|
||||||
|
"-fopenmp",
|
||||||
|
],
|
||||||
|
O2: [
|
||||||
|
"-O2",
|
||||||
|
]
|
||||||
|
};
|
||||||
|
|
||||||
|
// Select optimizations based on profile
|
||||||
|
const optimizeFlags = optimizeProfiles[optimizeProfile as keyof typeof optimizeProfiles];
|
||||||
|
|
||||||
|
// Create SPEC process runner
|
||||||
|
const specInstance = mkSPEC(path.resolve(spec));
|
||||||
|
|
||||||
|
// Handle misaligned memory access flag
|
||||||
|
const sw64UnalignedFlag = "-sw64-allows-misaligned-memory-accesses";
|
||||||
|
|
||||||
|
// Add special flags for specific optimizations
|
||||||
|
function getSpecialFlags() {
|
||||||
|
if (optimizeProfile === "base") {
|
||||||
|
return [
|
||||||
|
"648.exchange2_s:",
|
||||||
|
" EXTRA_OPTIMIZE = -mllvm -enable-ipsccp-pass",
|
||||||
|
" EXTRA_LDFLAGS = -Wl,-mllvm,-enable-ipsccp-pass",
|
||||||
|
].join("\n");
|
||||||
|
}
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
// Spawn SPEC process with configuration
|
||||||
|
const specProc = await spawnSPECWithID(
|
||||||
|
specInstance,
|
||||||
|
{
|
||||||
|
optimize: [
|
||||||
|
...optimizeFlags,
|
||||||
|
...(allowMisaligned ? ["-mllvm", sw64UnalignedFlag] : []),
|
||||||
|
...sw64TargetOptions({ simd }),
|
||||||
|
...sysrootFlag,
|
||||||
|
...(compilerSuite === "llvm" ? [sunway.mcpu(sunwayGeneration)] : []),
|
||||||
|
],
|
||||||
|
ldflags: [
|
||||||
|
`-L${path.resolve(prefix, 'lib')}`,
|
||||||
|
...optimizeFlags,
|
||||||
|
"-fuse-ld=lld",
|
||||||
|
'-static',
|
||||||
|
...sysrootFlag,
|
||||||
|
...(["base", "openmp"].includes(optimizeProfile)
|
||||||
|
? [
|
||||||
|
...(simd ? ["-Wl,-plugin-opt,-mattr=+simd"] : []),
|
||||||
|
...(allowMisaligned ? [`-Wl,-plugin-opt,${sw64UnalignedFlag}`] : []),
|
||||||
|
...(sunwayGeneration === "8a" ? ["-Wl,-plugin-opt,-mattr=+core4"] : []),
|
||||||
|
]
|
||||||
|
: []
|
||||||
|
),
|
||||||
|
],
|
||||||
|
compilerPaths: toolchain(compilerPrefix, compilerSuite as ToolchainSuite),
|
||||||
|
libs: compilerSuite === "llvm" ? cflangLibs(prefix) : [],
|
||||||
|
specialFlags: getSpecialFlags(),
|
||||||
|
openmp: {
|
||||||
|
threads: optimizeProfile === "openmp" ? 64 : 1,
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
setprocgroup: true,
|
||||||
|
workload: workload as RunCPUOptions["workload"],
|
||||||
|
buildType: buildType as RunCPUOptions["buildType"],
|
||||||
|
benchmarks: benchmarks as RunCPUOptions["benchmarks"],
|
||||||
|
action: action as RunCPUOptions["action"],
|
||||||
|
},
|
||||||
|
output,
|
||||||
|
uuid
|
||||||
|
);
|
||||||
|
|
||||||
|
// Get and return performance ratios
|
||||||
|
return getBaseRatios(specProc);
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user