Skip to content

Commit 0b00538

Browse files
EntityFXEntityFX
authored andcommitted
Added MP MFlops for OneScript
1 parent dc99c47 commit 0b00538

1 file changed

Lines changed: 259 additions & 0 deletions

File tree

src/onescript/Мпмфлопс.os

Lines changed: 259 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,259 @@
1+
Перем хЗнач;
2+
Перем аЗнач;
3+
Перем бЗнач;
4+
Перем цЗнач;
5+
Перем дЗнач;
6+
Перем еЗнач;
7+
Перем фЗнач;
8+
Перем гЗнач;
9+
Перем шЗнач;
10+
Перем жЗнач;
11+
Перем кЗнач;
12+
Перем лЗнач;
13+
Перем мЗнач;
14+
Перем оЗнач;
15+
Перем пЗнач;
16+
Перем куЗнач;
17+
Перем рЗнач;
18+
Перем сЗнач;
19+
Перем тЗнач;
20+
Перем юЗнач;
21+
Перем вЗнач;
22+
Перем ввЗнач;
23+
Перем уЗнач;
24+
25+
Перем новДанные;
26+
27+
Процедура триадаОгромная(размер, а, б, ц, д, е, ф, г, ш, ж, к, л,
28+
м, о, п, ку, р, с, т, ю, в, вв, у, х)
29+
Для ин = 0 По размер - 1 Цикл
30+
х[ин] = (х[ин] + а) * б - (х[ин] + ц) * д + (х[ин] + е) * ф -
31+
(х[ин] + г) * ш + (х[ин] + ж) * к - (х[ин] + л) * м +
32+
(х[ин] + о) * п - (х[ин] + ку) * р + (х[ин] + с) * т -
33+
(х[ин] + ю) * в + (х[ин] + вв) * у;
34+
КонецЦикла;
35+
КонецПроцедуры
36+
37+
Процедура триадаСредняя(размер, а, б, ц, д, е, ф, х)
38+
Для ин = 0 По размер - 1 Цикл
39+
х[ин] = (х[ин] + а) * б - (х[ин] + ц) * д + (х[ин] + е) * ф;
40+
КонецЦикла;
41+
КонецПроцедуры
42+
43+
Процедура триада(размер, а, б, х)
44+
Для ин = 0 По размер - 1 Цикл
45+
х[ин] = (х[ин] + а) * б;
46+
КонецЦикла;
47+
КонецПроцедуры
48+
49+
Процедура триадаКонстОгромная(размер, х)
50+
Для ин = 0 По размер - 1 Цикл
51+
х[ин] = (х[ин] + аЗнач) * бЗнач - (х[ин] + цЗнач) * дЗнач + (х[ин] + еЗнач) * фЗнач -
52+
(х[ин] + гЗнач) * шЗнач + (х[ин] + жЗнач) * кЗнач - (х[ин] + лЗнач) * мЗнач +
53+
(х[ин] + оЗнач) * пЗнач - (х[ин] + куЗнач) * рЗнач + (х[ин] + сЗнач) * тЗнач -
54+
(х[ин] + юЗнач) * вЗнач + (х[ин] + ввЗнач) * уЗнач;
55+
КонецЦикла;
56+
КонецПроцедуры
57+
58+
Процедура триадаКонстСтредняя(размер, х)
59+
Для ин = 0 По размер - 1 Цикл
60+
х[ин] = (х[ин] + аЗнач) * бЗнач - (х[ин] + цЗнач) * дЗнач + (х[ин] + еЗнач) * фЗнач;
61+
КонецЦикла;
62+
КонецПроцедуры
63+
64+
Процедура триадаКонст(размер, х)
65+
Для ин = 0 По размер - 1 Цикл
66+
х[ин] = (х[ин] + аЗнач) * бЗнач;
67+
КонецЦикла;
68+
КонецПроцедуры
69+
70+
Функция получитьОп(часть)
71+
Если часть = 0 Тогда
72+
Возврат 2;
73+
ИначеЕсли часть = 1 Тогда
74+
Возврат 8;
75+
ИначеЕсли часть = 2 Тогда
76+
Возврат 32;
77+
Иначе
78+
Возврат 0;
79+
КонецЕсли;
80+
КонецФункции
81+
82+
Процедура иницХЦпу(value, хЦпу)
83+
размер = хЦпу.Количество() - 1;
84+
Для i = 0 По размер Цикл
85+
хЦпу[i] = value;
86+
КонецЦикла;
87+
КонецПроцедуры
88+
89+
Функция проверить(хЦпу, слов, новДанные)
90+
ок1 = Истина;
91+
первый = хЦпу[0];
92+
93+
Если первый = новДанные Тогда
94+
ок1 = Ложь;
95+
КонецЕсли;
96+
97+
Для i = 0 По слов - 1 Цикл
98+
Если первый <> хЦпу[i] Тогда
99+
ок1 = Ложь;
100+
КонецЕсли;
101+
КонецЦикла;
102+
103+
Возврат ок1;
104+
КонецФункции
105+
106+
Функция запуститьТесты(слов, повторы, смещение, часть, хЦпу)
107+
секунд = ТекущаяУниверсальнаяДатаВМиллисекундах() / 1000.0;
108+
сл = слов;
109+
110+
хцп = Новый Массив;
111+
Для ин = смещение * сл По хЦпу.Количество() - 1 Цикл
112+
хцп.Добавить(хЦпу[ин]);
113+
КонецЦикла;
114+
115+
Для ин = 0 По повторы - 1 Цикл
116+
Если часть = 0 Тогда
117+
триада(сл, аЗнач, хЗнач, хцп);
118+
ИначеЕсли часть = 1 Тогда
119+
триадаСредняя(сл, аЗнач, бЗнач, цЗнач, дЗнач, еЗнач, фЗнач, хцп);
120+
ИначеЕсли часть = 2 Тогда
121+
триадаОгромная(сл, аЗнач, бЗнач, цЗнач, дЗнач, еЗнач, фЗнач, гЗнач, шЗнач,
122+
жЗнач, кЗнач, лЗнач, мЗнач, оЗнач, пЗнач, куЗнач,
123+
рЗнач, сЗнач, тЗнач, юЗнач, вЗнач, ввЗнач, уЗнач, хцп);
124+
КонецЕсли;
125+
КонецЦикла;
126+
хЦпу= хцп;
127+
Возврат ТекущаяУниверсальнаяДатаВМиллисекундах() / 1000.0 - секунд;
128+
КонецФункции
129+
130+
Процедура запуститьВсё(числоПовторов, начСлов, частьС, калибровать, заглавие, заголовок)
131+
размерХ = 0;
132+
мфлопс = 0.0;
133+
тестыОк = Ложь;
134+
секунд = ТекущаяУниверсальнаяДатаВМиллисекундах() / 1000.0;
135+
начПовт = числоПовторов;
136+
137+
Сообщить("##############################################");
138+
Сообщить("");
139+
Сообщить(СтрШаблон(" %1, %2 Потоков, %3", заглавие, 1, 1));
140+
Сообщить("");
141+
Сообщить(" Тест 4 Байт Опер/ Повторов Секунд МФлопс Первые Всё");
142+
Сообщить(" Слов Слово всего Результаты Ок");
143+
144+
145+
Для часть = 0 По частьС - 1 Цикл
146+
слов = начСлов;
147+
повторы = начПовт;
148+
Для p = 0 По частьС - 1 Цикл
149+
размерХ = слов * 4;
150+
151+
// Allocate arrays for host CPU
152+
хЦпу = Новый Массив(размерХ);
153+
Для Инд = 0 По хЦпу.Количество() - 1 Цикл
154+
хЦпу[Инд] = 0;
155+
КонецЦикла;
156+
157+
Если калибровать Тогда
158+
конецСекунд = запуститьТесты(слов, повторы, новДанные, часть, хЦпу);
159+
повторы = Цел(повторы * 15.0 / конецСекунд);
160+
начПовт = повторы;
161+
162+
калибровать = Ложь
163+
КонецЕсли;
164+
165+
тестСекунд = запуститьТесты(слов, повторы, новДанные, часть, хЦпу);
166+
оп = получитьОп(часть);
167+
168+
фмопс = слов * оп;
169+
мфлопс = повторы * фмопс / 1000000.0 / тестСекунд;
170+
секунд = секунд + тестСекунд;
171+
172+
// Print результатs
173+
результат = СтрШаблон("%1 %2 %3 %4 %5 %6", ДополнитьСтроку(заголовок, 15, " "), ДополнитьСтроку(слов, 9, " "),
174+
ДополнитьСтроку(оп, 6, " "), ДополнитьСтроку(повторы, 10, " "),
175+
ДополнитьСтроку(Формат(тестСекунд, "ЧЦ=10; ЧДЦ=6"), 10, " "), ДополнитьСтроку(Формат(мфлопс, "ЧЦ=7; ЧДЦ=1"), 8, " "));
176+
//fmt.Printf("%15s %9d %5d %8d %10.6f %8.0f ", заголовок, слов, оп, повторы, тестСекунд.Seconds(), мфлопс)
177+
178+
isTestOk = Истина;
179+
isTestOk = проверить(хЦпу, слов, новДанные);
180+
181+
слов = слов * 10;
182+
повторы = Цел(повторы / 10);
183+
184+
Если повторы < 1 Тогда
185+
повторы = 1;
186+
КонецЕсли;
187+
188+
Если isTestOk Тогда
189+
Сообщить(СтрШаблон("%1%2 Да", результат, ДополнитьСтроку(Формат(хЦпу[0], "ЧЦ=10; ЧДЦ=6"), 15, " ")));
190+
Иначе
191+
Сообщить("%1 См лог Нет", результат);
192+
КонецЕсли;
193+
КонецЦикла;
194+
195+
Сообщить("");
196+
КонецЦикла;
197+
198+
Если НЕ isTestOk Тогда
199+
Сообщить(" ERROR - At least первый first результат of 0.999999 - no calculations?");
200+
КонецЕсли;
201+
КонецПроцедуры
202+
203+
Функция ДополнитьСтроку(Знач Значение, Знач ДлинаСтроки, Знач Символ = "0", Знач Режим = "Слева") Экспорт
204+
// Длина символа не должна превышать единицы.
205+
Символ = Лев(Символ, 1);
206+
// Удаляем крайние пробелы слева и справа строки.
207+
Значение = СокрЛП(Значение);
208+
КоличествоСимволовНадоДобавить = ДлинаСтроки - СтрДлина(Значение);
209+
Если КоличествоСимволовНадоДобавить > 0 Тогда
210+
СтрокаДляДобавления = СформироватьСтрокуСимволов(Символ, КоличествоСимволовНадоДобавить);
211+
Если ВРег(Режим) = "СЛЕВА" Тогда
212+
Значение = СтрокаДляДобавления + Значение;
213+
ИначеЕсли ВРег(Режим) = "СПРАВА" Тогда
214+
Значение = Значение + СтрокаДляДобавления;
215+
КонецЕсли; КонецЕсли; Возврат Значение;
216+
КонецФункции
217+
218+
Функция СформироватьСтрокуСимволов(Знач Символ, Знач ДлинаСтроки) Экспорт
219+
Результат = "";
220+
Для Счетчик = 1 По ДлинаСтроки Цикл
221+
Результат = Результат + Символ;
222+
КонецЦикла;
223+
Возврат Результат;
224+
КонецФункции
225+
226+
хЗнач = 0.999950;
227+
аЗнач = 0.000020;
228+
бЗнач = 0.999980;
229+
цЗнач = 0.000011;
230+
дЗнач = 1.000011;
231+
еЗнач = 0.000012;
232+
фЗнач = 0.999992;
233+
гЗнач = 0.000013;
234+
шЗнач = 1.000013;
235+
жЗнач = 0.000014;
236+
кЗнач = 0.999994;
237+
лЗнач = 0.000015;
238+
мЗнач = 1.000015;
239+
оЗнач = 0.000016;
240+
пЗнач = 0.999996;
241+
куЗнач = 0.000017;
242+
рЗнач = 1.000017;
243+
сЗнач = 0.000018;
244+
тЗнач = 1.000018;
245+
юЗнач = 0.000019;
246+
вЗнач = 1.000019;
247+
ввЗнач = 0.000021;
248+
уЗнач = 1.000021;
249+
250+
новДанные = 0.999999;
251+
252+
заголовок = "Данные вх & вых ";
253+
заголовокConst = "Данные конс ";
254+
заглавие = "МП МФлопс Бенчмарк";
255+
256+
числоСлов = 10240; // E Number of слов in arrays
257+
числоПовторов = 500; // R Number of repeat passes
258+
259+
запуститьВсё(числоПовторов, числоСлов, 3, Ложь, заглавие, заголовок);

0 commit comments

Comments
 (0)