Re-enable POCL is version detected is >= 1.5 and LLVM is >= 9.x and also remove performance warning. Still prefers native OpenCL runtime in alias detection, but this default can be overriden using -d parameter.

pull/2431/head
Jens Steube 4 years ago
parent c51b6391c9
commit 34f71aaea3

@ -121,7 +121,7 @@
- File handling: Print a truncation warning when an oversized line is detected - File handling: Print a truncation warning when an oversized line is detected
- My Wallet: Added additional plaintext pattern used in newer versions - My Wallet: Added additional plaintext pattern used in newer versions
- Office cracking: Support hash format with second block data for 40-bit oldoffice files (eliminates false positives) - Office cracking: Support hash format with second block data for 40-bit oldoffice files (eliminates false positives)
- OpenCL Runtime: Added a warning if OpenCL runtime NEO, Beignet, POCL or MESA is detected and skip associated devices (override with --force) - OpenCL Runtime: Added a warning if OpenCL runtime NEO, Beignet, POCL (v1.4 or older) or MESA is detected and skip associated devices (override with --force)
- OpenCL Runtime: Disable OpenCL kernel cache on Apple for Intel CPU (throws CL_BUILD_PROGRAM_FAILURE for no reason) - OpenCL Runtime: Disable OpenCL kernel cache on Apple for Intel CPU (throws CL_BUILD_PROGRAM_FAILURE for no reason)
- OpenCL Runtime: Do not run shared- and constant-memory size checks if their memory type is of type global memory (typically CPU) - OpenCL Runtime: Do not run shared- and constant-memory size checks if their memory type is of type global memory (typically CPU)
- OpenCL Runtime: Improve ROCm detection and make sure to not confuse with recent AMDGPU drivers - OpenCL Runtime: Improve ROCm detection and make sure to not confuse with recent AMDGPU drivers

