Ignore:
Timestamp:
Dec 1, 2010, 2:04:12 PM (11 years ago)
Author:
Sven Rech
Message:

recomitted the keysearcher OpenCL optimization changes (hopefully this will work now...)

File:
1 edited

Legend:

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

    r2115 r2143  
    375375
    376376            KeySearcherOpenCLCode keySearcherOpenCLCode = null;
     377            KeySearcherOpenCLSubbatchOptimizer keySearcherOpenCLSubbatchOptimizer = null;
    377378            if (useOpenCL)
    378                 keySearcherOpenCLCode = new KeySearcherOpenCLCode(this, encryptedData, sender, CostMaster, 256 * 64);
     379            {
     380                keySearcherOpenCLCode = new KeySearcherOpenCLCode(this, encryptedData, sender, CostMaster, 256 * 256 * 256 * 16);
     381                keySearcherOpenCLSubbatchOptimizer = new KeySearcherOpenCLSubbatchOptimizer(oclManager.CQ[settings.OpenCLDevice].Device.MaxWorkItemSizes.Aggregate(1, (x, y) => (x * (int)y)) / 2);
     382            }
    379383
    380384            try
     
    403407                            try
    404408                            {
    405                                 finish = BruteforceOpenCL(keySearcherOpenCLCode, keyTranslator, sender, bytesToUse);
     409                                finish = BruteforceOpenCL(keySearcherOpenCLCode, keySearcherOpenCLSubbatchOptimizer, keyTranslator, sender, bytesToUse, parameters);
    406410                            }
    407411                            catch (Exception)
     
    414418                        int progress = keyTranslator.GetProgress();
    415419
    416                         doneKeysArray[threadid] += progress;
    417                         keycounterArray[threadid] += progress;
    418                         keysLeft[threadid] -= progress;
     420                        if (!useOpenCL)
     421                        {
     422                            doneKeysArray[threadid] += progress;
     423                            keycounterArray[threadid] += progress;
     424                            keysLeft[threadid] -= progress;
     425                        }
    419426
    420427                    } while (!finish && !stop);
     
    434441        }
    435442
    436         private unsafe bool BruteforceOpenCL(KeySearcherOpenCLCode keySearcherOpenCLCode, IKeyTranslator keyTranslator, IControlEncryption sender, int bytesToUse)
    437         {
    438             float[] costArray = null;
     443        private unsafe bool BruteforceOpenCL(KeySearcherOpenCLCode keySearcherOpenCLCode, KeySearcherOpenCLSubbatchOptimizer keySearcherOpenCLSubbatchOptimizer, IKeyTranslator keyTranslator, IControlEncryption sender, int bytesToUse, object[] parameters)
     444        {
     445            int threadid = (int)parameters[1];
     446            BigInteger[] doneKeysArray = (BigInteger[])parameters[2];
     447            BigInteger[] keycounterArray = (BigInteger[])parameters[3];
     448            BigInteger[] keysLeft = (BigInteger[])parameters[4];
    439449            try
    440450            {
    441451                Kernel bruteforceKernel = keySearcherOpenCLCode.GetBruteforceKernel(oclManager, keyTranslator);
    442                 costArray = new float[keyTranslator.GetOpenCLBatchSize()];
     452               
    443453                int deviceIndex = settings.OpenCLDevice;
    444454               
    445                 Mem costs = oclManager.Context.CreateBuffer(MemFlags.READ_WRITE, costArray.Length * 4);
    446                 IntPtr[] globalWorkSize = { (IntPtr)keyTranslator.GetOpenCLBatchSize() };
    447 
    448455                Mem userKey;
    449456                var key = keyTranslator.GetKey();
     
    452459
    453460                bruteforceKernel.SetArg(0, userKey);
     461
     462                int subbatches = keySearcherOpenCLSubbatchOptimizer.GetAmountOfSubbatches(keyTranslator);
     463                GuiLogMessage(string.Format("Now using {0} subbatches", subbatches), NotificationLevel.Info);
     464
     465                int subbatchSize = keyTranslator.GetOpenCLBatchSize() / subbatches;
     466                float[] costArray = new float[subbatchSize];
     467                Mem costs = oclManager.Context.CreateBuffer(MemFlags.READ_WRITE, costArray.Length * 4);
    454468                bruteforceKernel.SetArg(1, costs);
    455469
    456                 oclManager.CQ[deviceIndex].EnqueueNDRangeKernel(bruteforceKernel, 1, null, globalWorkSize, null);
    457                 oclManager.CQ[deviceIndex].EnqueueBarrier();
    458 
    459                 Event e;
    460                 fixed (float* costa = costArray)
    461                     oclManager.CQ[deviceIndex].EnqueueReadBuffer(costs, true, 0, costArray.Length * 4, new IntPtr((void*)costa), 0, null, out e);
    462 
    463                 e.Wait();
     470                IntPtr[] globalWorkSize = { (IntPtr)subbatchSize };
     471
     472                keySearcherOpenCLSubbatchOptimizer.BeginMeasurement();
     473
     474                for (int i = 0; i < subbatches; i++)
     475                {
     476                    bruteforceKernel.SetArg(2, i * subbatchSize);
     477                    oclManager.CQ[deviceIndex].EnqueueNDRangeKernel(bruteforceKernel, 1, null, globalWorkSize, null);
     478                    oclManager.CQ[deviceIndex].EnqueueBarrier();
     479
     480                    Event e;
     481                    fixed (float* costa = costArray)
     482                        oclManager.CQ[deviceIndex].EnqueueReadBuffer(costs, true, 0, costArray.Length * 4, new IntPtr((void*)costa), 0, null, out e);
     483
     484                    e.Wait();
     485
     486                    checkOpenCLResults(keyTranslator, costArray, sender, bytesToUse, i * subbatchSize);
     487
     488                    doneKeysArray[threadid] += subbatchSize;
     489                    keycounterArray[threadid] += subbatchSize;
     490                    keysLeft[threadid] -= subbatchSize;
     491                }
     492
     493                keySearcherOpenCLSubbatchOptimizer.EndMeasurement();
     494
    464495                costs.Dispose();
    465496            }
     
    471502            }
    472503
    473             //Check results:
     504            return !keyTranslator.NextOpenCLBatch();
     505        }
     506
     507        private void checkOpenCLResults(IKeyTranslator keyTranslator, float[] costArray, IControlEncryption sender, int bytesToUse, int add)
     508        {
    474509            var op = this.costMaster.getRelationOperator();
    475510            for (int i = 0; i < costArray.Length; i++)
     
    479514                    || (op == RelationOperator.LessThen) && (cost < value_threshold))
    480515                {
    481                     ValueKey valueKey = new ValueKey {value = cost, key = keyTranslator.GetKeyRepresentation(i)};
     516                    ValueKey valueKey = new ValueKey { value = cost, key = keyTranslator.GetKeyRepresentation(i + add) };
    482517                    valueKey.keya = keyTranslator.GetKeyFromRepresentation(valueKey.key);
    483518                    valueKey.decryption = sender.Decrypt(this.encryptedData, valueKey.keya, InitVector, bytesToUse);
     
    485520                }
    486521            }
    487 
    488             return !keyTranslator.NextOpenCLBatch();
    489522        }
    490523
     
    720753            while (!stop)
    721754            {
    722                 Thread.Sleep(1000);
     755                Thread.Sleep(2000);
    723756
    724757                updateToplist();
Note: See TracChangeset for help on using the changeset viewer.