source: trunk/CrypPlugins/KeySearcher/KeySearcherSettings.cs @ 8528

Last change on this file since 8528 was 8528, checked in by Sven Rech, 2 years ago

KeySearcher OpenCL:

  • Reactivated OpenCL for Cloud KeySearcher
    • Fixed bug in best list evaluation metric
    • Fixed bug in finding out correct device by index
    • Fixed releasing of mutex
  • Local KeySearcher: Made all OpenCL devices of all contexts available for selection (previously, only first context was used)
File size: 16.7 KB
Line 
1using System;
2using System.Collections.Generic;
3using System.Windows;
4using Cryptool.PluginBase;
5using System.ComponentModel;
6using System.Collections.ObjectModel; 
7using KeySearcher.Properties;
8using KeyTextBox;
9using OpenCLNet;
10
11namespace KeySearcher
12{
13    public class KeySearcherSettings : ISettings
14    {
15        private readonly KeySearcher keysearcher;
16        private int coresUsed;
17        private string csvPath = "";
18
19        public class OpenCLDeviceSettings
20        {
21            private KeySearcherSettings _settings;
22            internal string name;
23            internal int index;
24            internal int mode;
25            internal bool useDevice;
26
27            public bool UseDevice
28            {
29                get { return useDevice; }
30                set
31                {
32                    if (_settings.OpenCLDevice == index)
33                        _settings.UseOpenCL = value;
34                    useDevice = value;
35                }
36            }
37
38            public OpenCLDeviceSettings(KeySearcherSettings settings)
39            {
40                _settings = settings;
41            }
42        }
43
44        private List<OpenCLDeviceSettings> deviceSettings = new List<OpenCLDeviceSettings>();
45        public List<OpenCLDeviceSettings> DeviceSettings
46        {
47            get
48            {
49                return deviceSettings;
50            }
51        }
52
53        public event TaskPaneAttributeChangedHandler TaskPaneAttributeChanged;
54
55        public KeySearcherSettings(KeySearcher ks, OpenCLManager oclManager)
56        {
57            keysearcher = ks;
58            RefreshDevicesList(oclManager);
59
60            CoresAvailable.Clear();
61            for (int i = -1; i < Environment.ProcessorCount; i++)
62                CoresAvailable.Add((i + 1).ToString());
63            CoresUsed = Environment.ProcessorCount - 1;
64            KeyManager = new SimpleKeyManager("");
65        }
66
67        private void RefreshDevicesList(OpenCLManager oclManager)
68        {
69            devicesAvailable.Clear();
70            int c = 0;
71            if (oclManager != null)
72            {
73                for (var id = 0; id < OpenCL.GetPlatforms().Length; id++)
74                {
75                    oclManager.CreateDefaultContext(id, DeviceType.ALL);
76                    foreach (var device in oclManager.Context.Devices)
77                    {
78                        string deviceName = device.Vendor + ":" + device.Name;
79                        deviceSettings.Add(new OpenCLDeviceSettings(this) { name = deviceName, index = c, mode = 1, UseDevice = false });
80                        devicesAvailable.Add(deviceName);
81                        c++;
82                    }
83                }
84            }
85            DevicesAvailable = devicesAvailable;    //refresh list
86            if (devicesAvailable.Count > 0)
87                OpenCLDevice = 0;
88            else
89                this.openCLDevice = -1;
90        }
91
92        public void Initialize()
93        {           
94            OpenCLGroupVisiblity();
95            Cryptool.PluginBase.Properties.Settings.Default.PropertyChanged += delegate
96                                                    {
97                                                        OpenCLGroupVisiblity();
98                                                    };
99                       
100        }
101
102        [TaskPane("KeyCaption", "KeyTooltip", null, 1, false, ControlType.KeyTextBox, true, "KeyManager")]
103        public String Key
104        {
105            get
106            {
107                return KeyManager.GetKey();
108            }
109            set
110            {
111                KeyManager.SetKey(value);
112                OnPropertyChanged("Key");
113                //if (!(keysearcher.Pattern != null && keysearcher.Pattern.testWildcardKey(value)))
114                //    keysearcher.GuiLogMessage(Resources.Wrong_key_pattern_, NotificationLevel.Error);
115            }
116        }
117
118        public KeyTextBox.SimpleKeyManager KeyManager { get; private set; }
119
120        [TaskPane( "ResetCaption", "ResetTooltip", null, 2, false, ControlType.Button)]
121        public void Reset()
122        {
123            if (keysearcher != null && keysearcher.Pattern != null)
124            {
125                Key = keysearcher.Pattern.giveInputPattern();
126            }
127        }
128       
129        [TaskPane( "CoresUsedCaption", "CoresUsedTooltip", null, 3, false, ControlType.DynamicComboBox, new string[] { "CoresAvailable" })]
130        public int CoresUsed
131        {
132            get { return this.coresUsed; }
133            set
134            {
135                if (value != this.coresUsed)
136                {
137                    this.coresUsed = value;
138                    OnPropertyChanged("CoresUsed");
139                }
140            }
141        }
142
143        #region crypcloud
144
145        private bool usePeerToPeer;
146        [TaskPane("settings__caption_useNetwork", "settings__tooltip_useNetwork", "GroupPeerToPeer", 0, false, ControlType.CheckBox)]
147        public bool UsePeerToPeer
148        {
149            get { return usePeerToPeer; }
150            set
151            {
152                if (value != usePeerToPeer)
153                {
154                    usePeerToPeer = value;
155                    OnPropertyChanged("UsePeerToPeer");
156                }
157            }
158        }
159
160        private int numberOfBlocks;
161        [TaskPane("settings__caption_numberOfBlocks", "settings__tooltip_numberOfBlocks", "GroupPeerToPeer", 3, false, ControlType.NumericUpDown, ValidationType.RangeInteger, 1, 128)]
162        public int NumberOfBlocks
163        {
164            get { return numberOfBlocks; }
165            set
166            {
167                if (value != numberOfBlocks)
168                {
169                    numberOfBlocks = value;
170                    OnPropertyChanged("NumberOfBlocks"); 
171                }
172            }
173        }
174
175        #endregion
176
177        private string evaluationHost;
178        //[TaskPane( "EvaluationHostCaption", "EvaluationHostTooltip", "GroupEvaluation", 0, false, ControlType.TextBox)]
179        public String EvaluationHost
180        {
181            get
182            {
183                return evaluationHost;
184            }
185            set
186            {
187                if (value != evaluationHost)
188                {
189                    evaluationHost = value;
190                    OnPropertyChanged("EvaluationHost");
191                }
192            }
193        }
194
195        private string evaluationUser;
196        //[TaskPane( "EvaluationUserCaption", "EvaluationUserTooltip", "GroupEvaluation", 1, false, ControlType.TextBox)]
197        public String EvaluationUser
198        {
199            get
200            {
201                return evaluationUser;
202            }
203            set
204            {
205                if (value != evaluationUser)
206                {
207                    evaluationUser = value;
208                    OnPropertyChanged("EvaluationUser");
209                }
210            }
211        }
212
213        private string evaluationPassword;
214        //[TaskPane( "EvaluationPasswordCaption", "EvaluationPasswordTooltip", "GroupEvaluation", 2, false, ControlType.TextBox)]
215        public String EvaluationPassword
216        {
217            get
218            {
219                return evaluationPassword;
220            }
221            set
222            {
223                if (value != evaluationPassword)
224                {
225                    evaluationPassword = value;
226                    OnPropertyChanged("EvaluationPassword");
227                }
228            }
229        }
230
231        private string evaluationDatabase;
232        //[TaskPane( "EvaluationDatabaseCaption", "EvaluationDatabaseTooltip", "GroupEvaluation", 3, false, ControlType.TextBox)]
233        public String EvaluationDatabase
234        {
235            get
236            {
237                return evaluationDatabase;
238            }
239            set
240            {
241                if (value != evaluationDatabase)
242                {
243                    evaluationDatabase = value;
244                    OnPropertyChanged("EvaluationDatabase");
245                }
246            }
247        }
248
249        #region OpenCL
250
251        [TaskPane( "NoOpenCLCaption", "NoOpenCLTooltip", "GroupOpenCL", 1, false, ControlType.TextBoxReadOnly)]
252        [DontSave]
253        public string NoOpenCL
254        {
255            get { return Resources.No_OpenCL_Device_available_; }
256            set {}
257        }
258
259        private void OpenCLGroupVisiblity()
260        {
261            if (TaskPaneAttributeChanged == null)
262                return;
263
264            if (!Cryptool.PluginBase.Properties.Settings.Default.KeySearcher_UseOpenCL)
265            {
266                TaskPaneAttributeChanged(this, new TaskPaneAttributeChangedEventArgs(new TaskPaneAttribteContainer("OpenCLDevice", Visibility.Collapsed)));
267                TaskPaneAttributeChanged(this, new TaskPaneAttributeChangedEventArgs(new TaskPaneAttribteContainer("OpenCLMode", Visibility.Collapsed)));
268                TaskPaneAttributeChanged(this, new TaskPaneAttributeChangedEventArgs(new TaskPaneAttribteContainer("UseOpenCL", Visibility.Collapsed)));
269                TaskPaneAttributeChanged(this, new TaskPaneAttributeChangedEventArgs(new TaskPaneAttribteContainer("NoOpenCL", Visibility.Collapsed)));
270            }
271            else
272            {
273                if (DevicesAvailable.Count == 0)
274                {
275                    TaskPaneAttributeChanged(this, new TaskPaneAttributeChangedEventArgs(new TaskPaneAttribteContainer("OpenCLDevice", Visibility.Collapsed)));
276                    TaskPaneAttributeChanged(this, new TaskPaneAttributeChangedEventArgs(new TaskPaneAttribteContainer("OpenCLMode", Visibility.Collapsed)));
277                    TaskPaneAttributeChanged(this, new TaskPaneAttributeChangedEventArgs(new TaskPaneAttribteContainer("UseOpenCL", Visibility.Collapsed)));
278                    TaskPaneAttributeChanged(this, new TaskPaneAttributeChangedEventArgs(new TaskPaneAttribteContainer("NoOpenCL", Visibility.Visible)));
279                }
280                else
281                {
282                    TaskPaneAttributeChanged(this, new TaskPaneAttributeChangedEventArgs(new TaskPaneAttribteContainer("OpenCLDevice", Visibility.Visible)));
283                    TaskPaneAttributeChanged(this, new TaskPaneAttributeChangedEventArgs(new TaskPaneAttribteContainer("OpenCLMode", Visibility.Visible)));
284                    TaskPaneAttributeChanged(this, new TaskPaneAttributeChangedEventArgs(new TaskPaneAttribteContainer("UseOpenCL", Visibility.Visible)));
285                    TaskPaneAttributeChanged(this, new TaskPaneAttributeChangedEventArgs(new TaskPaneAttribteContainer("NoOpenCL", Visibility.Collapsed)));
286                }
287            }
288        }
289
290        private int openCLDevice;
291        [TaskPane( "OpenCLDeviceCaption", "OpenCLDeviceTooltip", "GroupOpenCL", 1, false, ControlType.DynamicComboBox, new string[] { "DevicesAvailable" })]
292        [DontSave]
293        public int OpenCLDevice
294        {
295            get { return this.openCLDevice; }
296            set
297            {
298                if (value != this.openCLDevice)
299                {
300                    this.openCLDevice = value;
301                    UseOpenCL = deviceSettings[value].UseDevice;
302                    OpenCLMode = deviceSettings[value].mode;
303                    OnPropertyChanged("OpenCLDevice");
304                }
305            }
306        }
307
308        [TaskPane( "UseOpenCLCaption", "UseOpenCLTooltip", "GroupOpenCL", 2, false, ControlType.CheckBox)]
309        [DontSave]
310        public bool UseOpenCL
311        {
312            get
313            {
314                if (OpenCLDevice != -1 && deviceSettings.Count > OpenCLDevice)
315                    return deviceSettings[OpenCLDevice].UseDevice;
316                else
317                    return false;
318            }
319            set
320            {
321                if (OpenCLDevice != -1 && (deviceSettings.Count > OpenCLDevice) && (value != deviceSettings[OpenCLDevice].UseDevice))
322                {
323                    deviceSettings[OpenCLDevice].useDevice = value;
324                    OnPropertyChanged("UseOpenCL");
325                }
326            }
327        }
328
329        [TaskPane("OpenCLModeCaption", "OpenCLModeTooltip", "GroupOpenCL", 3, false, ControlType.RadioButton, new string[] { "OpenCLModeList1", "OpenCLModeList2", "OpenCLModeList3" })]
330        [DontSave]
331        public int OpenCLMode
332        {
333            get
334            {
335                if (OpenCLDevice != -1 && deviceSettings.Count > OpenCLDevice)
336                    return deviceSettings[OpenCLDevice].mode;
337                else
338                    return 0;
339            }
340            set
341            {
342                if (OpenCLDevice != -1 && (deviceSettings.Count > OpenCLDevice) && (value != deviceSettings[OpenCLDevice].mode))
343                {
344                    if (Cryptool.PluginBase.Properties.Settings.Default.KeySearcher_EnableHighLoad || value != 2)
345                        deviceSettings[OpenCLDevice].mode = value;
346                    else
347                        keysearcher.GuiLogMessage(
348                            "Using \"High Load\" is disabled. Please check your CrypTool 2 settings.", NotificationLevel.Error);
349
350                    OnPropertyChanged("OpenCLMode");
351                }
352            }
353        }
354       
355        private ObservableCollection<string> devicesAvailable = new ObservableCollection<string>();
356        [DontSave]
357        public ObservableCollection<string> DevicesAvailable
358        {
359            get { return devicesAvailable; }
360            set
361            {
362                if (value != devicesAvailable)
363                {
364                    devicesAvailable = value;
365                }
366                OnPropertyChanged("DevicesAvailable");
367            }
368        }
369
370        #endregion
371
372        #region Statistic
373        /// <summary>
374        /// Getter/Setter for the time interval (minutes)
375        /// </summary>
376        private int updatetime = 30;
377        //[TaskPane( "UpdateTimeCaption", "UpdateTimeTooltip", "GroupStatisticPath", 1, false, ControlType.TextBox)]
378        public int UpdateTime
379        {
380            get { return updatetime; }
381            set
382            {
383                if (value != updatetime)
384                {
385                    updatetime = value;
386                    OnPropertyChanged("UpdateTime");
387                }
388            }
389        }
390
391        /// <summary>
392        /// Able/Disable for the update time interval
393        /// </summary>
394        private bool disableupdate = false;
395        //[TaskPane( "DisableUpdateCaption", "DisableUpdateTooltip", "GroupStatisticPath", 2, false, ControlType.CheckBox)]
396        public bool DisableUpdate
397        {
398            get { return disableupdate; }
399            set
400            {
401                if (value != disableupdate)
402                {
403                    disableupdate = value;
404                    OnPropertyChanged("DisableUpdate");
405                }
406            }
407        }
408         
409        /// <summary>
410        /// Getter/Setter for the csv file
411        /// </summary>
412        //[TaskPane( "CsvPathCaption", "CsvPathTooltip", "GroupStatisticPath", 3, false, ControlType.SaveFileDialog, FileExtension = "Comma Seperated Values (*.csv)|*.csv")]
413        public string CsvPath
414        {
415            get { return csvPath; }
416            set
417            {
418                if (value != csvPath)
419                {
420                    csvPath = value;
421                    OnPropertyChanged("CsvPath");
422                }
423            }
424        }
425
426        /// <summary>
427        /// Button to "reset" the csv file. That means it will not appear any more in the text field
428        /// </summary>
429        //[TaskPane( "DefaultPathCaption", "DefaultPathTooltip", "GroupStatisticPath", 4, false, ControlType.Button)]
430        public void DefaultPath()
431        {
432            csvPath = "";
433            OnPropertyChanged("CsvPath");
434        }       
435        #endregion
436
437        private ObservableCollection<string> coresAvailable = new ObservableCollection<string>();
438        [DontSave]
439        public ObservableCollection<string> CoresAvailable
440        {
441            get { return coresAvailable; }
442            set
443            {
444                if (value != coresAvailable)
445                {
446                    coresAvailable = value;
447                    OnPropertyChanged("CoresAvailable");
448                }
449            }
450        }
451
452        #region INotifyPropertyChanged Members
453
454        public event PropertyChangedEventHandler PropertyChanged;
455
456        private void OnPropertyChanged(string p)
457        {
458            if (PropertyChanged != null)
459            {
460                PropertyChanged(this, new PropertyChangedEventArgs(p));
461            }
462        }
463
464        #endregion
465    }
466}
Note: See TracBrowser for help on using the repository browser.