Ignore:
Timestamp:
Dec 1, 2010, 5:02:44 PM (11 years ago)
Author:
Sven Rech
Message:

Added opencl presentation in KeySearcher

File:
1 edited

Legend:

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

    r2143 r2146  
    6363
    6464        private OpenCLManager oclManager = null;
     65        private Mutex openCLPresentationMutex = new Mutex();
    6566
    6667        private readonly Stopwatch localBruteForceStopwatch;
     
    269270        {
    270271            ((QuickWatch)QuickWatchPresentation).IsP2PEnabled = settings.UsePeerToPeer;
     272            ((QuickWatch)QuickWatchPresentation).IsOpenCLEnabled = settings.UseOpenCL;
    271273            p2PQuickWatchPresentation.UpdateSettings(this, settings);
    272274        }
     
    296298        {
    297299            IsKeySearcherRunning = true;
     300
     301            ((QuickWatch)QuickWatchPresentation).Dispatcher.BeginInvoke(DispatcherPriority.Normal, (SendOrPostCallback)delegate
     302            {
     303                openCLPresentationMutex.WaitOne();
     304                ((QuickWatch)QuickWatchPresentation).OpenCLPresentation.AmountOfDevices = 0;
     305                openCLPresentationMutex.ReleaseMutex();
     306            }, null);
    298307
    299308            //either byte[] CStream input or CryptoolStream Object input
     
    367376            int threadid = (int)parameters[1];
    368377            BigInteger[] doneKeysArray = (BigInteger[])parameters[2];
    369             BigInteger[] keycounterArray = (BigInteger[])parameters[3];
    370             BigInteger[] keysLeft = (BigInteger[])parameters[4];
    371             IControlEncryption sender = (IControlEncryption)parameters[5];
    372             int bytesToUse = (int)parameters[6];
    373             Stack threadStack = (Stack)parameters[7];
    374             bool useOpenCL = (bool)parameters[8];
     378            BigInteger[] openCLDoneKeysArray = (BigInteger[])parameters[3];
     379            BigInteger[] keycounterArray = (BigInteger[])parameters[4];
     380            BigInteger[] keysLeft = (BigInteger[])parameters[5];
     381            IControlEncryption sender = (IControlEncryption)parameters[6];
     382            int bytesToUse = (int)parameters[7];
     383            Stack threadStack = (Stack)parameters[8];
     384            bool useOpenCL = (bool)parameters[9];
    375385
    376386            KeySearcherOpenCLCode keySearcherOpenCLCode = null;
     
    380390                keySearcherOpenCLCode = new KeySearcherOpenCLCode(this, encryptedData, sender, CostMaster, 256 * 256 * 256 * 16);
    381391                keySearcherOpenCLSubbatchOptimizer = new KeySearcherOpenCLSubbatchOptimizer(oclManager.CQ[settings.OpenCLDevice].Device.MaxWorkItemSizes.Aggregate(1, (x, y) => (x * (int)y)) / 2);
     392                ((QuickWatch)QuickWatchPresentation).Dispatcher.BeginInvoke(DispatcherPriority.Normal, (SendOrPostCallback)delegate
     393                {
     394                    openCLPresentationMutex.WaitOne();
     395                    ((QuickWatch)QuickWatchPresentation).OpenCLPresentation.AmountOfDevices++;
     396                    openCLPresentationMutex.ReleaseMutex();
     397                }, null);
    382398            }
    383399
     
    412428                            {
    413429                                useOpenCL = false;
     430                                ((QuickWatch)QuickWatchPresentation).Dispatcher.BeginInvoke(DispatcherPriority.Normal, (SendOrPostCallback)delegate
     431                                {
     432                                    openCLPresentationMutex.WaitOne();
     433                                    ((QuickWatch)QuickWatchPresentation).OpenCLPresentation.AmountOfDevices--;
     434                                    openCLPresentationMutex.ReleaseMutex();
     435                                }, null);
    414436                                continue;
    415437                            }
     
    445467            int threadid = (int)parameters[1];
    446468            BigInteger[] doneKeysArray = (BigInteger[])parameters[2];
    447             BigInteger[] keycounterArray = (BigInteger[])parameters[3];
    448             BigInteger[] keysLeft = (BigInteger[])parameters[4];
     469            BigInteger[] openCLDoneKeysArray = (BigInteger[])parameters[3];
     470            BigInteger[] keycounterArray = (BigInteger[])parameters[4];
     471            BigInteger[] keysLeft = (BigInteger[])parameters[5];
    449472            try
    450473            {
     
    461484
    462485                int subbatches = keySearcherOpenCLSubbatchOptimizer.GetAmountOfSubbatches(keyTranslator);
     486                int subbatchSize = keyTranslator.GetOpenCLBatchSize() / subbatches;
     487                ((QuickWatch) QuickWatchPresentation).Dispatcher.BeginInvoke(DispatcherPriority.Normal, (SendOrPostCallback) delegate
     488                                                                    {
     489                                                                        ((QuickWatch)QuickWatchPresentation).OpenCLPresentation.batches.Content = subbatches;
     490                                                                        ((QuickWatch)QuickWatchPresentation).OpenCLPresentation.threads.Content = subbatchSize;
     491                                                                    }, null);
    463492                GuiLogMessage(string.Format("Now using {0} subbatches", subbatches), NotificationLevel.Info);
    464 
    465                 int subbatchSize = keyTranslator.GetOpenCLBatchSize() / subbatches;
     493               
    466494                float[] costArray = new float[subbatchSize];
    467495                Mem costs = oclManager.Context.CreateBuffer(MemFlags.READ_WRITE, costArray.Length * 4);
     
    487515
    488516                    doneKeysArray[threadid] += subbatchSize;
     517                    openCLDoneKeysArray[threadid] += subbatchSize;
    489518                    keycounterArray[threadid] += subbatchSize;
    490519                    keysLeft[threadid] -= subbatchSize;
     
    742771
    743772            BigInteger[] doneKeysA = new BigInteger[patterns.Length];
     773            BigInteger[] openCLDoneKeysA = new BigInteger[patterns.Length];
    744774            BigInteger[] keycounters = new BigInteger[patterns.Length];
    745775            BigInteger[] keysleft = new BigInteger[patterns.Length];
    746776            Stack threadStack = Stack.Synchronized(new Stack());
    747777            threadsStopEvents = ArrayList.Synchronized(new ArrayList());
    748             StartThreads(sender, bytesToUse, patterns, doneKeysA, keycounters, keysleft, threadStack);
     778            StartThreads(sender, bytesToUse, patterns, doneKeysA, openCLDoneKeysA, keycounters, keysleft, threadStack);
    749779
    750780            DateTime lastTime = DateTime.Now;
     
    760790                BigInteger keycounter = 0;
    761791                BigInteger doneKeys = 0;
     792                BigInteger openCLdoneKeys = 0;
    762793                foreach (BigInteger dk in doneKeysA)
    763794                    doneKeys += dk;
     795                foreach (BigInteger dk in openCLDoneKeysA)
     796                    openCLdoneKeys += dk;
    764797                foreach (BigInteger kc in keycounters)
    765798                    keycounter += kc;
     
    793826
    794827                long keysPerSecond = (long)((long)doneKeys/(DateTime.Now - lastTime).TotalSeconds);
     828                long openCLKeysPerSecond = (long)((long)openCLdoneKeys / (DateTime.Now - lastTime).TotalSeconds);
    795829                lastTime = DateTime.Now;
    796830                if (redirectResultsToStatisticsGenerator)
     
    800834                else
    801835                {
    802                     showProgress(costList, size, keycounter, keysPerSecond);                   
     836                    showProgress(costList, size, keycounter, keysPerSecond, openCLKeysPerSecond, (double)openCLdoneKeys / (double)doneKeys);
    803837                }
    804838               
     
    808842                for (int i = 0; i < doneKeysA.Length; i++)
    809843                    doneKeysA[i] = 0;
     844                openCLdoneKeys = 0;
     845                for (int i = 0; i < openCLDoneKeysA.Length; i++)
     846                    openCLDoneKeysA[i] = 0;
    810847                #endregion
    811848
     
    814851            }//end while
    815852
    816             showProgress(costList, 1, 1, 1);
     853            showProgress(costList, 1, 1, 1, 1, 1);
    817854
    818855            //wake up all sleeping threads, so they can stop:
     
    865902        }
    866903
    867         internal void showProgress(LinkedList<ValueKey> costList, BigInteger size, BigInteger keycounter, long keysPerSecond)
     904        internal void showProgress(LinkedList<ValueKey> costList, BigInteger size, BigInteger keycounter, long keysPerSecond, long openCLkeysPerSecond, double openclRatio)
    868905        {
    869906            System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding();
    870907
    871908            LinkedListNode<ValueKey> linkedListNode;
    872             ProgressChanged((double)keycounter / (double) size, 1.0);
     909            ProgressChanged((double)keycounter / (double)size, 1.0);
    873910
    874911            if (localQuickWatchPresentation.IsVisible && keysPerSecond != 0 && !stop)
     
    921958                    localQuickWatchPresentation.entries.Clear();
    922959                    linkedListNode = costList.First;
    923                    
     960
    924961                    int i = 0;
    925                     while (linkedListNode != null)
    926                     {
    927                         i++;
    928 
    929                         ResultEntry entry = new ResultEntry();
    930                         entry.Ranking = "" + i;
    931                         entry.Value = "" + Math.Round(linkedListNode.Value.value,3);
    932                         entry.Key = linkedListNode.Value.key;
    933                         entry.Text = enc.GetString(linkedListNode.Value.decryption);
    934 
    935                         localQuickWatchPresentation.entries.Add(entry);
    936                         linkedListNode = linkedListNode.Next;
    937                     }
    938                 }
    939                 , null);
    940             }//end if
    941 
    942 
    943             else if (!stop && localQuickWatchPresentation.IsVisible)
    944             {
    945 
    946                 localQuickWatchPresentation.Dispatcher.BeginInvoke(DispatcherPriority.Normal, (SendOrPostCallback)delegate
    947                 {
    948                     localQuickWatchPresentation.entries.Clear();
    949                     linkedListNode = costList.First;                   
    950                     int i = 0;
    951 
    952962                    while (linkedListNode != null)
    953963                    {
     
    965975                }
    966976                , null);
    967             }
     977            }//end if
     978
     979
     980            else if (!stop && localQuickWatchPresentation.IsVisible)
     981            {
     982
     983                localQuickWatchPresentation.Dispatcher.BeginInvoke(DispatcherPriority.Normal, (SendOrPostCallback)delegate
     984                {
     985                    localQuickWatchPresentation.entries.Clear();
     986                    linkedListNode = costList.First;
     987                    int i = 0;
     988
     989                    while (linkedListNode != null)
     990                    {
     991                        i++;
     992
     993                        ResultEntry entry = new ResultEntry();
     994                        entry.Ranking = "" + i;
     995                        entry.Value = "" + Math.Round(linkedListNode.Value.value, 3);
     996                        entry.Key = linkedListNode.Value.key;
     997                        entry.Text = enc.GetString(linkedListNode.Value.decryption);
     998
     999                        localQuickWatchPresentation.entries.Add(entry);
     1000                        linkedListNode = linkedListNode.Next;
     1001                    }
     1002                }
     1003                , null);
     1004            }
     1005
     1006            //show openCL keys/sec:
     1007            ((QuickWatch)QuickWatchPresentation).Dispatcher.BeginInvoke(DispatcherPriority.Normal, (SendOrPostCallback)delegate
     1008                    {
     1009                        ((QuickWatch)QuickWatchPresentation).OpenCLPresentation.keysPerSecond.Content = String.Format("{0:N}", openCLkeysPerSecond);
     1010                        ((QuickWatch)QuickWatchPresentation).OpenCLPresentation.ratio.Content = String.Format("{0:P}", openclRatio);
     1011                    }, null);
     1012
    9681013        }
    9691014
     
    10591104        #endregion
    10601105
    1061         private void StartThreads(IControlEncryption sender, int bytesToUse, KeyPattern.KeyPattern[] patterns, BigInteger[] doneKeysA, BigInteger[] keycounters, BigInteger[] keysleft, Stack threadStack)
     1106        private void StartThreads(IControlEncryption sender, int bytesToUse, KeyPattern.KeyPattern[] patterns, BigInteger[] doneKeysA, BigInteger[] openCLDoneKeysA, BigInteger[] keycounters, BigInteger[] keysleft, Stack threadStack)
    10621107        {
    10631108            for (int i = 0; i < patterns.Length; i++)
     
    10651110                WaitCallback worker = new WaitCallback(KeySearcherJob);
    10661111                doneKeysA[i] = new BigInteger();
     1112                openCLDoneKeysA[i] = new BigInteger();
    10671113                keycounters[i] = new BigInteger();
    10681114                bool useOpenCL = false;
     
    10711117                    useOpenCL = true;
    10721118
    1073                 ThreadPool.QueueUserWorkItem(worker, new object[] { patterns, i, doneKeysA, keycounters, keysleft, sender, bytesToUse, threadStack, useOpenCL });
     1119                ThreadPool.QueueUserWorkItem(worker, new object[] { patterns, i, doneKeysA, openCLDoneKeysA, keycounters, keysleft, sender, bytesToUse, threadStack, useOpenCL });
    10741120            }
    10751121        }
Note: See TracChangeset for help on using the changeset viewer.