Ignore:
Timestamp:
Nov 20, 2010, 12:03:24 AM (11 years ago)
Author:
Sven Rech
Message:

KeySearcher OpenCL optimization.
Doesn't work perfect yet :)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/CrypPlugins/KeySearcher/KeySearcher.cs

    r2098 r2110  
    371371
    372372            KeySearcherOpenCLCode keySearcherOpenCLCode = null;
     373            KeySearcherOpenCLSubbatchOptimizer keySearcherOpenCLSubbatchOptimizer = null;
    373374            if (useOpenCL)
    374                 keySearcherOpenCLCode = new KeySearcherOpenCLCode(this, encryptedData, sender, CostMaster, 256 * 64);
     375            {
     376                keySearcherOpenCLCode = new KeySearcherOpenCLCode(this, encryptedData, sender, CostMaster, 256 * 256 * 256 * 16);
     377                keySearcherOpenCLSubbatchOptimizer = new KeySearcherOpenCLSubbatchOptimizer(oclManager.CQ[settings.OpenCLDevice].Device.MaxWorkItemSizes.Aggregate(1, (x, y) => (x * (int)y)));
     378            }
    375379
    376380            try
     
    399403                            try
    400404                            {
    401                                 finish = BruteforceOpenCL(keySearcherOpenCLCode, keyTranslator, sender, bytesToUse);
     405                                finish = BruteforceOpenCL(keySearcherOpenCLCode, keySearcherOpenCLSubbatchOptimizer, keyTranslator, sender, bytesToUse, parameters);
    402406                            }
    403407                            catch (Exception)
     
    410414                        int progress = keyTranslator.GetProgress();
    411415
    412                         doneKeysArray[threadid] += progress;
    413                         keycounterArray[threadid] += progress;
    414                         keysLeft[threadid] -= progress;
     416                        if (!useOpenCL)
     417                        {
     418                            doneKeysArray[threadid] += progress;
     419                            keycounterArray[threadid] += progress;
     420                            keysLeft[threadid] -= progress;
     421                        }
    415422
    416423                    } while (!finish && !stop);
     
    429436        }
    430437
    431         private unsafe bool BruteforceOpenCL(KeySearcherOpenCLCode keySearcherOpenCLCode, IKeyTranslator keyTranslator, IControlEncryption sender, int bytesToUse)
    432         {
    433             float[] costArray = null;
     438        private unsafe bool BruteforceOpenCL(KeySearcherOpenCLCode keySearcherOpenCLCode, KeySearcherOpenCLSubbatchOptimizer keySearcherOpenCLSubbatchOptimizer, IKeyTranslator keyTranslator, IControlEncryption sender, int bytesToUse, object[] parameters)
     439        {
     440            int threadid = (int)parameters[1];
     441            BigInteger[] doneKeysArray = (BigInteger[])parameters[2];
     442            BigInteger[] keycounterArray = (BigInteger[])parameters[3];
     443            BigInteger[] keysLeft = (BigInteger[])parameters[4];
    434444            try
    435445            {
    436446                Kernel bruteforceKernel = keySearcherOpenCLCode.GetBruteforceKernel(oclManager, keyTranslator);
    437                 costArray = new float[keyTranslator.GetOpenCLBatchSize()];
     447               
    438448                int deviceIndex = settings.OpenCLDevice;
    439449               
    440                 Mem costs = oclManager.Context.CreateBuffer(MemFlags.READ_ONLY, costArray.Length * 4);
    441                 IntPtr[] globalWorkSize = { (IntPtr)keyTranslator.GetOpenCLBatchSize() };
    442 
    443450                Mem userKey;
    444451                var key = keyTranslator.GetKey();
     
    447454
    448455                bruteforceKernel.SetArg(0, userKey);
     456
     457                int subbatches = keySearcherOpenCLSubbatchOptimizer.GetAmountOfSubbatches(keyTranslator);
     458                GuiLogMessage(string.Format("Now using {0} subbatches", subbatches), NotificationLevel.Info);
     459
     460                int subbatchSize = keyTranslator.GetOpenCLBatchSize() / subbatches;
     461                float[] costArray = new float[subbatchSize];
     462                Mem costs = oclManager.Context.CreateBuffer(MemFlags.READ_ONLY, costArray.Length * 4);
    449463                bruteforceKernel.SetArg(1, costs);
    450464
    451                 oclManager.CQ[deviceIndex].EnqueueNDRangeKernel(bruteforceKernel, 1, null, globalWorkSize, null);
    452                 oclManager.CQ[deviceIndex].EnqueueBarrier();
    453 
    454                 Event e;
    455                 fixed (float* costa = costArray)
    456                     oclManager.CQ[deviceIndex].EnqueueReadBuffer(costs, true, 0, costArray.Length * 4, new IntPtr((void*)costa), 0, null, out e);
    457 
    458                 e.Wait();
     465                IntPtr[] globalWorkSize = { (IntPtr)subbatchSize };
     466
     467                keySearcherOpenCLSubbatchOptimizer.BeginMeasurement();
     468
     469                for (int i = 0; i < subbatches; i++)
     470                {
     471                    bruteforceKernel.SetArg(2, i * subbatchSize);
     472                    oclManager.CQ[deviceIndex].EnqueueNDRangeKernel(bruteforceKernel, 1, null, globalWorkSize, null);
     473                    oclManager.CQ[deviceIndex].EnqueueBarrier();
     474
     475                    Event e;
     476                    fixed (float* costa = costArray)
     477                        oclManager.CQ[deviceIndex].EnqueueReadBuffer(costs, true, 0, costArray.Length * 4, new IntPtr((void*)costa), 0, null, out e);
     478
     479                    e.Wait();
     480
     481                    checkOpenCLResults(keyTranslator, costArray, sender, bytesToUse, i * subbatchSize);
     482
     483                    doneKeysArray[threadid] += subbatchSize;
     484                    keycounterArray[threadid] += subbatchSize;
     485                    keysLeft[threadid] -= subbatchSize;
     486                }
     487
     488                keySearcherOpenCLSubbatchOptimizer.EndMeasurement();
     489
    459490                costs.Dispose();
    460491            }
     
    466497            }
    467498
    468             //Check results:
     499            return !keyTranslator.NextOpenCLBatch();
     500        }
     501
     502        private void checkOpenCLResults(IKeyTranslator keyTranslator, float[] costArray, IControlEncryption sender, int bytesToUse, int add)
     503        {
    469504            var op = this.costMaster.getRelationOperator();
    470505            for (int i = 0; i < costArray.Length; i++)
     
    474509                    || (op == RelationOperator.LessThen) && (cost < value_threshold))
    475510                {
    476                     ValueKey valueKey = new ValueKey {value = cost, key = keyTranslator.GetKeyRepresentation(i)};
     511                    ValueKey valueKey = new ValueKey { value = cost, key = keyTranslator.GetKeyRepresentation(i + add) };
    477512                    valueKey.keya = keyTranslator.GetKeyFromRepresentation(valueKey.key);
    478513                    valueKey.decryption = sender.Decrypt(this.encryptedData, valueKey.keya, InitVector, bytesToUse);
     
    480515                }
    481516            }
    482 
    483             return !keyTranslator.NextOpenCLBatch();
    484517        }
    485518
     
    714747            while (!stop)
    715748            {
    716                 Thread.Sleep(1000);
     749                Thread.Sleep(2000);
    717750
    718751                updateToplist();
Note: See TracChangeset for help on using the changeset viewer.