@ -346,6 +346,7 @@ NVIDIA GPUs require "NVIDIA Driver" (440.64 or later) and "CUDA Toolkit" (9.0 or
- Apple - Apple
- Intel - Intel
- NVidia - NVidia
- POCL
## ##
## Supported OpenCL device types ## Supported OpenCL device types

@ -54,22 +54,16 @@ static int backend_ctx_find_alias_devices (hashcat_ctx_t *hashcat_ctx)
{ {
backend_ctx_t *backend_ctx = hashcat_ctx->backend_ctx; backend_ctx_t *backend_ctx = hashcat_ctx->backend_ctx;
// first identify all aliases
for (int backend_devices_cnt_src = 0; backend_devices_cnt_src < backend_ctx->backend_devices_cnt; backend_devices_cnt_src++) for (int backend_devices_cnt_src = 0; backend_devices_cnt_src < backend_ctx->backend_devices_cnt; backend_devices_cnt_src++)
{ {
hc_device_param_t *device_param_src = &backend_ctx->devices_param[backend_devices_cnt_src]; hc_device_param_t *device_param_src = &backend_ctx->devices_param[backend_devices_cnt_src];
if (device_param_src->skipped == true) continue;
if (device_param_src->skipped_warning == true) continue;
for (int backend_devices_cnt_dst = backend_devices_cnt_src + 1; backend_devices_cnt_dst < backend_ctx->backend_devices_cnt; backend_devices_cnt_dst++) for (int backend_devices_cnt_dst = backend_devices_cnt_src + 1; backend_devices_cnt_dst < backend_ctx->backend_devices_cnt; backend_devices_cnt_dst++)
{ {
hc_device_param_t *device_param_dst = &backend_ctx->devices_param[backend_devices_cnt_dst]; hc_device_param_t *device_param_dst = &backend_ctx->devices_param[backend_devices_cnt_dst];
if (device_param_dst->skipped == true) continue;
if (device_param_dst->skipped_warning == true) continue;
if (is_same_device (device_param_src, device_param_dst) == false) continue; if (is_same_device (device_param_src, device_param_dst) == false) continue;
device_param_src->device_id_alias_buf[device_param_src->device_id_alias_cnt] = device_param_dst->device_id; device_param_src->device_id_alias_buf[device_param_src->device_id_alias_cnt] = device_param_dst->device_id;
@ -77,18 +71,42 @@ static int backend_ctx_find_alias_devices (hashcat_ctx_t *hashcat_ctx)
device_param_dst->device_id_alias_buf[device_param_dst->device_id_alias_cnt] = device_param_src->device_id; device_param_dst->device_id_alias_buf[device_param_dst->device_id_alias_cnt] = device_param_src->device_id;
device_param_dst->device_id_alias_cnt++; device_param_dst->device_id_alias_cnt++;
}
}
if (device_param_dst->is_opencl == true) // find the alias to skip
{
if (device_param_dst->skipped == false) for (int backend_devices_pos = 0; backend_devices_pos < backend_ctx->backend_devices_cnt; backend_devices_pos++)
{ {
device_param_dst->skipped = true; hc_device_param_t *backend_device = &backend_ctx->devices_param[backend_devices_pos];
backend_ctx->opencl_devices_active--; if (backend_device->skipped == true) continue;
backend_ctx->backend_devices_active--; if (backend_device->skipped_warning == true) continue;
}
} for (int device_id_alias_pos = 0; device_id_alias_pos < backend_device->device_id_alias_cnt; device_id_alias_pos++)
{
const int alias_pos = backend_device->device_id_alias_buf[device_id_alias_pos];
hc_device_param_t *alias_device = &backend_ctx->devices_param[alias_pos];
if (alias_device->skipped == true) continue;
if (alias_device->skipped_warning == true) continue;
// this lets CUDA devices survive over OpenCL
if (alias_device->is_cuda == true) continue;
// this lets native OpenCL runtime survive over generic OpenCL runtime
if (alias_device->opencl_platform_vendor_id == alias_device->opencl_device_vendor_id) continue;
alias_device->skipped = true;
backend_ctx->opencl_devices_active--;
backend_ctx->backend_devices_active--;
} }
} }
@ -5972,23 +5990,61 @@ int backend_ctx_devices_init (hashcat_ctx_t *hashcat_ctx, const int comptime)
device_param->device_local_mem_size = device_local_mem_size; device_param->device_local_mem_size = device_local_mem_size;
// If there's both an Intel CPU and an AMD OpenCL runtime it's a tricky situation // older POCL version and older LLVM versions are known to fail compiling kernels
// Both platforms support CPU device types and therefore both will try to use 100% of the physical resources // we need to inform the user to update
// This results in both utilizing it for 50% // https://github.com/hashcat/hashcat/issues/2344
// However, Intel has much better SIMD control over their own hardware
// It makes sense to give them full control over their own hardware
if (opencl_device_type & CL_DEVICE_TYPE_CPU) if (opencl_platform_vendor_id == VENDOR_ID_POCL)
{ {
if (device_param->opencl_device_vendor_id == VENDOR_ID_AMD_USE_INTEL) char *pocl_version_ptr = strstr (opencl_platform_version, "pocl ");
char *llvm_version_ptr = strstr (opencl_platform_version, "LLVM ");
if ((pocl_version_ptr != NULL) && (llvm_version_ptr != NULL))
{ {
if (user_options->force == false) bool pocl_skip = false;
int pocl_maj = 0;
int pocl_min = 0;
const int res1 = sscanf (pocl_version_ptr, "pocl %d.%d", &pocl_maj, &pocl_min);
if (res1 == 2)
{ {
if (user_options->quiet == false) event_log_warning (hashcat_ctx, "* Device #%u: Not a native Intel OpenCL runtime. Expect massive speed loss.", device_id + 1); const int pocl_version = (pocl_maj * 100) + pocl_min;
if (user_options->quiet == false) event_log_warning (hashcat_ctx, " You can use --force to override, but do not report related errors.");
if (user_options->quiet == false) event_log_warning (hashcat_ctx, NULL);
device_param->skipped = true; if (pocl_version < 105)
{
pocl_skip = true;
}
}
int llvm_maj = 0;
int llvm_min = 0;
const int res2 = sscanf (llvm_version_ptr, "LLVM %d.%d", &llvm_maj, &llvm_min);
if (res2 == 2)
{
const int llvm_version = (llvm_maj * 100) + llvm_min;
if (llvm_version < 900)
{
pocl_skip = true;
}
}
if (pocl_skip == true)
{
if (user_options->force == false)
{
event_log_error (hashcat_ctx, "* Device #%u: Outdated POCL OpenCL driver detected!", device_id + 1);
if (user_options->quiet == false) event_log_warning (hashcat_ctx, "This OpenCL driver has been marked as likely to fail kernel compilation or to produce false negatives.");
if (user_options->quiet == false) event_log_warning (hashcat_ctx, "You can use --force to override this, but do not report related errors.");
if (user_options->quiet == false) event_log_warning (hashcat_ctx, NULL);
device_param->skipped = true;
}
} }
} }
} }
@ -6001,14 +6057,11 @@ int backend_ctx_devices_init (hashcat_ctx_t *hashcat_ctx, const int comptime)
|| (strstr (opencl_device_version_lower, " neo")) || (strstr (opencl_device_version_lower, " neo"))
|| (strstr (opencl_device_version_lower, "beignet ")) || (strstr (opencl_device_version_lower, "beignet "))
|| (strstr (opencl_device_version_lower, " beignet")) || (strstr (opencl_device_version_lower, " beignet"))
|| (strstr (opencl_device_version_lower, "pocl "))
|| (strstr (opencl_device_version_lower, " pocl"))
|| (strstr (opencl_device_version_lower, "mesa ")) || (strstr (opencl_device_version_lower, "mesa "))
|| (strstr (opencl_device_version_lower, " mesa"))) || (strstr (opencl_device_version_lower, " mesa")))
{ {
// NEO: https://github.com/hashcat/hashcat/issues/2342 // NEO: https://github.com/hashcat/hashcat/issues/2342
// BEIGNET: https://github.com/hashcat/hashcat/issues/2243 // BEIGNET: https://github.com/hashcat/hashcat/issues/2243
// POCL: https://github.com/hashcat/hashcat/issues/2344
// MESA: https://github.com/hashcat/hashcat/issues/2269 // MESA: https://github.com/hashcat/hashcat/issues/2269
if (user_options->force == false) if (user_options->force == false)
@ -6541,10 +6594,10 @@ int backend_ctx_devices_init (hashcat_ctx_t *hashcat_ctx, const int comptime)
backend_ctx->backend_devices_cnt = cuda_devices_cnt + opencl_devices_cnt; backend_ctx->backend_devices_cnt = cuda_devices_cnt + opencl_devices_cnt;
backend_ctx->backend_devices_active = cuda_devices_active + opencl_devices_active; backend_ctx->backend_devices_active = cuda_devices_active + opencl_devices_active;
// find duplicate devices (typically CUDA and OpenCL) // find duplicate devices
if ((cuda_devices_cnt > 0) && (opencl_devices_cnt > 0)) //if ((cuda_devices_cnt > 0) && (opencl_devices_cnt > 0))
{ //{
// using force here enables both devices, which is the worst possible outcome // using force here enables both devices, which is the worst possible outcome
// many users force by default, so this is not a good idea // many users force by default, so this is not a good idea
@ -6552,7 +6605,7 @@ int backend_ctx_devices_init (hashcat_ctx_t *hashcat_ctx, const int comptime)
//{ //{
backend_ctx_find_alias_devices (hashcat_ctx); backend_ctx_find_alias_devices (hashcat_ctx);
//{ //{
} //}
if (backend_ctx->backend_devices_active == 0) if (backend_ctx->backend_devices_active == 0)
{ {

Loading…
Cancel
Save