Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenXiangShan
rust-xs-test
提交
dd5516e9
R
rust-xs-test
项目概览
OpenXiangShan
/
rust-xs-test
10 个月 前同步成功
通知
0
Star
1
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
R
rust-xs-test
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
dd5516e9
编写于
1月 18, 2021
作者:
H
hustccc
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
update main.rs
上级
dc5aa526
变更
5
隐藏空白更改
内联
并排
Showing
5 changed file
with
332 addition
and
152 deletion
+332
-152
src/main.rs
src/main.rs
+206
-138
xscommand/Cargo.toml
xscommand/Cargo.toml
+2
-1
xscommand/src/git.rs
xscommand/src/git.rs
+2
-2
xscommand/src/make.rs
xscommand/src/make.rs
+23
-3
xscommand/src/numactl.rs
xscommand/src/numactl.rs
+99
-8
未找到文件。
src/main.rs
浏览文件 @
dd5516e9
...
...
@@ -107,167 +107,235 @@ fn main() -> ! {
// }
let
workload
=
workload
.join
(
url2path
(
repo_url
));
// enter XiangShan and make init
{
let
stdout_f
=
workload
.join
(
"stdout.txt"
);
let
stderr_f
=
workload
.join
(
"stderr.txt"
);
let
mut
make
=
Make
::
new
(
"make"
);
make
.set_args
(
vec!
[
"init"
]);
match
make
.set_workdir
(
workload
.to_str
())
{
Ok
(
_
)
=>
{},
// do nothing
Err
(
make_err
)
=>
{
log
::
error!
(
"{}, thread {} exit"
,
make_err
.as_str
(),
thread_id
::
get
());
// TODO: specify exit code
exit
(
-
1
);
}
}
match
make
.excute
(
stdout_f
.to_str
(),
stderr_f
.to_str
())
{
Ok
(
exit_code
)
=>
{
log
::
info!
(
"make with args: {:?} excute return {}"
,
make
.get_args
(),
exit_code
);
if
exit_code
!=
0
{
log
::
error!
(
"exit not zero, thread {} exit."
,
thread_id
::
get
());
exit
(
-
1
);
}
},
Err
(
make_err
)
=>
{
log
::
error!
(
"{}, thread {} exit."
,
make_err
.as_str
(),
thread_id
::
get
());
// TODO: specify exit code
match
Make
::
init
(
workload
.to_str
())
{
Ok
(
exit_code
)
=>
{
log
::
info!
(
"make init in {:?} exit with {}"
,
workload
,
exit_code
);
if
exit_code
!=
0
{
log
::
error!
(
"exit code not zero, thread {} exit."
,
thread_id
::
get
());
exit
(
-
1
);
}
},
Err
(
err_code
)
=>
{
log
::
error!
(
"make init in {:?} error with {}, thread {} exit."
,
workload
,
err_code
,
thread_id
::
get
());
exit
(
-
1
);
}
// make drop here
}
// make emu
{
let
stdout_f
=
workload
.join
(
"stdout.txt"
);
let
stderr_f
=
workload
.join
(
"stderr.txt"
);
let
mut
make
=
Make
::
new
(
"numactl"
);
make
.set_args
(
vec!
[
"-C"
,
"0-63"
,
"make"
,
"build/emu"
,
"EMU_TARCE=1"
,
"SIM_ARGS=
\"
--disable-all
\"
"
,
"EMU_THREADS=8"
,
"-j64"
]);
match
make
.set_workdir
(
workload
.to_str
())
{
Ok
(
_
)
=>
{},
// do nothing
Err
(
make_err
)
=>
{
log
::
error!
(
"{}, thread {} exit"
,
make_err
.as_str
(),
thread_id
::
get
());
// TODO: specify exit code
exit
(
-
1
);
}
}
make
.exe
.env
(
"NEMU_HOME"
,
NEMU_HOME
);
make
.exe
.env
(
"AM_HOME"
,
AM_HOME
);
match
make
.excute
(
stdout_f
.to_str
(),
stderr_f
.to_str
())
{
Ok
(
exit_code
)
=>
{
log
::
info!
(
"make with args: {:?} excute return {}"
,
make
.get_args
(),
exit_code
);
if
exit_code
!=
0
{
log
::
error!
(
"exit not zero, thread {} exit."
,
thread_id
::
get
());
exit
(
-
1
);
}
},
Err
(
make_err
)
=>
{
log
::
error!
(
"{}, thread {} exit."
,
make_err
.as_str
(),
thread_id
::
get
());
// TODO: specify exit code
// {
// let stdout_f = workload.join("stdout.txt");
// let stderr_f = workload.join("stderr.txt");
// let mut make = Make::new("make");
// make.set_args(vec!["init"]);
// match make.set_workdir(workload.to_str()) {
// Ok(_) => {}, // do nothing
// Err(make_err) => {
// log::error!("{}, thread {} exit", make_err.as_str(), thread_id::get());
// // TODO: specify exit code
// exit(-1);
// }
// }
// match make.excute(stdout_f.to_str(), stderr_f.to_str()) {
// Ok(exit_code) => {
// log::info!("make with args: {:?} excute return {}", make.get_args(), exit_code);
// if exit_code != 0 {
// log::error!("exit not zero, thread {} exit.", thread_id::get());
// exit(-1);
// }
// },
// Err(make_err) => {
// log::error!("{}, thread {} exit.", make_err.as_str(), thread_id::get());
// // TODO: specify exit code
// exit(-1);
// }
// }
// // make drop here
// }
// numatcl -C 0-255 make build/emu EMU_TRACE=1 SIM_ARGS="--disable-all" EMU_THREADS=8 -j256
match
Numactl
::
make_emu
(
workload
.to_str
(),
NEMU_HOME
,
AM_HOME
)
{
Ok
(
exit_code
)
=>
{
log
::
info!
(
"make emu in {:?} exit with {}"
,
workload
,
exit_code
);
if
exit_code
!=
0
{
log
::
error!
(
"exit code not zero, thread {} exit."
,
thread_id
::
get
());
exit
(
-
1
);
}
},
Err
(
err_code
)
=>
{
log
::
error!
(
"make emu in {:?} error with {}, thread {} exit."
,
workload
,
err_code
,
thread_id
::
get
());
exit
(
-
1
);
}
// make drop here
}
// {
// let stdout_f = workload.join("stdout.txt");
// let stderr_f = workload.join("stderr.txt");
// let mut make = Make::new("numactl");
// make.set_args(vec!["-C", "0-255", "make", "build/emu", "EMU_TARCE=1", "SIM_ARGS=\"--disable-all\"", "EMU_THREADS=8", "-j256"]);
// match make.set_workdir(workload.to_str()) {
// Ok(_) => {}, // do nothing
// Err(make_err) => {
// log::error!("{}, thread {} exit", make_err.as_str(), thread_id::get());
// // TODO: specify exit code
// exit(-1);
// }
// }
// make.exe.env("NEMU_HOME", NEMU_HOME);
// make.exe.env("AM_HOME", AM_HOME);
// match make.excute(stdout_f.to_str(), stderr_f.to_str()) {
// Ok(exit_code) => {
// log::info!("make with args: {:?} excute return {}", make.get_args(), exit_code);
// if exit_code != 0 {
// log::error!("exit not zero, thread {} exit.", thread_id::get());
// exit(-1);
// }
// },
// Err(make_err) => {
// log::error!("{}, thread {} exit.", make_err.as_str(), thread_id::get());
// // TODO: specify exit code
// exit(-1);
// }
// }
// // make drop here
// }
// create ../emu_res dir &&
// numactl -C [] emu -I 1000000 -i /bigdata/zyy/checkpoints_profiles/betapoint_profile_06/gcc_200/0/_8000000000_.gz
let
res_dir
=
workload
.join
(
"../emu_res"
);
{
if
!
res_dir
.exists
()
{
match
fs
::
create_dir_all
(
res_dir
.as_path
())
{
Ok
(
_
)
=>
{},
// do nothing
Err
(
msg
)
=>
{
log
::
error!
(
"Failed in creating res_dir {:?} with msg
{} , thread {} exit."
,
res_dir
,
msg
,
thread_id
::
get
());
// TODO: specify exit code
exit
(
-
1
);
},
}
}
let
stdout_f
=
res_dir
.join
(
"stdout.txt"
);
let
stderr_f
=
res_dir
.join
(
"stderr.txt"
);
let
emu_path
=
workload
.join
(
"./build/emu"
);
let
emu
=
if
let
Some
(
path
)
=
emu_path
.to_str
()
{
log
::
info!
(
"create emu in {}"
,
path
);
path
}
else
{
log
::
error!
(
"no path in emu_path, thread {} exit"
,
thread_id
::
get
());
exit
(
-
1
);
};
let
mut
cpu_percent_collector
=
match
psutil
::
cpu
::
CpuPercentCollector
::
new
()
{
Ok
(
collector
)
=>
collector
,
Err
(
_
)
=>
{
log
::
error!
(
"new CpuPercentCollector error, thread {} exit."
,
thread_id
::
get
());
exit
(
-
1
);
}
};
let
mut
numactl
=
Numactl
::
new
(
"numactl"
);
let
cpu_percents
=
match
cpu_percent_collector
.cpu_percent_percpu
()
{
Ok
(
percents
)
=>
percents
,
Err
(
_
)
=>
{
log
::
error!
(
"get cpu_percent_percpu error, thread {} exit."
,
thread_id
::
get
());
exit
(
-
1
);
}
};
let
(
mut
begin
,
mut
end
)
=
(
0
,
0
);
let
mut
count
=
0
;
for
_
in
0
..
3
{
begin
=
0
;
end
=
0
;
for
i
in
0
..
cpu_percents
.len
()
{
if
cpu_percents
[
i
]
>
50.0
{
begin
+=
1
;
end
=
begin
;
}
else
{
end
+=
1
;
}
if
(
end
-
begin
)
>=
7
{
// found 8 free cpus, break
break
;
}
}
if
(
end
-
begin
)
>=
7
{
log
::
info!
(
"found avaiable 8 cpus, ready to run emu."
);
break
;
}
count
+=
1
;
thread
::
sleep
(
Duration
::
from_secs
(
SLEEP_TIME
*
100
));
}
if
count
>=
3
{
log
::
error!
(
"no 8 cpus avaiable, thread {} exit."
,
thread_id
::
get
());
exit
(
-
1
);
}
let
mut
cpu_ids
=
begin
.to_string
();
cpu_ids
.push_str
(
"-"
);
cpu_ids
.push_str
(
end
.to_string
()
.as_str
());
log
::
info!
(
"avaiable cpus: {}"
,
cpu_ids
);
numactl
.set_args
(
vec!
[
"-C"
,
cpu_ids
.as_str
(),
emu
,
"-I"
,
"1000000"
,
"-i"
,
EMU_TARGET
]);
match
numactl
.set_workdir
(
workload
.to_str
())
{
if
!
res_dir
.exists
()
{
match
fs
::
create_dir_all
(
res_dir
.as_path
())
{
Ok
(
_
)
=>
{},
// do nothing
Err
(
emu_err
)
=>
{
log
::
error!
(
"{}, thread {} exit"
,
emu_err
.as_str
(),
thread_id
::
get
());
Err
(
msg
)
=>
{
log
::
error!
(
"Failed in creating res_dir {:?} with msg
{} , thread {} exit."
,
res_dir
,
msg
,
thread_id
::
get
());
// TODO: specify exit code
exit
(
-
1
);
}
}
,
}
// set env `NOOP_HOME` to currnet workload
numactl
.exe
.env
(
"NOOP_HOME"
,
workload
.to_path_buf
());
numactl
.exe
.env
(
"NEMU_HOME"
,
NEMU_HOME
);
numactl
.exe
.env
(
"AM_HOME"
,
AM_HOME
);
match
numactl
.excute
(
stdout_f
.to_str
(),
stderr_f
.to_str
())
{
}
let
stdout_f
=
res_dir
.join
(
"stdout.txt"
);
let
stderr_f
=
res_dir
.join
(
"stderr.txt"
);
let
emu_path
=
workload
.join
(
"./build/emu"
);
let
emu
=
if
let
Some
(
path
)
=
emu_path
.to_str
()
{
log
::
info!
(
"create emu in {}"
,
path
);
path
}
else
{
log
::
error!
(
"no path in emu_path, thread {} exit"
,
thread_id
::
get
());
exit
(
-
1
);
};
match
Numactl
::
run_emu
(
workload
.to_str
(),
stdout_f
.to_str
(),
stderr_f
.to_str
(),
emu
,
EMU_TARGET
,
NEMU_HOME
,
AM_HOME
,
8
)
{
Ok
(
exit_code
)
=>
{
log
::
info!
(
"
make with args: {:?} excute return {}"
,
numactl
.get_args
()
,
exit_code
);
log
::
info!
(
"
run emu in {:?} exit with {}"
,
workload
,
exit_code
);
if
exit_code
!=
0
{
log
::
error!
(
"exit not zero, thread {} exit."
,
thread_id
::
get
());
log
::
error!
(
"exit
code
not zero, thread {} exit."
,
thread_id
::
get
());
exit
(
-
1
);
}
},
Err
(
emu_err
)
=>
{
log
::
error!
(
"{}, thread {} exit."
,
emu_err
.as_str
(),
thread_id
::
get
());
// TODO: specify exit code
Err
(
err_code
)
=>
{
log
::
error!
(
"run emu in {:?} error with {}, thread {} exit."
,
workload
,
err_code
,
thread_id
::
get
());
exit
(
-
1
);
}
}
}
// {
// if !res_dir.exists() {
// match fs::create_dir_all(res_dir.as_path()) {
// Ok(_) => {}, // do nothing
// Err(msg) => {
// log::error!("Failed in creating res_dir {:?} with msg
// {} , thread {} exit.", res_dir, msg, thread_id::get());
// // TODO: specify exit code
// exit(-1);
// },
// }
// }
// let stdout_f = res_dir.join("stdout.txt");
// let stderr_f = res_dir.join("stderr.txt");
// let emu_path = workload.join("./build/emu");
// let emu = if let Some(path) = emu_path.to_str() {
// log::info!("create emu in {}", path);
// path
// } else {
// log::error!("no path in emu_path, thread {} exit", thread_id::get());
// exit(-1);
// };
// let mut cpu_percent_collector = match psutil::cpu::CpuPercentCollector::new() {
// Ok(collector) => collector,
// Err(_) => {
// log::error!("new CpuPercentCollector error, thread {} exit.", thread_id::get());
// exit(-1);
// }
// };
// let mut numactl = Numactl::new("numactl");
// let cpu_percents = match cpu_percent_collector.cpu_percent_percpu() {
// Ok(percents) => percents,
// Err(_) => {
// log::error!("get cpu_percent_percpu error, thread {} exit.", thread_id::get());
// exit(-1);
// }
// };
// let (mut begin, mut end) = (0, 0);
// let mut count = 0;
// for _ in 0..3 {
// begin = 0;
// end = 0;
// for i in 0..cpu_percents.len() {
// if cpu_percents[i] > 50.0 {
// begin += 1;
// end = begin;
// } else {
// end += 1;
// }
// if (end - begin) >= 7 {
// // found 8 free cpus, break
// break;
// }
// }
// if (end - begin) >= 7 {
// log::info!("found avaiable 8 cpus, ready to run emu.");
// break;
// }
// count += 1;
// thread::sleep(Duration::from_secs(SLEEP_TIME * 100));
// }
// if count >= 3 {
// log::error!("no 8 cpus avaiable, thread {} exit.", thread_id::get());
// exit(-1);
// }
// let mut cpu_ids = begin.to_string();
// cpu_ids.push_str("-");
// cpu_ids.push_str(end.to_string().as_str());
// log::info!("avaiable cpus: {}", cpu_ids);
// numactl.set_args(vec!["-C", cpu_ids.as_str(), emu, "-I", "1000000", "-i", EMU_TARGET]);
// match numactl.set_workdir(workload.to_str()) {
// Ok(_) => {}, // do nothing
// Err(emu_err) => {
// log::error!("{}, thread {} exit", emu_err.as_str(), thread_id::get());
// // TODO: specify exit code
// exit(-1);
// }
// }
// // set env `NOOP_HOME` to currnet workload
// numactl.exe.env("NOOP_HOME", workload.to_path_buf());
// numactl.exe.env("NEMU_HOME", NEMU_HOME);
// numactl.exe.env("AM_HOME", AM_HOME);
// match numactl.excute(stdout_f.to_str(), stderr_f.to_str()) {
// Ok(exit_code) => {
// log::info!("make with args: {:?} excute return {}", numactl.get_args(), exit_code);
// if exit_code != 0 {
// log::error!("exit not zero, thread {} exit.", thread_id::get());
// exit(-1);
// }
// },
// Err(emu_err) => {
// log::error!("{}, thread {} exit.", emu_err.as_str(), thread_id::get());
// // TODO: specify exit code
// exit(-1);
// }
// }
// }
log
::
info!
(
"thread {} return 0"
,
thread_id
::
get
());
});
...
...
xscommand/Cargo.toml
浏览文件 @
dd5516e9
...
...
@@ -9,4 +9,5 @@ edition = "2018"
[dependencies]
log
=
"0.4"
simple_logger
=
"1.11.0"
xscommand-macros
=
{
path
=
"macros"
}
\ No newline at end of file
xscommand-macros
=
{
path
=
"macros"
}
psutil
=
"3.2.0"
xscommand/src/git.rs
浏览文件 @
dd5516e9
...
...
@@ -55,10 +55,10 @@ impl<'a> Git<'a> {
}
// git log
pub
fn
log
(
stdout
:
&
str
,
stderr
:
&
str
)
->
Result
<
i32
,
i32
>
{
pub
fn
log
(
stdout
:
Option
<&
str
>
,
stderr
:
Option
<&
str
>
)
->
Result
<
i32
,
i32
>
{
let
mut
git
=
Git
::
new
(
"git"
);
git
.set_args
(
vec!
[
"log"
]);
match
git
.excute
(
Some
(
stdout
),
Some
(
stderr
)
)
{
match
git
.excute
(
stdout
,
stderr
)
{
Ok
(
exit_code
)
=>
Ok
(
exit_code
),
Err
(
err
)
=>
Err
(
err
.err_code
()),
}
...
...
xscommand/src/make.rs
浏览文件 @
dd5516e9
...
...
@@ -7,7 +7,7 @@ use std::{
process
::{
Command
,
Stdio
}
};
use
super
::{
XSCommand
,
DefaultErr
};
use
super
::{
XSCommand
,
XSCommandErr
,
DefaultErr
};
use
xscommand_macros
::
XSCommand
;
/// Make XSCommand
...
...
@@ -19,8 +19,28 @@ pub struct Make<'a> {
}
impl
<
'a
>
Make
<
'a
>
{
pub
fn
emu
()
->
i32
{
todo!
()
pub
fn
init
(
workload
:
Option
<&
str
>
)
->
Result
<
i32
,
i32
>
{
let
mut
make
=
Make
::
new
(
"make"
);
make
.set_args
(
vec!
[
"init"
]);
if
let
Err
(
err
)
=
make
.set_workdir
(
workload
)
{
return
Err
(
err
.err_code
());
};
match
make
.excute
(
None
,
None
)
{
Ok
(
exit_code
)
=>
Ok
(
exit_code
),
Err
(
err
)
=>
Err
(
err
.err_code
()),
}
}
pub
fn
emu
(
workload
:
Option
<&
str
>
)
->
Result
<
i32
,
i32
>
{
let
mut
make
=
Make
::
new
(
"make"
);
make
.set_args
(
vec!
[
"build/emu"
,
"EMU_TARCE=1"
,
"SIM_ARGS=
\"
--disable-all
\"
"
,
"EMU_THREADS=8"
,
"-j10"
]);
if
let
Err
(
err
)
=
make
.set_workdir
(
workload
)
{
return
Err
(
err
.err_code
());
};
match
make
.excute
(
None
,
None
)
{
Ok
(
exit_code
)
=>
Ok
(
exit_code
),
Err
(
err
)
=>
Err
(
err
.err_code
()),
}
}
}
// impl<'a> XSCommand<'a, DefaultErr> for Make<'a> {
...
...
xscommand/src/numactl.rs
浏览文件 @
dd5516e9
/// Numactl XSCommand Implementation
///
extern
crate
psutil
;
use
super
::{
XSCommand
,
DefaultErr
};
use
std
::{
fs
::
File
,
use
super
::{
XSCommand
,
XSCommandErr
,
DefaultErr
};
use
std
::{
fs
::
File
,
os
::
unix
::
io
::{
FromRawFd
,
IntoRawFd
},
process
::{
Command
,
Stdio
}
process
::{
Command
,
Stdio
,
exit
},
thread
,
time
::
Duration
,
vec
,
};
use
xscommand_macros
::
XSCommand
;
...
...
@@ -17,10 +20,98 @@ pub struct Numactl<'a> {
}
impl
<
'a
>
Numactl
<
'a
>
{
pub
fn
make_emu
()
->
i32
{
todo!
()
pub
fn
make_emu
(
workload
:
Option
<&
str
>
,
nemu_home
:
&
str
,
am_home
:
&
str
)
->
Result
<
i32
,
i32
>
{
let
mut
numactl
=
Numactl
::
new
(
"numactl"
);
numactl
.set_args
(
vec!
[
"-C"
,
"0-255"
,
"make"
,
"build/emu"
,
"EMU_TARCE=1"
,
"SIM_ARGS=
\"
--disable-all
\"
"
,
"EMU_THREADS=8"
,
"-j256"
]);
if
let
Err
(
err
)
=
numactl
.set_workdir
(
workload
)
{
return
Err
(
err
.err_code
());
};
numactl
.exe
.env
(
"NEMU_HOME"
,
nemu_home
);
numactl
.exe
.env
(
"AM_HOME"
,
am_home
);
match
numactl
.excute
(
None
,
None
)
{
Ok
(
exit_code
)
=>
Ok
(
exit_code
),
Err
(
err
)
=>
Err
(
err
.err_code
()),
}
}
pub
fn
run_emu
()
->
i32
{
todo!
()
pub
fn
run_emu
(
workload
:
Option
<&
str
>
,
stdout
:
Option
<&
str
>
,
stderr
:
Option
<&
str
>
,
emu_path
:
&
str
,
img_path
:
&
str
,
nemu_home
:
&
str
,
am_home
:
&
str
,
thread_num
:
usize
)
->
Result
<
i32
,
i32
>
{
let
mut
numactl
=
Numactl
::
new
(
"numactl"
);
let
mut
cpu_percent_collector
=
match
psutil
::
cpu
::
CpuPercentCollector
::
new
()
{
Ok
(
collector
)
=>
collector
,
Err
(
_
)
=>
{
// TODO: specify exit code
let
exit_code
=
-
1
;
log
::
error!
(
"new CpuPercentCollector error, exit with {}"
,
exit_code
);
exit
(
exit_code
);
}
};
let
cpu_percents
=
match
cpu_percent_collector
.cpu_percent_percpu
()
{
Ok
(
percents
)
=>
percents
,
Err
(
_
)
=>
{
// TODO: specify exit code
let
exit_code
=
-
1
;
log
::
error!
(
"get cpu_percent_percpu error, exit with {}."
,
exit_code
);
exit
(
exit_code
);
}
};
let
(
mut
begin
,
mut
end
)
=
(
0
,
0
);
let
mut
count
=
0
;
for
_
in
0
..
3
{
begin
=
0
;
end
=
0
;
for
i
in
0
..
cpu_percents
.len
()
{
if
cpu_percents
[
i
]
>
50.0
{
begin
+=
1
;
end
=
begin
;
}
else
{
end
+=
1
;
}
if
(
end
-
begin
)
>=
(
thread_num
-
1
)
{
// found 8 free cpus, break
break
;
}
}
if
(
end
-
begin
)
>=
(
thread_num
-
1
)
{
log
::
info!
(
"found avaiable 8 cpus, ready to run emu."
);
break
;
}
count
+=
1
;
thread
::
sleep
(
Duration
::
from_secs
(
120
));
}
if
count
>=
3
{
// TODO: specify exit code
let
exit_code
=
-
1
;
log
::
error!
(
"no {} cpus avaiable, exit with {}."
,
thread_num
,
exit_code
);
exit
(
exit_code
);
}
let
mut
cpu_ids
=
begin
.to_string
();
cpu_ids
.push_str
(
"-"
);
cpu_ids
.push_str
(
end
.to_string
()
.as_str
());
log
::
info!
(
"avaiable cpus: {}"
,
cpu_ids
);
numactl
.set_args
(
vec!
[
"-C"
,
cpu_ids
.as_str
(),
emu_path
,
"-I"
,
"1000000"
,
"-i"
,
img_path
]);
if
let
Err
(
err
)
=
numactl
.set_workdir
(
workload
)
{
return
Err
(
err
.err_code
());
};
if
let
Some
(
noop_home
)
=
workload
{
numactl
.exe
.env
(
"NOOP_HOME"
,
noop_home
);
}
else
{
// TODO: specify exit code
let
exit_code
=
-
1
;
log
::
error!
(
"workload.to_str() return None, exit with {}."
,
exit_code
);
exit
(
exit_code
);
}
numactl
.exe
.env
(
"NEMU_HOME"
,
nemu_home
);
numactl
.exe
.env
(
"AM_HOME"
,
am_home
);
match
numactl
.excute
(
stdout
,
stderr
)
{
Ok
(
exit_code
)
=>
Ok
(
exit_code
),
Err
(
err
)
=>
Err
(
err
.err_code
()),
}
}
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录