rtiow: add core affinity to each render thread.
All checks were successful
continuous-integration/drone/push Build is passing
All checks were successful
continuous-integration/drone/push Build is passing
This commit is contained in:
parent
af6cda7349
commit
27ca936264
13
rtiow/Cargo.lock
generated
13
rtiow/Cargo.lock
generated
@ -384,6 +384,17 @@ dependencies = [
|
|||||||
"libc 0.2.49 (registry+https://github.com/rust-lang/crates.io-index)",
|
"libc 0.2.49 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "core_affinity"
|
||||||
|
version = "0.5.9"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
dependencies = [
|
||||||
|
"kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"libc 0.2.49 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"num_cpus 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "cpuprofiler"
|
name = "cpuprofiler"
|
||||||
version = "0.0.3"
|
version = "0.0.3"
|
||||||
@ -1604,6 +1615,7 @@ dependencies = [
|
|||||||
"actix-web 0.7.18 (registry+https://github.com/rust-lang/crates.io-index)",
|
"actix-web 0.7.18 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"askama 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
"askama 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"chrono 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
"chrono 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"core_affinity 0.5.9 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"cpuprofiler 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
"cpuprofiler 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"criterion 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)",
|
"criterion 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"image 0.19.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"image 0.19.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
@ -2458,6 +2470,7 @@ dependencies = [
|
|||||||
"checksum cookie 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1465f8134efa296b4c19db34d909637cb2bf0f7aaf21299e23e18fa29ac557cf"
|
"checksum cookie 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1465f8134efa296b4c19db34d909637cb2bf0f7aaf21299e23e18fa29ac557cf"
|
||||||
"checksum core-foundation 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "286e0b41c3a20da26536c6000a280585d519fd07b3956b43aed8a79e9edce980"
|
"checksum core-foundation 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "286e0b41c3a20da26536c6000a280585d519fd07b3956b43aed8a79e9edce980"
|
||||||
"checksum core-foundation-sys 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "716c271e8613ace48344f723b60b900a93150271e5be206212d052bbc0883efa"
|
"checksum core-foundation-sys 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "716c271e8613ace48344f723b60b900a93150271e5be206212d052bbc0883efa"
|
||||||
|
"checksum core_affinity 0.5.9 (registry+https://github.com/rust-lang/crates.io-index)" = "6d162c6e463c31dbf78fefa99d042156c1c74d404e299cfe3df2923cb857595b"
|
||||||
"checksum cpuprofiler 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "33f07976bb6821459632d7a18d97ccca005cb5c552f251f822c7c1781c1d7035"
|
"checksum cpuprofiler 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "33f07976bb6821459632d7a18d97ccca005cb5c552f251f822c7c1781c1d7035"
|
||||||
"checksum crc 1.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d663548de7f5cca343f1e0a48d14dcfb0e9eb4e079ec58883b7251539fa10aeb"
|
"checksum crc 1.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d663548de7f5cca343f1e0a48d14dcfb0e9eb4e079ec58883b7251539fa10aeb"
|
||||||
"checksum crc32fast 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e91d5240c6975ef33aeb5f148f35275c25eda8e8a5f95abe421978b05b8bf192"
|
"checksum crc32fast 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e91d5240c6975ef33aeb5f148f35275c25eda8e8a5f95abe421978b05b8bf192"
|
||||||
|
|||||||
@ -12,6 +12,7 @@ name = "spheres"
|
|||||||
actix-web = "0.7.8"
|
actix-web = "0.7.8"
|
||||||
askama = "0.7.1"
|
askama = "0.7.1"
|
||||||
chrono = "*"
|
chrono = "*"
|
||||||
|
core_affinity = "0.5"
|
||||||
cpuprofiler = { version = "0.0.3", optional = true }
|
cpuprofiler = { version = "0.0.3", optional = true }
|
||||||
image = "0.19.0"
|
image = "0.19.0"
|
||||||
lazy_static = "1.1.0"
|
lazy_static = "1.1.0"
|
||||||
|
|||||||
@ -14,6 +14,7 @@ use std::sync::Mutex;
|
|||||||
use std::thread;
|
use std::thread;
|
||||||
use std::time;
|
use std::time;
|
||||||
|
|
||||||
|
use core_affinity;
|
||||||
#[cfg(feature = "prom")]
|
#[cfg(feature = "prom")]
|
||||||
use lazy_static::lazy_static;
|
use lazy_static::lazy_static;
|
||||||
use num_cpus;
|
use num_cpus;
|
||||||
@ -461,22 +462,36 @@ pub fn render(scene: Scene, output_dir: &Path) -> std::result::Result<(), std::i
|
|||||||
|
|
||||||
let scene = Arc::new(scene);
|
let scene = Arc::new(scene);
|
||||||
let pixel_req_rx = Arc::new(Mutex::new(pixel_req_rx));
|
let pixel_req_rx = Arc::new(Mutex::new(pixel_req_rx));
|
||||||
info!("Creating {} render threads", num_threads);
|
|
||||||
info!("Adaptive subsampling: {:?}", scene.adaptive_subsampling);
|
info!("Adaptive subsampling: {:?}", scene.adaptive_subsampling);
|
||||||
for i in 0..num_threads {
|
// Retrieve the IDs of all active CPU cores.
|
||||||
let s = sync::Arc::clone(&scene);
|
let core_ids = core_affinity::get_core_ids().unwrap();
|
||||||
let pixel_req_rx = pixel_req_rx.clone();
|
let core_ids = if core_ids.len() > num_threads {
|
||||||
let pixel_resp_tx = pixel_resp_tx.clone();
|
core_ids[..num_threads].to_vec()
|
||||||
thread::spawn(move || {
|
} else {
|
||||||
render_worker(i, &s, pixel_req_rx, &pixel_resp_tx);
|
core_ids
|
||||||
});
|
};
|
||||||
}
|
info!("Creating {} render threads", core_ids.len());
|
||||||
|
// Create a thread for each active CPU core.
|
||||||
|
let mut handles = core_ids
|
||||||
|
.into_iter()
|
||||||
|
.enumerate()
|
||||||
|
.filter(|(i, _id)| *i < num_threads)
|
||||||
|
.map(|(i, id)| {
|
||||||
|
let s = sync::Arc::clone(&scene);
|
||||||
|
let pixel_req_rx = pixel_req_rx.clone();
|
||||||
|
let pixel_resp_tx = pixel_resp_tx.clone();
|
||||||
|
thread::spawn(move || {
|
||||||
|
core_affinity::set_for_current(id);
|
||||||
|
render_worker(i, &s, pixel_req_rx, &pixel_resp_tx);
|
||||||
|
})
|
||||||
|
})
|
||||||
|
.collect::<Vec<_>>();
|
||||||
drop(pixel_req_rx);
|
drop(pixel_req_rx);
|
||||||
drop(pixel_resp_tx);
|
drop(pixel_resp_tx);
|
||||||
|
|
||||||
let start_time = time::Instant::now();
|
let start_time = time::Instant::now();
|
||||||
let (w, h) = (scene.width, scene.height);
|
let (w, h) = (scene.width, scene.height);
|
||||||
thread::spawn(move || {
|
handles.push(thread::spawn(move || {
|
||||||
let batch_line_requests = true;
|
let batch_line_requests = true;
|
||||||
if batch_line_requests {
|
if batch_line_requests {
|
||||||
for y in 0..h {
|
for y in 0..h {
|
||||||
@ -494,7 +509,7 @@ pub fn render(scene: Scene, output_dir: &Path) -> std::result::Result<(), std::i
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
drop(pixel_req_tx);
|
drop(pixel_req_tx);
|
||||||
});
|
}));
|
||||||
|
|
||||||
info!("Rendering with {} subsamples", scene.subsamples);
|
info!("Rendering with {} subsamples", scene.subsamples);
|
||||||
output::register_image(
|
output::register_image(
|
||||||
@ -509,7 +524,7 @@ pub fn render(scene: Scene, output_dir: &Path) -> std::result::Result<(), std::i
|
|||||||
}
|
}
|
||||||
|
|
||||||
let pixel_total = scene.width * scene.height;
|
let pixel_total = scene.width * scene.height;
|
||||||
thread::spawn(move || {
|
handles.push(thread::spawn(move || {
|
||||||
let mut last_time = time::Instant::now();
|
let mut last_time = time::Instant::now();
|
||||||
let mut last_pixel_count = PIXEL_COUNT.load(Ordering::SeqCst);
|
let mut last_pixel_count = PIXEL_COUNT.load(Ordering::SeqCst);
|
||||||
let mut last_ray_count = RAY_COUNT.load(Ordering::SeqCst);
|
let mut last_ray_count = RAY_COUNT.load(Ordering::SeqCst);
|
||||||
@ -524,7 +539,7 @@ pub fn render(scene: Scene, output_dir: &Path) -> std::result::Result<(), std::i
|
|||||||
let pixel_diff = pixel_count - last_pixel_count;
|
let pixel_diff = pixel_count - last_pixel_count;
|
||||||
let ray_diff = ray_count - last_ray_count;
|
let ray_diff = ray_count - last_ray_count;
|
||||||
info!(
|
info!(
|
||||||
"{} / {} ({}%) pixels {} pixels/s {} rays/s",
|
"{} / {}pixels ({}%) {}pixels/s {}rays/s",
|
||||||
human.format(pixel_count as f64),
|
human.format(pixel_count as f64),
|
||||||
human.format(pixel_total as f64),
|
human.format(pixel_total as f64),
|
||||||
100 * pixel_count / pixel_total,
|
100 * pixel_count / pixel_total,
|
||||||
@ -534,8 +549,11 @@ pub fn render(scene: Scene, output_dir: &Path) -> std::result::Result<(), std::i
|
|||||||
last_time = now;
|
last_time = now;
|
||||||
last_pixel_count = pixel_count;
|
last_pixel_count = pixel_count;
|
||||||
last_ray_count = ray_count;
|
last_ray_count = ray_count;
|
||||||
|
if pixel_count == pixel_total {
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
}));
|
||||||
|
|
||||||
for resp in pixel_resp_rx {
|
for resp in pixel_resp_rx {
|
||||||
match resp {
|
match resp {
|
||||||
@ -549,11 +567,14 @@ pub fn render(scene: Scene, output_dir: &Path) -> std::result::Result<(), std::i
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
for thr in handles {
|
||||||
|
thr.join().expect("thread join");
|
||||||
|
}
|
||||||
let human = human::Formatter::new();
|
let human = human::Formatter::new();
|
||||||
let time_diff = time::Instant::now() - start_time;
|
let time_diff = time::Instant::now() - start_time;
|
||||||
let ray_count = RAY_COUNT.load(Ordering::SeqCst);
|
let ray_count = RAY_COUNT.load(Ordering::SeqCst);
|
||||||
info!(
|
info!(
|
||||||
"{} pixels {} {}s pixels/s {} rays/s",
|
"{}pixels {:.2}s {}pixels/s {}rays/s",
|
||||||
human.format(pixel_total as f64),
|
human.format(pixel_total as f64),
|
||||||
time_diff.as_secs_f64(),
|
time_diff.as_secs_f64(),
|
||||||
human.format(pixel_total as f64 / time_diff.as_secs_f64()),
|
human.format(pixel_total as f64 / time_diff.as_secs_f64()),
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user