diff --git a/docs/changes.txt b/docs/changes.txt index c6abd6c73..1b8abca84 100644 --- a/docs/changes.txt +++ b/docs/changes.txt @@ -10,6 +10,10 @@ File.: Host Desc.: Implemented a new feature that allows to quit at next restore point update (and disable it) Issue: 10 +Type.: Feature +File.: Host +Desc.: Added option --gpu-platform to select a single OpenCL platform in case multiple OpenCL platforms are present + Type.: Bug File.: Host Desc.: Fixed a bug in combination of --restore and a user immediately aborting the session after restart diff --git a/src/oclHashcat.c b/src/oclHashcat.c index b212d2a3b..f684178f3 100644 --- a/src/oclHashcat.c +++ b/src/oclHashcat.c @@ -383,7 +383,8 @@ const char *USAGE_BIG[] = " --bitmap-min=NUM Minimum number of bits allowed for bitmaps", " --bitmap-max=NUM Maximum number of bits allowed for bitmaps", " --cpu-affinity=STR Locks to CPU devices, seperate with comma", - " -d, --gpu-devices=STR Devices to use, separate with comma", + " -d, --gpu-devices=STR OpenCL devices to use, separate with comma", + " --gpu-platform=STR OpenCL platform to use, in case multiple OpenCL platforms are present", " -w, --workload-profile=NUM Enable a specific workload profile, see references below", " -n, --gpu-accel=NUM Workload tuning: 1, 8, 40, 80, 160", " -u, --gpu-loops=NUM Workload fine-tuning: 8 - 1024", @@ -5070,6 +5071,7 @@ int main (int argc, char **argv) uint increment_max = INCREMENT_MAX; char *cpu_affinity = NULL; char *gpu_devices = NULL; + char *gpu_platform = NULL; char *truecrypt_keyfiles = NULL; uint workload_profile = WORKLOAD_PROFILE; uint gpu_accel = GPU_ACCEL; @@ -5143,6 +5145,7 @@ int main (int argc, char **argv) #define IDX_MARKOV_HCSTAT 0xff24 #define IDX_CPU_AFFINITY 0xff25 #define IDX_GPU_DEVICES 'd' + #define IDX_GPU_PLATFORM 0xff72 #define IDX_WORKLOAD_PROFILE 'w' #define IDX_GPU_ACCEL 'n' #define IDX_GPU_LOOPS 'u' @@ -5222,6 +5225,7 @@ int main (int argc, char **argv) {"markov-hcstat", required_argument, 0, IDX_MARKOV_HCSTAT}, {"cpu-affinity", required_argument, 0, IDX_CPU_AFFINITY}, {"gpu-devices", required_argument, 0, IDX_GPU_DEVICES}, + {"gpu-platform", required_argument, 0, IDX_GPU_PLATFORM}, {"workload-profile", required_argument, 0, IDX_WORKLOAD_PROFILE}, {"gpu-accel", required_argument, 0, IDX_GPU_ACCEL}, {"gpu-loops", required_argument, 0, IDX_GPU_LOOPS}, @@ -5450,6 +5454,7 @@ int main (int argc, char **argv) case IDX_HEX_WORDLIST: hex_wordlist = 1; break; case IDX_CPU_AFFINITY: cpu_affinity = optarg; break; case IDX_GPU_DEVICES: gpu_devices = optarg; break; + case IDX_GPU_PLATFORM: gpu_platform = optarg; break; case IDX_WORKLOAD_PROFILE: workload_profile = atoi (optarg); break; case IDX_GPU_ACCEL: gpu_accel = atoi (optarg); gpu_accel_chgd = 1; break; @@ -6331,6 +6336,7 @@ int main (int argc, char **argv) logfile_top_string (custom_charset_4); logfile_top_string (debug_file); logfile_top_string (gpu_devices); + logfile_top_string (gpu_platform); logfile_top_string (induction_dir); logfile_top_string (markov_hcstat); logfile_top_string (outfile); @@ -12254,14 +12260,37 @@ int main (int argc, char **argv) return (-1); } + uint CL_platform_sel = 0; + if (CL_platforms_cnt > 1) { - log_error ("ERROR: Too many OpenCL compatible platforms found"); + if (gpu_platform == NULL) + { + log_error ("ERROR: Too many OpenCL compatible platforms found"); + log_error (" Please select a single platform using the --gpu-platform option"); + log_error (""); + log_error ("Available OpenCL platforms:"); + + for (uint i = 0; i < CL_platforms_cnt; i++) + { + char CL_platform_vendor[INFOSZ]; + + memset (CL_platform_vendor, 0, sizeof (CL_platform_vendor)); + + hc_clGetPlatformInfo (CL_platforms[i], CL_PLATFORM_VENDOR, sizeof (CL_platform_vendor), CL_platform_vendor, NULL); + + printf ("* %d = %s\n", i + 1, CL_platform_vendor); + } + } + else + { + CL_platform_sel = atoi (gpu_platform); + } return (-1); } - cl_platform_id CL_platform = CL_platforms[0]; + cl_platform_id CL_platform = CL_platforms[CL_platform_sel]; char CL_platform_vendor[INFOSZ];