const uint VERSION_BIN = 300;
const uint RESTORE_MIN = 300;
-double TARGET_MS_PROFILE[4] = { 8, 16, 96, 512 };
+double TARGET_MS_PROFILE[4] = { 2, 12, 96, 480 };
#define INCR_RULES 10000
#define INCR_SALTS 100000
"# Options #",
"###########",
"",
- " Short- | Long- | Parameter- | Description | Example",
- " Option | Option | Type | |",
- "--------+---------------------------+------------+------------------------------------------------------+---------------------",
- " -m | --hash-type | Number | Hash-type, see references below | -m 1000",
- " -a | --attack-mode | Number | Attack-mode, see references below | -a 3",
- " -V | --version | | Print version | --version",
- " -h | --help | | Print help | --help",
- " | --quiet | | Suppress output | --quiet",
- " | --hex-charset | | Assume charset is given in hex | --hex-charset",
- " | --hex-salt | | Assume salt is given in hex | --hex-salt",
- " | --hex-wordlist | | Assume words in wordlist is given in hex | --hex-wordlist",
- " | --force | | Ignore warnings | --force",
- " | --status | | Enable automatic update of the status-screen | --status",
- " | --status-timer | Number | Sets seconds between status-screen update to X | --status-timer=1",
- " | --status-automat | | Display the status view in a machine readable format | --status-automat",
- " | --loopback | | Add new plains to induct directory | --loopback",
- " | --weak-hash-threshold | Number | Threshold X when to stop checking for weak hashes | --weak-hash-threshold=0",
- " | --markov-hcstat | File | Specify hcstat file to use, default is hashcat.hcstat| --markiv-hcstat=my.hcstat",
- " | --markov-disable | | Disables markov-chains, emulates classic brute-force | --markov-disable",
- " | --markov-classic | | Enables classic markov-chains, no per-position | --markov-classic",
- " -t | --markov-threshold | Number | Threshold X when to stop accepting new markov-chains | -t 50",
- " | --runtime | Number | Abort session after X seconds of runtime | --runtime=10",
- " | --session | String | Define specific session name | --session=mysession",
- " | --restore | | Restore session from --session | --restore",
- " | --restore-disable | | Do not write restore file | --restore-disable",
- " -o | --outfile | File | Define outfile for recovered hash | -o outfile.txt",
- " | --outfile-format | Number | Define outfile-format X for recovered hash | --outfile-format=7",
- " | --outfile-autohex-disable | | Disable the use of $HEX[] in output plains | --outfile-autohex-disable",
- " | --outfile-check-timer | Number | Sets seconds between outfile checks to X | --outfile-check-timer=30",
- " -p | --separator | Char | Separator char for hashlists and outfile | -p :",
- " | --show | | Show cracked passwords only | --show",
- " | --left | | Show un-cracked passwords only | --left",
- " | --username | | Enable ignoring of usernames in hashfile | --username",
- " | --remove | | Enable remove of hash once it is cracked | --remove",
- " | --remove-timer | Number | Update input hash file each X seconds | --remove-timer=30",
- " | --potfile-disable | | Do not write potfile | --potfile-disable",
- " | --potfile-path | | Specific path to potfile | --potfile-path=hashcat.pot",
- " | --debug-mode | Number | Defines the debug mode (hybrid only by using rules) | --debug-mode=4",
- " | --debug-file | File | Output file for debugging rules | --debug-file=goodrules.log",
- " | --induction-dir | Folder | Specify the induction directory to use for loopback | --induction-dir=inducts",
- " | --outfile-check-dir | Folder | Specify the outfile directory to monitor for plains | --outfile-check-dir=ext",
- " | --logfile-disable | | Disable the logfile | --logfile-disable",
- " | --truecrypt-keyfiles | File | Keyfiles used, separate with comma | --truecrypt-keyfiles=xx.png",
- " | --veracrypt-keyfiles | File | Keyfiles used, separate with comma | --veracrypt-keyfiles=xx.png",
- " | --veracrypt-pim | Number | VeraCrypt personal iterations multiplier | --veracrypt-pim=1000",
- " -b | --benchmark | | Run benchmark | -b",
- " -c | --segment-size | Number | Sets size in MB to cache from the wordfile to X | -c 32",
- " | --bitmap-min | Number | Sets minimum bits allowed for bitmaps to X | --bitmap-min=24",
- " | --bitmap-max | Number | Sets maximum bits allowed for bitmaps to X | --bitmap-min=24",
- " | --cpu-affinity | String | Locks to CPU devices, separate with comma | --cpu-affinity=1,2,3,4",
- " | --opencl-platforms | String | OpenCL platforms to use, separate with comma | --opencl-platforms=2",
- " -d | --opencl-devices | String | OpenCL devices to use, separate with comma | -d 1",
- " | --opencl-device-types | String | OpenCL device-types to use, separate with comma | --opencl-device-types=1,2",
- " | --opencl-vector-width | Number | Manual override OpenCL vector-width to X | --opencl-vector-width=4",
- " -w | --workload-profile | Number | Enable a specific workload profile, see pool below | -w 3",
- " -n | --kernel-accel | Number | Manual workload tuning, set outerloop step size to X | -n 64",
- " -u | --kernel-loops | Number | Manual workload tuning, set innerloop step size to X | -u 256",
- " | --gpu-temp-disable | | Disable temperature and fanspeed reads and triggers | --gpu-temp-disable",
+ " Options Short / Long | Type | Description | Example",
+ "===============================|======|======================================================|=======================",
+ " -m, --hash-type | Num | Hash-type, see references below | -m 1000",
+ " -a, --attack-mode | Num | Attack-mode, see references below | -a 3",
+ " -V, --version | | Print version |",
+ " -h, --help | | Print help |",
+ " --quiet | | Suppress output |",
+ " --hex-charset | | Assume charset is given in hex |",
+ " --hex-salt | | Assume salt is given in hex |",
+ " --hex-wordlist | | Assume words in wordlist is given in hex |",
+ " --force | | Ignore warnings |",
+ " --status | | Enable automatic update of the status-screen |",
+ " --status-timer | Num | Sets seconds between status-screen update to X | --status-timer=1",
+ " --status-automat | | Display the status view in a machine readable format |",
+ " --loopback | | Add new plains to induct directory |",
+ " --weak-hash-threshold | Num | Threshold X when to stop checking for weak hashes | --weak=0",
+ " --markov-hcstat | File | Specify hcstat file to use | --markov-hc=my.hcstat",
+ " --markov-disable | | Disables markov-chains, emulates classic brute-force |",
+ " --markov-classic | | Enables classic markov-chains, no per-position |",
+ " -t, --markov-threshold | Num | Threshold X when to stop accepting new markov-chains | -t 50",
+ " --runtime | Num | Abort session after X seconds of runtime | --runtime=10",
+ " --session | Str | Define specific session name | --session=mysession",
+ " --restore | | Restore session from --session |",
+ " --restore-disable | | Do not write restore file |",
+ " -o, --outfile | File | Define outfile for recovered hash | -o outfile.txt",
+ " --outfile-format | Num | Define outfile-format X for recovered hash | --outfile-format=7",
+ " --outfile-autohex-disable | | Disable the use of $HEX[] in output plains |",
+ " --outfile-check-timer | Num | Sets seconds between outfile checks to X | --outfile-check=30",
+ " -p, --separator | Char | Separator char for hashlists and outfile | -p :",
+ " --show | | Show cracked passwords only |",
+ " --left | | Show un-cracked passwords only |",
+ " --username | | Enable ignoring of usernames in hashfile |",
+ " --remove | | Enable remove of hash once it is cracked |",
+ " --remove-timer | Num | Update input hash file each X seconds | --remove-timer=30",
+ " --potfile-disable | | Do not write potfile |",
+ " --potfile-path | Dir | Specific path to potfile | --potfile-path=my.pot",
+ " --debug-mode | Num | Defines the debug mode (hybrid only by using rules) | --debug-mode=4",
+ " --debug-file | File | Output file for debugging rules | --debug-file=good.log",
+ " --induction-dir | Dir | Specify the induction directory to use for loopback | --induction=inducts",
+ " --outfile-check-dir | Dir | Specify the outfile directory to monitor for plains | --outfile-check-dir=x",
+ " --logfile-disable | | Disable the logfile |",
+ " --truecrypt-keyfiles | File | Keyfiles used, separate with comma | --truecrypt-key=x.png",
+ " --veracrypt-keyfiles | File | Keyfiles used, separate with comma | --veracrypt-key=x.txt",
+ " --veracrypt-pim | Num | VeraCrypt personal iterations multiplier | --veracrypt-pim=1000",
+ " -b, --benchmark | | Run benchmark |",
+ " -c, --segment-size | Num | Sets size in MB to cache from the wordfile to X | -c 32",
+ " --bitmap-min | Num | Sets minimum bits allowed for bitmaps to X | --bitmap-min=24",
+ " --bitmap-max | Num | Sets maximum bits allowed for bitmaps to X | --bitmap-min=24",
+ " --cpu-affinity | Str | Locks to CPU devices, separate with comma | --cpu-affinity=1,2,3",
+ " --opencl-platforms | Str | OpenCL platforms to use, separate with comma | --opencl-platforms=2",
+ " -d, --opencl-devices | Str | OpenCL devices to use, separate with comma | -d 1",
+ " --opencl-device-types | Str | OpenCL device-types to use, separate with comma | --opencl-device-type=1",
+ " --opencl-vector-width | Num | Manual override OpenCL vector-width to X | --opencl-vector=4",
+ " -w, --workload-profile | Num | Enable a specific workload profile, see pool below | -w 3",
+ " -n, --kernel-accel | Num | Manual workload tuning, set outerloop step size to X | -n 64",
+ " -u, --kernel-loops | Num | Manual workload tuning, set innerloop step size to X | -u 256",
+ " --gpu-temp-disable | | Disable temperature and fanspeed reads and triggers |",
#ifdef HAVE_HWMON
- " | --gpu-temp-abort | Number | Abort if GPU temperature reaches X degrees celsius | --gpu-temp-abort=100",
- " | --gpu-temp-retain | Number | Try to retain GPU temperature at X degrees celsius | --gpu-temp-retain=95",
+ " --gpu-temp-abort | Num | Abort if GPU temperature reaches X degrees celsius | --gpu-temp-abort=100",
+ " --gpu-temp-retain | Num | Try to retain GPU temperature at X degrees celsius | --gpu-temp-retain=95",
#ifdef HAVE_ADL
- " | --powertune-enable | | Enable automatic power tuning (AMD OverDrive 6 only) | --powertune-enable",
+ " --powertune-enable | | Enable automatic power tuning (AMD OverDrive 6 only) |",
#endif
#endif
- " | --scrypt-tmto | Number | Manually override TMTO value for scrypt to X | --scrypt-tmto=3",
- " -s | --skip | Number | Skip X words from the start | -s 1000000",
- " -l | --limit | Number | Limit X words from the start + skipped words | -l 1000000",
- " | --keyspace | | Show keyspace base:mod values and quit | --keyspace",
- " -j | --rule-left | Rule | Single Rule applied to each word from left wordlist | -j 'c'",
- " -k | --rule-right | Rule | Single Rule applied to each word from right wordlist | -k '^-'",
- " -r | --rules-file | File | Multiple Rules applied to each word from wordlists | -r rules/best64.rule",
- " -g | --generate-rules | | Enable generate random rules | -g 10000",
- " | --generate-rules-func-min | Number | Force min X funcs per rule |",
- " | --generate-rules-func-max | Number | Force max X funcs per rule |",
- " | --generate-rules-seed | Number | Force RNG seed set to X |",
- " -1 | --custom-charset1 | Charset | User-defined charset ?1 | -1 ?l?d?u",
- " -2 | --custom-charset2 | Charset | User-defined charset ?2 | -2 ?l?d?s",
- " -3 | --custom-charset3 | Charset | User-defined charset ?3 |",
- " -4 | --custom-charset4 | Charset | User-defined charset ?4 |",
- " -i | --increment | | Enable mask increment mode | --increment",
- " | --increment-min | Number | Start mask incrementing at X | --increment-min=4",
- " | --increment-max | Number | Stop mask incrementing at X | --increment-max=8",
+ " --scrypt-tmto | Num | Manually override TMTO value for scrypt to X | --scrypt-tmto=3",
+ " -s, --skip | Num | Skip X words from the start | -s 1000000",
+ " -l, --limit | Num | Limit X words from the start + skipped words | -l 1000000",
+ " --keyspace | | Show keyspace base:mod values and quit |",
+ " -j, --rule-left | Rule | Single Rule applied to each word from left wordlist | -j 'c'",
+ " -k, --rule-right | Rule | Single Rule applied to each word from right wordlist | -k '^-'",
+ " -r, --rules-file | File | Multiple Rules applied to each word from wordlists | -r rules/best64.rule",
+ " -g, --generate-rules | Num | Generate X random rules | -g 10000",
+ " --generate-rules-func-min | Num | Force min X funcs per rule |",
+ " --generate-rules-func-max | Num | Force max X funcs per rule |",
+ " --generate-rules-seed | Num | Force RNG seed set to X |",
+ " -1, --custom-charset1 | CS | User-defined charset ?1 | -1 ?l?d?u",
+ " -2, --custom-charset2 | CS | User-defined charset ?2 | -2 ?l?d?s",
+ " -3, --custom-charset3 | CS | User-defined charset ?3 |",
+ " -4, --custom-charset4 | CS | User-defined charset ?4 |",
+ " -i, --increment | | Enable mask increment mode |",
+ " --increment-min | Num | Start mask incrementing at X | --increment-min=4",
+ " --increment-max | Num | Stop mask incrementing at X | --increment-max=8",
"",
"################",
"## Hash modes ##",
"",
" # | Performance | Runtime | Power Consumption | Desktop Impact",
" ---+-------------+---------+-------------------+----------------",
- " 1 | Low | 8 ms | Low | Minimal",
- " 2 | Default | 16 ms | Economic | Noticeable",
+ " 1 | Low | 2 ms | Low | Minimal",
+ " 2 | Default | 12 ms | Economic | Noticeable",
" 3 | High | 96 ms | High | Unresponsive",
- " 4 | Nightmare | 512 ms | Insane | Headless",
+ " 4 | Nightmare | 480 ms | Insane | Headless",
"",
- "If you have no idea what just happend, please visit the following pages:",
+ "If you have no idea what just happened then visit the following pages:",
"",
"* https://hashcat.net/wiki/#howtos_videos_papers_articles_etc_in_the_wild",
"* https://hashcat.net/wiki/#frequently_asked_questions",
hm_device_val_to_str ((char *) utilization, HM_STR_BUF_SIZE, "%", hm_get_utilization_with_device_id (device_id));
hm_device_val_to_str ((char *) temperature, HM_STR_BUF_SIZE, "c", hm_get_temperature_with_device_id (device_id));
- if (device_param->vendor_id == VENDOR_ID_AMD)
+ if (device_param->device_vendor_id == VENDOR_ID_AMD)
{
hm_device_val_to_str ((char *) fanspeed, HM_STR_BUF_SIZE, "%", hm_get_fanspeed_with_device_id (device_id));
}
- else if (device_param->vendor_id == VENDOR_ID_NV)
+ else if (device_param->device_vendor_id == VENDOR_ID_NV)
{
hm_device_val_to_str ((char *) fanspeed, HM_STR_BUF_SIZE, "%", hm_get_fanspeed_with_device_id (device_id));
}
if (data.digests_shown[hash_pos] == 1) continue;
+ hc_thread_mutex_lock (mux_display);
+
if ((data.opts_type & OPTS_TYPE_PT_NEVERCRACK) == 0)
{
data.digests_shown[hash_pos] = 1;
if (data.salts_done == data.salts_cnt) data.devices_status = STATUS_CRACKED;
+ hc_thread_mutex_unlock (mux_display);
+
check_hash (device_param, &cracked[i]);
}
if (cpt_cracked > 0)
{
+ hc_thread_mutex_lock (mux_display);
+
data.cpt_buf[data.cpt_pos].timestamp = time (NULL);
data.cpt_buf[data.cpt_pos].cracked = cpt_cracked;
data.cpt_total += cpt_cracked;
if (data.cpt_pos == CPT_BUF) data.cpt_pos = 0;
+
+ hc_thread_mutex_unlock (mux_display);
}
if (data.opts_type & OPTS_TYPE_PT_NEVERCRACK)
{
int rc = -1;
- if (device_param->opencl_v12 && device_param->vendor_id == VENDOR_ID_AMD)
+ if (device_param->opencl_v12 && device_param->platform_vendor_id == VENDOR_ID_AMD)
{
// So far tested, amd is the only supporting this OpenCL 1.2 function without segfaulting
}
else if (data.attack_kern == ATTACK_KERN_COMBI)
{
- if (data.attack_mode == ATTACK_MODE_HYBRID2)
+ if (data.attack_mode == ATTACK_MODE_COMBI)
+ {
+ if (data.combs_mode == COMBINATOR_MODE_BASE_RIGHT)
+ {
+ if (data.opts_type & OPTS_TYPE_PT_ADD01)
+ {
+ for (u32 i = 0; i < pws_cnt; i++)
+ {
+ const u32 pw_len = device_param->pws_buf[i].pw_len;
+
+ u8 *ptr = (u8 *) device_param->pws_buf[i].i;
+
+ ptr[pw_len] = 0x01;
+ }
+ }
+ else if (data.opts_type & OPTS_TYPE_PT_ADD80)
+ {
+ for (u32 i = 0; i < pws_cnt; i++)
+ {
+ const u32 pw_len = device_param->pws_buf[i].pw_len;
+
+ u8 *ptr = (u8 *) device_param->pws_buf[i].i;
+
+ ptr[pw_len] = 0x80;
+ }
+ }
+ }
+ }
+ else if (data.attack_mode == ATTACK_MODE_HYBRID2)
{
if (data.opts_type & OPTS_TYPE_PT_ADD01)
{
try_run (device_param, kernel_accel, kernel_loops);
try_run (device_param, kernel_accel, kernel_loops);
+ device_param->kernel_accel = kernel_accel;
+ device_param->kernel_loops = kernel_loops;
+
+ const u32 kernel_power = device_param->device_processors * device_param->kernel_threads * device_param->kernel_accel;
+
+ device_param->kernel_power = kernel_power;
+
return;
}
exec_ms_pre_final = MIN (exec_ms_pre_final, exec_ms_pre_final_v);
}
+ u32 diff = kernel_loops - kernel_accel;
+
if ((kernel_loops_min < kernel_loops_max) && (kernel_accel_min < kernel_accel_max))
{
- for (u32 f = 2; f < 1024; f++)
+ u32 kernel_accel_orig = kernel_accel;
+ u32 kernel_loops_orig = kernel_loops;
+
+ for (u32 f = 1; f < 1024; f++)
{
- const u32 kernel_accel_try = kernel_accel * f;
- const u32 kernel_loops_try = kernel_loops / f;
+ const u32 kernel_accel_try = (float) kernel_accel_orig * f;
+ const u32 kernel_loops_try = (float) kernel_loops_orig / f;
if (kernel_accel_try > kernel_accel_max) break;
if (kernel_loops_try < kernel_loops_min) break;
+ u32 diff_new = kernel_loops_try - kernel_accel_try;
+
+ if (diff_new > diff) break;
+
+ diff_new = diff;
+
double exec_ms = try_run (device_param, kernel_accel_try, kernel_loops_try);
for (int i = 0; i < VERIFIER_CNT; i++)
const double accel_left = kernel_accel_max / kernel_accel;
- const int exec_accel_min = MIN (exec_left, accel_left); // we want that to be int
+ const double exec_accel_min = MIN (exec_left, accel_left); // we want that to be int
- if (exec_accel_min >= 2)
+ if (exec_accel_min >= 1.0)
{
// this is safe to not overflow kernel_accel_max because of accel_left
- kernel_accel *= exec_accel_min;
+ kernel_accel = (double) kernel_accel * exec_accel_min;
}
// reset them fake words
* result
*/
- hc_thread_mutex_lock (mux_display);
-
check_cracked (device_param, salt_pos);
- hc_thread_mutex_unlock (mux_display);
-
/**
* progress
*/
hc_timer_set (&device_param->timer_speed);
- hc_thread_mutex_lock (mux_display);
-
// current speed
+ //hc_thread_mutex_lock (mux_display);
+
device_param->speed_cnt[speed_pos] = perf_sum_all;
device_param->speed_ms[speed_pos] = speed_ms;
- hc_thread_mutex_unlock (mux_display);
+ //hc_thread_mutex_unlock (mux_display);
speed_pos++;
if (status_left == 0)
{
- hc_thread_mutex_lock (mux_display);
+ //hc_thread_mutex_lock (mux_display);
if (data.quiet == 0) clear_prompt ();
if (data.quiet == 0) log_info ("");
- hc_thread_mutex_unlock (mux_display);
+ //hc_thread_mutex_unlock (mux_display);
status_left = data.status_timer;
}
}
}
- if ((workload_profile < 1) || (workload_profile > 3))
+ if ((workload_profile < 1) || (workload_profile > 4))
{
log_error ("ERROR: workload-profile %i not available", workload_profile);
// this causes trouble with vendor id based macros
// we'll assign generic to those without special optimization available
- cl_uint vendor_id = 0;
+ cl_uint platform_vendor_id = 0;
if (strcmp (platform_vendor, CL_VENDOR_AMD) == 0)
{
- vendor_id = VENDOR_ID_AMD;
+ platform_vendor_id = VENDOR_ID_AMD;
+ }
+ else if (strcmp (platform_vendor, CL_VENDOR_AMD_USE_INTEL) == 0)
+ {
+ platform_vendor_id = VENDOR_ID_AMD_USE_INTEL;
}
else if (strcmp (platform_vendor, CL_VENDOR_APPLE) == 0)
{
- vendor_id = VENDOR_ID_APPLE;
+ platform_vendor_id = VENDOR_ID_APPLE;
}
else if (strcmp (platform_vendor, CL_VENDOR_INTEL_BEIGNET) == 0)
{
- vendor_id = VENDOR_ID_INTEL_BEIGNET;
+ platform_vendor_id = VENDOR_ID_INTEL_BEIGNET;
}
else if (strcmp (platform_vendor, CL_VENDOR_INTEL_SDK) == 0)
{
- vendor_id = VENDOR_ID_INTEL_SDK;
+ platform_vendor_id = VENDOR_ID_INTEL_SDK;
}
else if (strcmp (platform_vendor, CL_VENDOR_MESA) == 0)
{
- vendor_id = VENDOR_ID_MESA;
+ platform_vendor_id = VENDOR_ID_MESA;
}
else if (strcmp (platform_vendor, CL_VENDOR_NV) == 0)
{
- vendor_id = VENDOR_ID_NV;
+ platform_vendor_id = VENDOR_ID_NV;
}
else if (strcmp (platform_vendor, CL_VENDOR_POCL) == 0)
{
- vendor_id = VENDOR_ID_POCL;
+ platform_vendor_id = VENDOR_ID_POCL;
}
else
{
- vendor_id = VENDOR_ID_GENERIC;
+ platform_vendor_id = VENDOR_ID_GENERIC;
}
for (uint platform_devices_id = 0; platform_devices_id < platform_devices_cnt; platform_devices_id++)
hc_device_param_t *device_param = &data.devices_param[device_id];
- device_param->vendor_id = vendor_id;
+ device_param->platform_vendor_id = platform_vendor_id;
device_param->device = platform_devices[platform_devices_id];
device_param->device_name = device_name;
+ // device_vendor
+
+ hc_clGetDeviceInfo (data.ocl, device_param->device, CL_DEVICE_VENDOR, 0, NULL, ¶m_value_size);
+
+ char *device_vendor = (char *) mymalloc (param_value_size);
+
+ hc_clGetDeviceInfo (data.ocl, device_param->device, CL_DEVICE_VENDOR, param_value_size, device_vendor, NULL);
+
+ device_param->device_vendor = device_vendor;
+
+ cl_uint device_vendor_id = 0;
+
+ if (strcmp (device_vendor, CL_VENDOR_AMD) == 0)
+ {
+ device_vendor_id = VENDOR_ID_AMD;
+ }
+ else if (strcmp (device_vendor, CL_VENDOR_AMD_USE_INTEL) == 0)
+ {
+ device_vendor_id = VENDOR_ID_AMD_USE_INTEL;
+ }
+ else if (strcmp (device_vendor, CL_VENDOR_APPLE) == 0)
+ {
+ device_vendor_id = VENDOR_ID_APPLE;
+ }
+ else if (strcmp (device_vendor, CL_VENDOR_INTEL_BEIGNET) == 0)
+ {
+ device_vendor_id = VENDOR_ID_INTEL_BEIGNET;
+ }
+ else if (strcmp (device_vendor, CL_VENDOR_INTEL_SDK) == 0)
+ {
+ device_vendor_id = VENDOR_ID_INTEL_SDK;
+ }
+ else if (strcmp (device_vendor, CL_VENDOR_MESA) == 0)
+ {
+ device_vendor_id = VENDOR_ID_MESA;
+ }
+ else if (strcmp (device_vendor, CL_VENDOR_NV) == 0)
+ {
+ device_vendor_id = VENDOR_ID_NV;
+ }
+ else if (strcmp (device_vendor, CL_VENDOR_POCL) == 0)
+ {
+ device_vendor_id = VENDOR_ID_POCL;
+ }
+ else
+ {
+ device_vendor_id = VENDOR_ID_GENERIC;
+ }
+
+ device_param->device_vendor_id = device_vendor_id;
+
// tuning db
tuning_db_entry_t *tuningdb_entry = tuning_db_search (tuning_db, device_param, attack_mode, hash_mode);
if (device_endian_little == CL_FALSE)
{
- log_info ("Device #%u: WARNING: not little endian device", device_id + 1);
+ if (data.quiet == 0) log_info ("Device #%u: WARNING: not little endian device", device_id + 1);
device_param->skipped = 1;
}
if (device_available == CL_FALSE)
{
- log_info ("Device #%u: WARNING: device not available", device_id + 1);
+ if (data.quiet == 0) log_info ("Device #%u: WARNING: device not available", device_id + 1);
device_param->skipped = 1;
}
if (device_compiler_available == CL_FALSE)
{
- log_info ("Device #%u: WARNING: device no compiler available", device_id + 1);
+ if (data.quiet == 0) log_info ("Device #%u: WARNING: device no compiler available", device_id + 1);
device_param->skipped = 1;
}
if ((device_execution_capabilities & CL_EXEC_KERNEL) == 0)
{
- log_info ("Device #%u: WARNING: device does not support executing kernels", device_id + 1);
+ if (data.quiet == 0) log_info ("Device #%u: WARNING: device does not support executing kernels", device_id + 1);
device_param->skipped = 1;
}
if (strstr (device_extensions, "base_atomics") == 0)
{
- log_info ("Device #%u: WARNING: device does not support base atomics", device_id + 1);
+ if (data.quiet == 0) log_info ("Device #%u: WARNING: device does not support base atomics", device_id + 1);
device_param->skipped = 1;
}
if (strstr (device_extensions, "byte_addressable_store") == 0)
{
- log_info ("Device #%u: WARNING: device does not support byte addressable store", device_id + 1);
+ if (data.quiet == 0) log_info ("Device #%u: WARNING: device does not support byte addressable store", device_id + 1);
device_param->skipped = 1;
}
if (device_local_mem_size < 32768)
{
- log_info ("Device #%u: WARNING: device local mem size is too small", device_id + 1);
+ if (data.quiet == 0) log_info ("Device #%u: WARNING: device local mem size is too small", device_id + 1);
device_param->skipped = 1;
}
+ // If there's both an Intel CPU and an AMD OpenCL runtime it's a tricky situation
+ // Both platforms support CPU device types and therefore both will try to use 100% of the physical resources
+ // This results in both utilizing it for 50%
+ // However, Intel has much better SIMD control over their own hardware
+ // It makes sense to give them full control over their own hardware
+
+ if (device_type & CL_DEVICE_TYPE_CPU)
+ {
+ if (device_param->device_vendor_id == VENDOR_ID_AMD_USE_INTEL)
+ {
+ if (data.quiet == 0) log_info ("Device #%u: WARNING: not native intel opencl platform", device_id + 1);
+
+ device_param->skipped = 1;
+ }
+ }
// skipped
char *device_name_chksum = (char *) mymalloc (INFOSZ);
#if __x86_64__
- snprintf (device_name_chksum, INFOSZ - 1, "%u-%u-%u-%s-%s-%s-%u", 64, device_param->vendor_id, device_param->vector_width, device_param->device_name, device_param->device_version, device_param->driver_version, COMPTIME);
+ snprintf (device_name_chksum, INFOSZ - 1, "%u-%u-%u-%s-%s-%s-%u", 64, device_param->platform_vendor_id, device_param->vector_width, device_param->device_name, device_param->device_version, device_param->driver_version, COMPTIME);
#else
- snprintf (device_name_chksum, INFOSZ - 1, "%u-%u-%u-%s-%s-%s-%u", 32, device_param->vendor_id, device_param->vector_width, device_param->device_name, device_param->device_version, device_param->driver_version, COMPTIME);
+ snprintf (device_name_chksum, INFOSZ - 1, "%u-%u-%u-%s-%s-%s-%u", 32, device_param->platform_vendor_id, device_param->vector_width, device_param->device_name, device_param->device_version, device_param->driver_version, COMPTIME);
#endif
uint device_name_digest[4] = { 0 };
if (device_type & CL_DEVICE_TYPE_GPU)
{
- if (vendor_id == VENDOR_ID_AMD)
+ if (device_vendor_id == VENDOR_ID_AMD)
{
cl_uint device_processor_cores = 0;
device_param->device_processor_cores = device_processor_cores;
}
- else if (vendor_id == VENDOR_ID_NV)
+ else if (device_vendor_id == VENDOR_ID_NV)
{
cl_uint kernel_exec_timeout = 0;
{
if (device_type & CL_DEVICE_TYPE_GPU)
{
- if (vendor_id == VENDOR_ID_AMD)
+ if (platform_vendor_id == VENDOR_ID_AMD)
{
int catalyst_check = (force == 1) ? 0 : 1;
return (-1);
}
}
- else if (vendor_id == VENDOR_ID_NV)
+ else if (platform_vendor_id == VENDOR_ID_NV)
{
if (device_param->kernel_exec_timeout != 0)
{
}
}
+ /* turns out pocl still creates segfaults (because of llvm)
if (device_type & CL_DEVICE_TYPE_CPU)
{
- if (vendor_id == VENDOR_ID_AMD)
+ if (platform_vendor_id == VENDOR_ID_AMD)
{
if (force == 0)
{
}
}
}
+ */
/**
* kernel accel and loops tuning db adjustment
const uint platform_devices_id = device_param->platform_devices_id;
#if defined(HAVE_NVML) || defined(HAVE_NVAPI)
- if (device_param->vendor_id == VENDOR_ID_NV)
+ if (device_param->device_vendor_id == VENDOR_ID_NV)
{
memcpy (&data.hm_device[device_id], &hm_adapters_nv[platform_devices_id], sizeof (hm_attrs_t));
}
#endif
#ifdef HAVE_ADL
- if (device_param->vendor_id == VENDOR_ID_AMD)
+ if (device_param->device_vendor_id == VENDOR_ID_AMD)
{
memcpy (&data.hm_device[device_id], &hm_adapters_amd[platform_devices_id], sizeof (hm_attrs_t));
}
if (hash_mode == 8900)
{
- if (device_param->vendor_id == VENDOR_ID_AMD)
+ if (device_param->device_vendor_id == VENDOR_ID_AMD)
{
tmto_start = 1;
}
- else if (device_param->vendor_id == VENDOR_ID_NV)
+ else if (device_param->device_vendor_id == VENDOR_ID_NV)
{
tmto_start = 2;
}
}
else if (hash_mode == 9300)
{
- if (device_param->vendor_id == VENDOR_ID_AMD)
+ if (device_param->device_vendor_id == VENDOR_ID_AMD)
{
tmto_start = 2;
}
- else if (device_param->vendor_id == VENDOR_ID_NV)
+ else if (device_param->device_vendor_id == VENDOR_ID_NV)
{
tmto_start = 2;
}
int skip = 0;
- if (size_pws > device_param->device_maxmem_alloc) skip = 1;
- if (size_tmps > device_param->device_maxmem_alloc) skip = 1;
- if (size_hooks > device_param->device_maxmem_alloc) skip = 1;
-
- if (( bitmap_size
- + bitmap_size
- + bitmap_size
- + bitmap_size
- + bitmap_size
- + bitmap_size
- + bitmap_size
- + bitmap_size
- + size_bfs
- + size_combs
- + size_digests
- + size_esalts
- + size_hooks
- + size_markov_css
- + size_plains
- + size_pws
- + size_pws // not a bug
- + size_results
- + size_root_css
- + size_rules
- + size_rules_c
- + size_salts
- + size_scryptV
- + size_shown
- + size_tm
- + size_tmps) > device_param->device_global_mem) skip = 1;
+ const u64 size_total
+ = bitmap_size
+ + bitmap_size
+ + bitmap_size
+ + bitmap_size
+ + bitmap_size
+ + bitmap_size
+ + bitmap_size
+ + bitmap_size
+ + size_bfs
+ + size_combs
+ + size_digests
+ + size_esalts
+ + size_hooks
+ + size_markov_css
+ + size_plains
+ + size_pws
+ + size_pws // not a bug
+ + size_results
+ + size_root_css
+ + size_rules
+ + size_rules_c
+ + size_salts
+ + size_scryptV
+ + size_shown
+ + size_tm
+ + size_tmps;
+
+ // Don't ask me, ask AMD!
+
+ if (size_total > device_param->device_maxmem_alloc) skip = 1;
+ if (size_total > device_param->device_global_mem) skip = 1;
if (skip == 1)
{
// we don't have sm_* on vendors not NV but it doesn't matter
- snprintf (build_opts, sizeof (build_opts) - 1, "-cl-std=CL1.1 -I\"%s/\" -DVENDOR_ID=%u -DCUDA_ARCH=%d -DVECT_SIZE=%u -DDEVICE_TYPE=%u -DKERN_TYPE=%u -D_unroll", shared_dir, device_param->vendor_id, (device_param->sm_major * 100) + device_param->sm_minor, device_param->vector_width, (u32) device_param->device_type, kern_type);
+ #if _WIN
+ snprintf (build_opts, sizeof (build_opts) - 1, "-I \"%s\\OpenCL\\\" -I '%s\\OpenCL\\' -I %s\\OpenCL\\ -I\"%s\\OpenCL\\\" -I'%s\\OpenCL\\' -I%s\\OpenCL\\", shared_dir, shared_dir, shared_dir, shared_dir, shared_dir, shared_dir);
+ #else
+ snprintf (build_opts, sizeof (build_opts) - 1, "-I \"%s/OpenCL/\" -I '%s/OpenCL/' -I %s/OpenCL/ -I\"%s/OpenCL/\" -I'%s/OpenCL/' -I%s/OpenCL/", shared_dir, shared_dir, shared_dir, shared_dir, shared_dir, shared_dir);
+ #endif
+
+ char build_opts_new[1024] = { 0 };
- if (device_param->vendor_id == VENDOR_ID_INTEL_SDK)
+ snprintf (build_opts_new, sizeof (build_opts_new) - 1, "%s -DVENDOR_ID=%u -DCUDA_ARCH=%d -DVECT_SIZE=%u -DDEVICE_TYPE=%u -DKERN_TYPE=%u -D_unroll -cl-std=CL1.1", build_opts, device_param->device_vendor_id, (device_param->sm_major * 100) + device_param->sm_minor, device_param->vector_width, (u32) device_param->device_type, kern_type);
+
+ strncpy (build_opts, build_opts_new, sizeof (build_opts) - 1);
+
+ /*
+ if (device_param->device_vendor_id == VENDOR_ID_INTEL_SDK)
{
// we do vectorizing much better than the auto-vectorizer
- char build_opts_new[1024] = { 0 };
-
snprintf (build_opts_new, sizeof (build_opts_new) - 1, "%s -cl-opt-disable", build_opts);
strncpy (build_opts, build_opts_new, sizeof (build_opts) - 1);
}
+ */
#ifdef DEBUG
log_info ("Device #%u: build_opts '%s'\n", device_id + 1, build_opts);