mirror of
https://github.com/hashcat/hashcat.git
synced 2024-11-22 08:08:10 +00:00
Merge pull request #3762 from matrix/fix_metal_opencl_device_selection
Metal Backend: disable Metal devices only if at least one OpenCL device is active
This commit is contained in:
commit
634251817c
@ -111,6 +111,7 @@
|
|||||||
- SecureCRT MasterPassphrase v2: update module, pure kernels and test unit. Add optimized kernels.
|
- SecureCRT MasterPassphrase v2: update module, pure kernels and test unit. Add optimized kernels.
|
||||||
- Metal Backend: added workaround to prevent 'Infinite Loop' bug when build kernels
|
- Metal Backend: added workaround to prevent 'Infinite Loop' bug when build kernels
|
||||||
- Metal Backend: allow use of devices with Metal if runtime version is >= 200
|
- Metal Backend: allow use of devices with Metal if runtime version is >= 200
|
||||||
|
- Metal Backend: disable Metal devices only if at least one OpenCL device is active
|
||||||
- User Options: added --metal-compiler-runtime option
|
- User Options: added --metal-compiler-runtime option
|
||||||
- Hardware Monitor: avoid sprintf in src/ext_iokit.c
|
- Hardware Monitor: avoid sprintf in src/ext_iokit.c
|
||||||
- Help: show supported hash-modes only with -hh
|
- Help: show supported hash-modes only with -hh
|
||||||
|
@ -6242,35 +6242,6 @@ int backend_ctx_devices_init (hashcat_ctx_t *hashcat_ctx, const int comptime)
|
|||||||
|
|
||||||
if (device_param->device_processors == 1) device_param->skipped = true;
|
if (device_param->device_processors == 1) device_param->skipped = true;
|
||||||
|
|
||||||
// Since we can't match OpenCL with Metal devices (missing PCI ID etc.) and at the same time we have better OpenCL support than Metal support,
|
|
||||||
// we disable all Metal devices by default. The user can reactivate them with -d.
|
|
||||||
|
|
||||||
if (device_param->skipped == false)
|
|
||||||
{
|
|
||||||
if (backend_ctx->backend_devices_filter == -1ULL)
|
|
||||||
{
|
|
||||||
if ((user_options->quiet == false) && (user_options->backend_info == 0))
|
|
||||||
{
|
|
||||||
event_log_warning (hashcat_ctx, "The device #%d has been disabled as it most likely also exists as an OpenCL device, but it is not possible to automatically map it.", device_id + 1);
|
|
||||||
event_log_warning (hashcat_ctx, "You can use -d %d to use Metal API instead of OpenCL API. In some rare cases this is more stable.", device_id + 1);
|
|
||||||
event_log_warning (hashcat_ctx, NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
device_param->skipped = true;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (backend_ctx->backend_devices_filter & (1ULL << device_id))
|
|
||||||
{
|
|
||||||
// ok
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
device_param->skipped = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* activate device
|
* activate device
|
||||||
*/
|
*/
|
||||||
@ -7592,6 +7563,57 @@ int backend_ctx_devices_init (hashcat_ctx_t *hashcat_ctx, const int comptime)
|
|||||||
backend_ctx->backend_devices_cnt = cuda_devices_cnt + hip_devices_cnt + metal_devices_cnt + opencl_devices_cnt;
|
backend_ctx->backend_devices_cnt = cuda_devices_cnt + hip_devices_cnt + metal_devices_cnt + opencl_devices_cnt;
|
||||||
backend_ctx->backend_devices_active = cuda_devices_active + hip_devices_active + metal_devices_active + opencl_devices_active;
|
backend_ctx->backend_devices_active = cuda_devices_active + hip_devices_active + metal_devices_active + opencl_devices_active;
|
||||||
|
|
||||||
|
#if defined (__APPLE__)
|
||||||
|
// disable Metal devices if at least one OpenCL device is enabled
|
||||||
|
if (backend_ctx->opencl_devices_active > 0)
|
||||||
|
{
|
||||||
|
if (backend_ctx->mtl)
|
||||||
|
{
|
||||||
|
for (int backend_devices_cnt = 0; backend_devices_cnt < backend_ctx->backend_devices_cnt; backend_devices_cnt++)
|
||||||
|
{
|
||||||
|
hc_device_param_t *device_param = &backend_ctx->devices_param[backend_devices_cnt];
|
||||||
|
|
||||||
|
if (device_param->is_metal == false) continue;
|
||||||
|
|
||||||
|
// Since we can't match OpenCL with Metal devices (missing PCI ID etc.) and at the same time we have better OpenCL support than Metal support,
|
||||||
|
// we disable all Metal devices by default. The user can reactivate them with -d.
|
||||||
|
|
||||||
|
if (device_param->skipped == false)
|
||||||
|
{
|
||||||
|
if (backend_ctx->backend_devices_filter == -1ULL)
|
||||||
|
{
|
||||||
|
if ((user_options->quiet == false) && (user_options->backend_info == 0))
|
||||||
|
{
|
||||||
|
event_log_warning (hashcat_ctx, "The device #%d has been disabled as it most likely also exists as an OpenCL device, but it is not possible to automatically map it.", device_param->device_id + 1);
|
||||||
|
event_log_warning (hashcat_ctx, "You can use -d %d to use Metal API instead of OpenCL API. In some rare cases this is more stable.", device_param->device_id + 1);
|
||||||
|
event_log_warning (hashcat_ctx, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
device_param->skipped = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (backend_ctx->backend_devices_filter & (1ULL << device_param->device_id))
|
||||||
|
{
|
||||||
|
// ok
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
device_param->skipped = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (device_param->skipped == true)
|
||||||
|
{
|
||||||
|
backend_ctx->metal_devices_active--;
|
||||||
|
backend_ctx->backend_devices_active--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
// find duplicate devices
|
// find duplicate devices
|
||||||
|
|
||||||
//if ((cuda_devices_cnt > 0) && (hip_devices_cnt > 0) && (opencl_devices_cnt > 0))
|
//if ((cuda_devices_cnt > 0) && (hip_devices_cnt > 0) && (opencl_devices_cnt > 0))
|
||||||
|
Loading…
Reference in New Issue
Block a user