Skip to content

Commit

Permalink
Rework AVX/AVX2 detection again
Browse files Browse the repository at this point in the history
  • Loading branch information
mvines committed Oct 10, 2021
1 parent 8cf222b commit c165101
Show file tree
Hide file tree
Showing 3 changed files with 71 additions and 70 deletions.
71 changes: 1 addition & 70 deletions core/src/validator.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
//! The `validator` module hosts all the validator microservices.

pub use solana_perf::report_target_features;
use {
crate::{
broadcast_stage::BroadcastStageType,
Expand Down Expand Up @@ -1548,76 +1549,6 @@ fn wait_for_supermajority(
Ok(true)
}

fn is_rosetta_emulated() -> bool {
#[cfg(target_os = "macos")]
{
use std::str::FromStr;
std::process::Command::new("sysctl")
.args(&["-in", "sysctl.proc_translated"])
.output()
.map_err(|_| ())
.and_then(|output| String::from_utf8(output.stdout).map_err(|_| ()))
.and_then(|stdout| u8::from_str(stdout.trim()).map_err(|_| ()))
.map(|enabled| enabled == 1)
.unwrap_or(false)
}
#[cfg(not(target_os = "macos"))]
{
false
}
}

pub fn report_target_features() {
warn!(
"CUDA is {}abled",
if solana_perf::perf_libs::api().is_some() {
"en"
} else {
"dis"
}
);

if !is_rosetta_emulated() {
unsafe { check_avx() };
unsafe { check_avx2() };
}
}

// Validator binaries built on a machine with AVX support will generate invalid opcodes
// when run on machines without AVX causing a non-obvious process abort. Instead detect
// the mismatch and error cleanly.
#[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
#[target_feature(enable = "avx")]
unsafe fn check_avx() {
if is_x86_feature_detected!("avx") {
info!("AVX detected");
} else {
error!(
"Incompatible CPU detected: missing AVX support. Please build from source on the target"
);
abort();
}
}

#[cfg(not(any(target_arch = "x86", target_arch = "x86_64")))]
unsafe fn check_avx() {}

#[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
#[target_feature(enable = "avx2")]
unsafe fn check_avx2() {
if is_x86_feature_detected!("avx2") {
info!("AVX2 detected");
} else {
error!(
"Incompatible CPU detected: missing AVX2 support. Please build from source on the target"
);
abort();
}
}

#[cfg(not(any(target_arch = "x86", target_arch = "x86_64")))]
unsafe fn check_avx2() {}

// Get the activated stake percentage (based on the provided bank) that is visible in gossip
fn get_stake_percent_in_gossip(bank: &Bank, cluster_info: &ClusterInfo, log: bool) -> u64 {
let mut online_stake = 0;
Expand Down
11 changes: 11 additions & 0 deletions perf/build.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
fn main() {
#[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
{
if is_x86_feature_detected!("avx") {
println!("cargo:rustc-cfg=build_target_feature_avx");
}
if is_x86_feature_detected!("avx2") {
println!("cargo:rustc-cfg=build_target_feature_avx2");
}
}
}
59 changes: 59 additions & 0 deletions perf/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -19,3 +19,62 @@ extern crate matches;

#[macro_use]
extern crate solana_metrics;

fn is_rosetta_emulated() -> bool {
#[cfg(target_os = "macos")]
{
use std::str::FromStr;
std::process::Command::new("sysctl")
.args(&["-in", "sysctl.proc_translated"])
.output()
.map_err(|_| ())
.and_then(|output| String::from_utf8(output.stdout).map_err(|_| ()))
.and_then(|stdout| u8::from_str(stdout.trim()).map_err(|_| ()))
.map(|enabled| enabled == 1)
.unwrap_or(false)
}
#[cfg(not(target_os = "macos"))]
{
false
}
}

pub fn report_target_features() {
warn!(
"CUDA is {}abled",
if crate::perf_libs::api().is_some() {
"en"
} else {
"dis"
}
);

// Validator binaries built on a machine with AVX support will generate invalid opcodes
// when run on machines without AVX causing a non-obvious process abort. Instead detect
// the mismatch and error cleanly.
if !is_rosetta_emulated() {
#[cfg(build_target_feature_avx)]
{
if is_x86_feature_detected!("avx") {
info!("AVX detected");
} else {
error!(
"Incompatible CPU detected: missing AVX support. Please build from source on the target"
);
std::process::abort();
}
}

#[cfg(build_target_feature_avx2)]
{
if is_x86_feature_detected!("avx2") {
info!("AVX2 detected");
} else {
error!(
"Incompatible CPU detected: missing AVX2 support. Please build from source on the target"
);
std::process::abort();
}
}
}
}

0 comments on commit c165101

Please sign in to comment.