Dump function names and allow overriding result of cuDeviceComputeCapability

This commit is contained in:
Andrzej Janik
2021-12-06 23:54:47 +01:00
parent 2c6d7ffb7a
commit dd915688bd
4 changed files with 66 additions and 3 deletions

View File

@ -2355,12 +2355,13 @@ extern_redirect! {
dev: CUdevice, dev: CUdevice,
) -> CUresult; ) -> CUresult;
} }
extern_redirect! { extern_redirect_with_post! {
pub fn cuDeviceGetAttribute( pub fn cuDeviceGetAttribute(
pi: *mut ::std::os::raw::c_int, pi: *mut ::std::os::raw::c_int,
attrib: CUdevice_attribute, attrib: CUdevice_attribute,
dev: CUdevice, dev: CUdevice,
) -> CUresult; ) -> CUresult;
super::cuDeviceGetAttribute_Post;
} }
extern_redirect! { extern_redirect! {
pub fn cuDeviceGetNvSciSyncAttributes( pub fn cuDeviceGetNvSciSyncAttributes(
@ -2372,12 +2373,13 @@ extern_redirect! {
extern_redirect! { extern_redirect! {
pub fn cuDeviceGetProperties(prop: *mut CUdevprop, dev: CUdevice) -> CUresult; pub fn cuDeviceGetProperties(prop: *mut CUdevprop, dev: CUdevice) -> CUresult;
} }
extern_redirect! { extern_redirect_with_post! {
pub fn cuDeviceComputeCapability( pub fn cuDeviceComputeCapability(
major: *mut ::std::os::raw::c_int, major: *mut ::std::os::raw::c_int,
minor: *mut ::std::os::raw::c_int, minor: *mut ::std::os::raw::c_int,
dev: CUdevice, dev: CUdevice,
) -> CUresult; ) -> CUresult;
super::cuDeviceComputeCapability_Post;
} }
extern_redirect! { extern_redirect! {
pub fn cuDevicePrimaryCtxRetain(pctx: *mut CUcontext, dev: CUdevice) -> CUresult; pub fn cuDevicePrimaryCtxRetain(pctx: *mut CUcontext, dev: CUdevice) -> CUresult;

View File

@ -182,6 +182,7 @@ impl GlobalDelayedState {
struct Settings { struct Settings {
dump_dir: Option<PathBuf>, dump_dir: Option<PathBuf>,
libcuda_path: String, libcuda_path: String,
override_cc_major: Option<u32>,
} }
impl Settings { impl Settings {
@ -191,7 +192,7 @@ impl Settings {
Ok(Some(dir)) => { Ok(Some(dir)) => {
logger.log(log::LogEntry::CreatedDumpDirectory(dir.clone())); logger.log(log::LogEntry::CreatedDumpDirectory(dir.clone()));
Some(dir) Some(dir)
}, }
Ok(None) => None, Ok(None) => None,
Err(err) => { Err(err) => {
logger.log(log::LogEntry::ErrorBox(err)); logger.log(log::LogEntry::ErrorBox(err));
@ -206,9 +207,24 @@ impl Settings {
} }
Ok(env_string) => env_string, Ok(env_string) => env_string,
}; };
let override_cc_major = match env::var("ZLUDA_OVERRIDE_COMPUTE_CAPABILITY_MAJOR") {
Err(env::VarError::NotPresent) => None,
Err(e) => {
logger.log(log::LogEntry::ErrorBox(Box::new(e) as _));
None
}
Ok(env_string) => match str::parse::<u32>(&*env_string) {
Err(e) => {
logger.log(log::LogEntry::ErrorBox(Box::new(e) as _));
None
}
Ok(cc) => Some(cc),
},
};
Settings { Settings {
dump_dir, dump_dir,
libcuda_path, libcuda_path,
override_cc_major,
} }
} }
@ -1471,4 +1487,40 @@ pub(crate) fn cuModuleGetFunction_Post(
if !state.module_exists(hmod) { if !state.module_exists(hmod) {
fn_logger.log(log::LogEntry::UnknownModule(hmod)) fn_logger.log(log::LogEntry::UnknownModule(hmod))
} }
match unsafe { CStr::from_ptr(name) }.to_str() {
Ok(str) => fn_logger.log(log::LogEntry::FunctionParameter {
name: "name",
value: str.to_string(),
}),
Err(e) => fn_logger.log(log::LogEntry::MalformedFunctionName(e)),
}
}
#[allow(non_snake_case)]
pub(crate) fn cuDeviceGetAttribute_Post(
pi: *mut ::std::os::raw::c_int,
attrib: CUdevice_attribute,
dev: CUdevice,
fn_logger: &mut log::FunctionLogger,
state: &mut trace::StateTracker,
result: CUresult,
) {
fn_logger.log(log::LogEntry::FunctionParameter {
name: "attrib",
value: attrib.0.to_string(),
});
}
#[allow(non_snake_case)]
pub(crate) fn cuDeviceComputeCapability_Post(
major: *mut ::std::os::raw::c_int,
minor: *mut ::std::os::raw::c_int,
dev: CUdevice,
fn_logger: &mut log::FunctionLogger,
state: &mut trace::StateTracker,
result: CUresult,
) {
if let Some(major_ver_override) = state.override_cc_major {
unsafe { *major = major_ver_override as i32 };
}
} }

View File

@ -302,6 +302,11 @@ pub(crate) enum LogEntry {
raw_image: *const c_void, raw_image: *const c_void,
kind: &'static str, kind: &'static str,
}, },
MalformedFunctionName(Utf8Error),
FunctionParameter {
name: &'static str,
value: String,
},
MalformedModulePath(Utf8Error), MalformedModulePath(Utf8Error),
NonUtf8ModuleText(Utf8Error), NonUtf8ModuleText(Utf8Error),
NulInsideModuleText(NulError), NulInsideModuleText(NulError),
@ -377,6 +382,8 @@ impl Display for LogEntry {
expected, expected,
observed, observed,
} => write!(f, "Unexected argument"), } => write!(f, "Unexected argument"),
LogEntry::MalformedFunctionName(e) => e.fmt(f),
LogEntry::FunctionParameter { name, value } => write!(f, "{}: {}", name, value),
} }
} }
} }

View File

@ -21,6 +21,7 @@ pub(crate) struct StateTracker {
submodule_counter: usize, submodule_counter: usize,
last_module_version: Option<usize>, last_module_version: Option<usize>,
pub(crate) dark_api: dark_api::DarkApiState, pub(crate) dark_api: dark_api::DarkApiState,
pub(crate) override_cc_major: Option<u32>,
} }
impl StateTracker { impl StateTracker {
@ -32,6 +33,7 @@ impl StateTracker {
submodule_counter: 0, submodule_counter: 0,
last_module_version: None, last_module_version: None,
dark_api: dark_api::DarkApiState::new(), dark_api: dark_api::DarkApiState::new(),
override_cc_major: settings.override_cc_major,
} }
} }