Check for allocatable device-memory depending on kernel_accel amplifier before trying...
authorJens Steube <jens.steube@gmail.com>
Wed, 10 Feb 2016 12:31:04 +0000 (13:31 +0100)
committerJens Steube <jens.steube@gmail.com>
Wed, 10 Feb 2016 12:31:04 +0000 (13:31 +0100)
src/oclHashcat.c

index 7b39449..cf48843 100644 (file)
@@ -13547,6 +13547,8 @@ int main (int argc, char **argv)
 
       uint device_processor_cores = device_param->device_processor_cores;
 
+      uint kernel_accel = device_param->kernel_accel;
+
       cl_device_type device_type = device_param->device_type;
 
       /**
@@ -13574,6 +13576,7 @@ int main (int argc, char **argv)
       if (hash_mode == 3200) kernel_threads = 8;
       if (hash_mode == 9000) kernel_threads = 8;
 
+      // we need to get rid of this
       if (device_type & CL_DEVICE_TYPE_CPU)
       {
         if (benchmark_mode == 0)
@@ -13592,97 +13595,151 @@ int main (int argc, char **argv)
         }
       }
 
-      uint kernel_power  = device_processors * kernel_threads * device_param->kernel_accel;
-      uint kernel_blocks = kernel_power;
+      uint kernel_power  = 1;
+      uint kernel_blocks = 1;
 
-      device_param->kernel_threads      = kernel_threads;
-      device_param->kernel_power_user   = kernel_power;
-      device_param->kernel_blocks_user  = kernel_blocks;
+      uint size_pws   = 4;
+      uint size_tmps  = 4;
+      uint size_hooks = 4;
 
-      kernel_blocks_all += kernel_blocks;
+      // find out if we would request too much memory on memory blocks which are based on kernel_accel
 
-      uint size_pws = kernel_power * sizeof (pw_t);
+      while (kernel_accel)
+      {
+        kernel_power  = device_processors * kernel_threads * kernel_accel;
+        kernel_blocks = kernel_power;
 
-      uint size_tmps = 4;
+        // size_pws
 
-      switch (hash_mode)
-      {
-        case   400: size_tmps = kernel_blocks * sizeof (phpass_tmp_t);        break;
-        case   500: size_tmps = kernel_blocks * sizeof (md5crypt_tmp_t);      break;
-        case   501: size_tmps = kernel_blocks * sizeof (md5crypt_tmp_t);      break;
-        case  1600: size_tmps = kernel_blocks * sizeof (md5crypt_tmp_t);      break;
-        case  1800: size_tmps = kernel_blocks * sizeof (sha512crypt_tmp_t);   break;
-        case  2100: size_tmps = kernel_blocks * sizeof (dcc2_tmp_t);          break;
-        case  2500: size_tmps = kernel_blocks * sizeof (wpa_tmp_t);           break;
-        case  3200: size_tmps = kernel_blocks * sizeof (bcrypt_tmp_t);        break;
-        case  5200: size_tmps = kernel_blocks * sizeof (pwsafe3_tmp_t);       break;
-        case  5800: size_tmps = kernel_blocks * sizeof (androidpin_tmp_t);    break;
-        case  6211:
-        case  6212:
-        case  6213: size_tmps = kernel_blocks * sizeof (tc_tmp_t);            break;
-        case  6221:
-        case  6222:
-        case  6223: size_tmps = kernel_blocks * sizeof (tc64_tmp_t);          break;
-        case  6231:
-        case  6232:
-        case  6233: size_tmps = kernel_blocks * sizeof (tc_tmp_t);            break;
-        case  6241:
-        case  6242:
-        case  6243: size_tmps = kernel_blocks * sizeof (tc_tmp_t);            break;
-        case  6300: size_tmps = kernel_blocks * sizeof (md5crypt_tmp_t);      break;
-        case  6400: size_tmps = kernel_blocks * sizeof (sha256aix_tmp_t);     break;
-        case  6500: size_tmps = kernel_blocks * sizeof (sha512aix_tmp_t);     break;
-        case  6600: size_tmps = kernel_blocks * sizeof (agilekey_tmp_t);      break;
-        case  6700: size_tmps = kernel_blocks * sizeof (sha1aix_tmp_t);       break;
-        case  6800: size_tmps = kernel_blocks * sizeof (lastpass_tmp_t);      break;
-        case  7100: size_tmps = kernel_blocks * sizeof (pbkdf2_sha512_tmp_t); break;
-        case  7200: size_tmps = kernel_blocks * sizeof (pbkdf2_sha512_tmp_t); break;
-        case  7400: size_tmps = kernel_blocks * sizeof (sha256crypt_tmp_t);   break;
-        case  7900: size_tmps = kernel_blocks * sizeof (drupal7_tmp_t);       break;
-        case  8200: size_tmps = kernel_blocks * sizeof (pbkdf2_sha512_tmp_t); break;
-        case  8800: size_tmps = kernel_blocks * sizeof (androidfde_tmp_t);    break;
-        case  8900: size_tmps = kernel_blocks * sizeof (scrypt_tmp_t);        break;
-        case  9000: size_tmps = kernel_blocks * sizeof (pwsafe2_tmp_t);       break;
-        case  9100: size_tmps = kernel_blocks * sizeof (lotus8_tmp_t);        break;
-        case  9200: size_tmps = kernel_blocks * sizeof (pbkdf2_sha256_tmp_t); break;
-        case  9300: size_tmps = kernel_blocks * sizeof (scrypt_tmp_t);        break;
-        case  9400: size_tmps = kernel_blocks * sizeof (office2007_tmp_t);    break;
-        case  9500: size_tmps = kernel_blocks * sizeof (office2010_tmp_t);    break;
-        case  9600: size_tmps = kernel_blocks * sizeof (office2013_tmp_t);    break;
-        case 10000: size_tmps = kernel_blocks * sizeof (pbkdf2_sha256_tmp_t); break;
-        case 10200: size_tmps = kernel_blocks * sizeof (cram_md5_t);          break;
-        case 10300: size_tmps = kernel_blocks * sizeof (saph_sha1_tmp_t);     break;
-        case 10500: size_tmps = kernel_blocks * sizeof (pdf14_tmp_t);         break;
-        case 10700: size_tmps = kernel_blocks * sizeof (pdf17l8_tmp_t);       break;
-        case 10900: size_tmps = kernel_blocks * sizeof (pbkdf2_sha256_tmp_t); break;
-        case 11300: size_tmps = kernel_blocks * sizeof (bitcoin_wallet_tmp_t); break;
-        case 11600: size_tmps = kernel_blocks * sizeof (seven_zip_tmp_t);     break;
-        case 11900: size_tmps = kernel_blocks * sizeof (pbkdf2_md5_tmp_t);    break;
-        case 12000: size_tmps = kernel_blocks * sizeof (pbkdf2_sha1_tmp_t);   break;
-        case 12100: size_tmps = kernel_blocks * sizeof (pbkdf2_sha512_tmp_t); break;
-        case 12200: size_tmps = kernel_blocks * sizeof (ecryptfs_tmp_t);      break;
-        case 12300: size_tmps = kernel_blocks * sizeof (oraclet_tmp_t);       break;
-        case 12400: size_tmps = kernel_blocks * sizeof (bsdicrypt_tmp_t);     break;
-        case 12500: size_tmps = kernel_blocks * sizeof (rar3_tmp_t);          break;
-        case 12700: size_tmps = kernel_blocks * sizeof (mywallet_tmp_t);      break;
-        case 12800: size_tmps = kernel_blocks * sizeof (pbkdf2_sha256_tmp_t); break;
-        case 12900: size_tmps = kernel_blocks * sizeof (pbkdf2_sha256_tmp_t); break;
-        case 13000: size_tmps = kernel_blocks * sizeof (pbkdf2_sha256_tmp_t); break;
-      };
+        size_pws = kernel_blocks * sizeof (pw_t);
 
-      uint size_hooks = 4;
+        // size_tmps
+
+        switch (hash_mode)
+        {
+          case   400: size_tmps = kernel_blocks * sizeof (phpass_tmp_t);        break;
+          case   500: size_tmps = kernel_blocks * sizeof (md5crypt_tmp_t);      break;
+          case   501: size_tmps = kernel_blocks * sizeof (md5crypt_tmp_t);      break;
+          case  1600: size_tmps = kernel_blocks * sizeof (md5crypt_tmp_t);      break;
+          case  1800: size_tmps = kernel_blocks * sizeof (sha512crypt_tmp_t);   break;
+          case  2100: size_tmps = kernel_blocks * sizeof (dcc2_tmp_t);          break;
+          case  2500: size_tmps = kernel_blocks * sizeof (wpa_tmp_t);           break;
+          case  3200: size_tmps = kernel_blocks * sizeof (bcrypt_tmp_t);        break;
+          case  5200: size_tmps = kernel_blocks * sizeof (pwsafe3_tmp_t);       break;
+          case  5800: size_tmps = kernel_blocks * sizeof (androidpin_tmp_t);    break;
+          case  6211:
+          case  6212:
+          case  6213: size_tmps = kernel_blocks * sizeof (tc_tmp_t);            break;
+          case  6221:
+          case  6222:
+          case  6223: size_tmps = kernel_blocks * sizeof (tc64_tmp_t);          break;
+          case  6231:
+          case  6232:
+          case  6233: size_tmps = kernel_blocks * sizeof (tc_tmp_t);            break;
+          case  6241:
+          case  6242:
+          case  6243: size_tmps = kernel_blocks * sizeof (tc_tmp_t);            break;
+          case  6300: size_tmps = kernel_blocks * sizeof (md5crypt_tmp_t);      break;
+          case  6400: size_tmps = kernel_blocks * sizeof (sha256aix_tmp_t);     break;
+          case  6500: size_tmps = kernel_blocks * sizeof (sha512aix_tmp_t);     break;
+          case  6600: size_tmps = kernel_blocks * sizeof (agilekey_tmp_t);      break;
+          case  6700: size_tmps = kernel_blocks * sizeof (sha1aix_tmp_t);       break;
+          case  6800: size_tmps = kernel_blocks * sizeof (lastpass_tmp_t);      break;
+          case  7100: size_tmps = kernel_blocks * sizeof (pbkdf2_sha512_tmp_t); break;
+          case  7200: size_tmps = kernel_blocks * sizeof (pbkdf2_sha512_tmp_t); break;
+          case  7400: size_tmps = kernel_blocks * sizeof (sha256crypt_tmp_t);   break;
+          case  7900: size_tmps = kernel_blocks * sizeof (drupal7_tmp_t);       break;
+          case  8200: size_tmps = kernel_blocks * sizeof (pbkdf2_sha512_tmp_t); break;
+          case  8800: size_tmps = kernel_blocks * sizeof (androidfde_tmp_t);    break;
+          case  8900: size_tmps = kernel_blocks * sizeof (scrypt_tmp_t);        break;
+          case  9000: size_tmps = kernel_blocks * sizeof (pwsafe2_tmp_t);       break;
+          case  9100: size_tmps = kernel_blocks * sizeof (lotus8_tmp_t);        break;
+          case  9200: size_tmps = kernel_blocks * sizeof (pbkdf2_sha256_tmp_t); break;
+          case  9300: size_tmps = kernel_blocks * sizeof (scrypt_tmp_t);        break;
+          case  9400: size_tmps = kernel_blocks * sizeof (office2007_tmp_t);    break;
+          case  9500: size_tmps = kernel_blocks * sizeof (office2010_tmp_t);    break;
+          case  9600: size_tmps = kernel_blocks * sizeof (office2013_tmp_t);    break;
+          case 10000: size_tmps = kernel_blocks * sizeof (pbkdf2_sha256_tmp_t); break;
+          case 10200: size_tmps = kernel_blocks * sizeof (cram_md5_t);          break;
+          case 10300: size_tmps = kernel_blocks * sizeof (saph_sha1_tmp_t);     break;
+          case 10500: size_tmps = kernel_blocks * sizeof (pdf14_tmp_t);         break;
+          case 10700: size_tmps = kernel_blocks * sizeof (pdf17l8_tmp_t);       break;
+          case 10900: size_tmps = kernel_blocks * sizeof (pbkdf2_sha256_tmp_t); break;
+          case 11300: size_tmps = kernel_blocks * sizeof (bitcoin_wallet_tmp_t); break;
+          case 11600: size_tmps = kernel_blocks * sizeof (seven_zip_tmp_t);     break;
+          case 11900: size_tmps = kernel_blocks * sizeof (pbkdf2_md5_tmp_t);    break;
+          case 12000: size_tmps = kernel_blocks * sizeof (pbkdf2_sha1_tmp_t);   break;
+          case 12100: size_tmps = kernel_blocks * sizeof (pbkdf2_sha512_tmp_t); break;
+          case 12200: size_tmps = kernel_blocks * sizeof (ecryptfs_tmp_t);      break;
+          case 12300: size_tmps = kernel_blocks * sizeof (oraclet_tmp_t);       break;
+          case 12400: size_tmps = kernel_blocks * sizeof (bsdicrypt_tmp_t);     break;
+          case 12500: size_tmps = kernel_blocks * sizeof (rar3_tmp_t);          break;
+          case 12700: size_tmps = kernel_blocks * sizeof (mywallet_tmp_t);      break;
+          case 12800: size_tmps = kernel_blocks * sizeof (pbkdf2_sha256_tmp_t); break;
+          case 12900: size_tmps = kernel_blocks * sizeof (pbkdf2_sha256_tmp_t); break;
+          case 13000: size_tmps = kernel_blocks * sizeof (pbkdf2_sha256_tmp_t); break;
+        };
+
+        // size_hooks
+
+        if ((opts_type & OPTS_TYPE_HOOK12) || (opts_type & OPTS_TYPE_HOOK23))
+        {
+          // none yet
+        }
+
+        // now check if all device-memory sizes which depend on the kernel_accel amplifier are within its boundaries
+        // if not, decrease amplifier and try again
+
+        if (size_pws > device_param->device_maxmem_alloc)
+        {
+          kernel_accel--;
+
+          continue;
+        }
 
-      if ((opts_type & OPTS_TYPE_HOOK12) || (opts_type & OPTS_TYPE_HOOK23))
+        if (size_tmps > device_param->device_maxmem_alloc)
+        {
+          kernel_accel--;
+
+          continue;
+        }
+
+        if (size_hooks > device_param->device_maxmem_alloc)
+        {
+          kernel_accel--;
+
+          continue;
+        }
+
+        if ((size_pws + size_tmps + size_hooks) > device_param->device_global_mem)
+        {
+          kernel_accel--;
+
+          continue;
+        }
+
+        break;
+      }
+
+      if (kernel_accel == 0)
       {
-        // insert correct hook size
+        log_error ("ERROR: Device #%u does not provide enough allocatable device-memory to handle hash-type %u", device_id + 1, data.hash_mode);
+
+        return -1;
       }
 
-      // we can optimize some stuff here...
+      device_param->kernel_threads      = kernel_threads;
+      device_param->kernel_power_user   = kernel_power;
+      device_param->kernel_blocks_user  = kernel_blocks;
+
+      kernel_blocks_all += kernel_blocks;
 
       device_param->size_pws   = size_pws;
       device_param->size_tmps  = size_tmps;
       device_param->size_hooks = size_hooks;
 
+      // we can optimize some stuff here...
+
       uint size_root_css   = SP_PW_MAX *           sizeof (cs_t);
       uint size_markov_css = SP_PW_MAX * CHARSIZ * sizeof (cs_t);
 
@@ -13697,8 +13754,8 @@ int main (int argc, char **argv)
       uint size_rules_c = KERNEL_RULES     * sizeof (kernel_rule_t);
 
       uint size_plains  = digests_cnt * sizeof (plain_t);
-      uint size_salts   = salts_cnt * sizeof (salt_t);
-      uint size_esalts  = salts_cnt * esalt_size;
+      uint size_salts   = salts_cnt   * sizeof (salt_t);
+      uint size_esalts  = salts_cnt   * esalt_size;
 
       device_param->size_plains   = size_plains;
       device_param->size_digests  = size_digests;
@@ -13707,7 +13764,9 @@ int main (int argc, char **argv)
 
       uint size_combs = KERNEL_COMBS * sizeof (comb_t);
       uint size_bfs   = KERNEL_BFS   * sizeof (bf_t);
-      uint size_tm    = 32        * sizeof (bs_word_t);
+      uint size_tm    = 32           * sizeof (bs_word_t);
+
+      // scrypt stuff
 
       u64 size_scryptV = 1;