Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Сб ноя 08, 2025 00:39

...
Google Search
Forth-FAQ Spy Grafic

Часовой пояс: UTC + 3 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 28 ]  На страницу Пред.  1, 2
Автор Сообщение
 Заголовок сообщения: Re: Тесты для микроконтроллеров и процессоров в ПЛИС
СообщениеДобавлено: Сб сен 27, 2025 01:17 
Не в сети
Аватара пользователя

Зарегистрирован: Ср июл 03, 2019 11:10
Сообщения: 634
Откуда: Москва
Благодарил (а): 61 раз.
Поблагодарили: 30 раз.
Во, относительно свежее (2025 год): https://theultimatebenchmark.org/
Там штук 5 простеньких тестов на Форте плюс таблица с результатами для разных Фортов/процессоров, натравлю, пожалуй, какой-нибудь свой процессор на эти тесты.

Кстати, в природе есть готовый Coremark на Форте.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Тесты для микроконтроллеров и процессоров в ПЛИС
СообщениеДобавлено: Сб сен 27, 2025 18:12 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 8050
Благодарил (а): 29 раз.
Поблагодарили: 147 раз.
Total Vacuum писал(а):
Или можно нарезать адресное пространство процессора на несколько частей, каждому ускорителю выделить немного BRAM, которая будет видна процессору и одному конкретному ускорителю. Тогда процессор будет давать задания ускорителям просто размещая данные по нужному адресу...

В этом в целом смысл программно-аппаратной системы. Как только появляется что-то простое и многотактовое (в смысле итераций), организуется аппаратный блок, потому что иначе начнется заведомо проигрышная попытка как-то ускорить Форт. Заполнение памяти из внешнего источника может идти просто каждым тактом, по второму порту BRAM. Например, с АЦП идет поток данных, тогда АЦП на своей частоте туда пишет, а процессор по второму порту читает (писать ему, собственно, и не надо). Или видеоконтроллер - тут наоборот, процессор пишет, а контроллер постоянно читает. Для видеоконтроллера как раз можно добавлять вывод линий в аппаратном цикле, а не в цикле процессора, потому что рисование горизонтальной линии с 4 параметрами на стеке - это постоянные манипуляции, вывод в порт (и копирование стека, чтобы не терять параметры). Заведомо проигрышно же, нет смысла ввязываться в "оптимизацию Форта".

С одной стороны, получается постоянная правка "по месту". А с другой - ну и что? Зачем биться головой в стену, пытаясь сделать процессор на все случаи? Вот есть освоенная и рабочая методика проектирования связок процессор+ускоритель, она уже в голове и готова к применению. Запросы "сделайте нам для всех, чтобы скачать и сразу все работало" - это для ситуации, когда нет времени и ресурсов на самостоятельную разработку. Например, если нужен беспроводной интерфейс, не делать же BlueTooth самому, если это не определяющий компонент изделия? Поэтому когда в системе процессор - это "просто процессор", его удобнее скачать откуда-нибудь вместе с комплектом средств для программирования. А если изделие само по себе строится вокруг эффективной связки цифровой схемы и софта, тут уже надо погружаться и тюнинговать, не ограничиваясь шаблонами "как оно у всех сделано". В ПЛИС-то нет никаких проблем подключить несколько областей памяти, и даже несколько адресных пространств. Можно и периферию отображать на регистры ядра процессора (если вокруг этой периферии все и вертится).


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Тесты для микроконтроллеров и процессоров в ПЛИС
СообщениеДобавлено: Вс сен 28, 2025 23:18 
Не в сети
Аватара пользователя

Зарегистрирован: Ср июл 03, 2019 11:10
Сообщения: 634
Откуда: Москва
Благодарил (а): 61 раз.
Поблагодарили: 30 раз.
Что-то прям загорелся идеей сделать акселератор для работы с памятью, но повесить его на основной порт BRAM в промежутках между командами @/! (там времени вагон), а второй порт оставить в резерве для второго параллельного ядра. Вроде не сильно сложно должно получиться: если команда @/!, то за шины данных/адреса и сигнал write enable отвечает процессор, а в противном случае процессор от шин отдыхает, а там хозяйничает акселератор. Неочевидное преимущество такого подхода в том, что можем писать/читать/сравнивать данные из разных частей адресного пространства, а не только из основной RAM.

:) Тесты прогнал, результаты забавные. Надо только к общему знаменателю привести, чтобы было удобнее сравнивать: либо в итерациях на мегагерц, либо в тактах на итерацию. Там, кстати, и по прошлым сезонам какие-то результаты есть, но самих тестов в виде исходников нет, а так и их можно было бы прогнать.
Код:
          countup     arithm       nesting      logic        memory
f3H/20MHz 9.003(1000) 18.639(10)   35.148(100)  6.250(100)   7.651(10)
f44/20MHz 6.501(1000) 30.048(100)  37.499(1000) 30.000(1000) 18.012(100)
f61/20MHz 0.500(1000) 14.499(1000) 22.999(1000) 6.000(1000)  8.003(100)
Не прогонял только тест stacks, т.к. у меня стек возвратов исключительно для call/ret и иногда для циклов, а всякие r@/>r/r> без надобности. И цикл begin-until почему-то не люблю (и не делаю) из-за необходимости "инвертировать" в уме условие, поэтому вместо него в теле всех тестов do-loop.

В тактах на итерацию:
Код:
                                      count  arith  nest logic stack  mem
sorbus/65ce02/1.25Mhz                   150   1341   153   404   421   427
Steckschwein/65c02/10Mhz                334   2770   513   668   702   720
MEGA65/65GS02/40.5Mhz                   818   8529  3195  1760  1869  1590
Junior Computer ][/6502/1MHz            733   6575  2759  1483  1637  1410
ZX Spectrum 48K/Z80/3.5Mhz             1103   7525  5425  3990  2669  2013
My4th/My4th/8Mhz                      10880 119040 17360 26400 34400 24688
Volla Phone 22/MT6769V(ARM)/1Ghz          7     25   147    35   148    37
Asus RO7N/Intel Celeron N3350/2.2Ghz     18    165   480   134   481   147

f3H/20MHz                                18   3728   703   125         153
f44/20MHz                                13    601    75    60          36
f61/20MHz                                 1     29    46    12          16
В основном некая серая масса в плане производительности (оставил лишь те, что получше) и особняком ARM и Celeron в двух нижних строчках в связке с gforth. А из моих лучший 3-битный, самый ходовой 4-битный и единственный 6-битный. В 3-битном нет умножения/деления/call/ret (да там вообще почти ничего нет :) ), поэтому результаты arith и nest где-то на уровне серой массы, но, на удивление, по всем прочим тестам ноздря в ноздрю с Celeron'ом. В 4-битном нет деления, поэтому на arith все еще уступает ARM и Celeron, но теперь на всех прочих тестах уверенно обходит Celeron, а на некоторых даже ARM. А в 6-битном есть 16-тактное аппаратное деление, аппаратные однотактные циклы while-repeat и do-loop, так что он даже ARM уделывает одной левой. Более того, даже в 4-битный также можно впихнуть однотактные циклы и деление. Осталось понять, почему арифметика на пару тактов медленнее, чем в ARM.
Но выводы какие-то делать нет смысла. Единственное, что точно понятно, что если процессор хотя бы отдаленно forth-friendly, то Форт на него ложится намного лучше, чем на процессор общего назначения.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Тесты для микроконтроллеров и процессоров в ПЛИС
СообщениеДобавлено: Пн сен 29, 2025 10:49 
Не в сети

Зарегистрирован: Вс авг 21, 2022 14:56
Сообщения: 46
Благодарил (а): 2 раз.
Поблагодарили: 5 раз.
Total Vacuum писал(а):
наверное, как-то можно один такой аппаратный ускоритель посадить на основной порт BRAM и вклинить по времени в промежутках между командами @/!

Тут, наверное, стоит сначала решить: нужно ли паралельное выполнение копирования блоков памяти. Зачастую, давая команду копирования, мы ожидаем результат сразу после команды.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Тесты для микроконтроллеров и процессоров в ПЛИС
СообщениеДобавлено: Пн сен 29, 2025 16:08 
Не в сети
Аватара пользователя

Зарегистрирован: Ср июл 03, 2019 11:10
Сообщения: 634
Откуда: Москва
Благодарил (а): 61 раз.
Поблагодарили: 30 раз.
tsdima писал(а):
Тут, наверное, стоит сначала решить: нужно ли паралельное выполнение копирования блоков памяти. Зачастую, давая команду копирования, мы ожидаем результат сразу после команды.

Вообще предполагается некий аналог DMA, который позволит применительно к разным областям памяти однократно/постоянно копировать/читать/сравнивать/заливать каким-то значением и т.д. В т.ч. при желании сможет быть использован в качестве strcpy/strcmp/memcpy и т.д. Или, например, для заливки изображений в видеоадаптер.

Просто для иллюстрации: на процессоре f44 одна итерация бенча Dhrystone занимает 5455 тактов. В теле теста всегда выполняется как минимум по 1шт. strcpy() и memcpy(). Или больше, не вникал особо.
Так вот 20000 итераций strcpy(Str_2_loc,"DHRYSTONE PROGRAM, 2'ND STRING") выполняются за 977мс, а такое же количество присваиваний структур (memcpy) длиной 35 слов за 1232мс. В тактах получается 977 и 1232 такта на итерацию (по формуле время*частота/количество итераций) или 32 и 35 тактов на элемент. Т.е. только эти 2 операции отъедают 40% от всех 5455 тактов. А если такие операцию поручить акселератору, он отстреляется за 30 с хвостиком тактов. Ну или за 60, надо ж читать/писать. Пусть даже еще больше, если учитывать подготовительные операции по настройке регистров. Но в любом случае тут ничтожное количество тактов в сравнении с поэлементным ручным копированием. И нам останется лишь ждать в коротком цикле и опрашивать статус текущей операции, тактов на 6 тело такого цикла получится. Да и не всегда требуется ждать окончания операции, иногда получится обойтись и без опроса регистра статуса.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Тесты для микроконтроллеров и процессоров в ПЛИС
СообщениеДобавлено: Пн сен 29, 2025 20:33 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 8050
Благодарил (а): 29 раз.
Поблагодарили: 147 раз.
Вот! Пошло дело! :) Это как раз из серии качественных изменений в архитектуре, когда делаются не аккуратные вылазки из окрестностей известных шаблонов, а свободное мышление в рамках сформулированной задачи. Обычно так и бывает - с точки зрения схемотехники, можно конструкцию упаковать настолько плотно, чтобы каждым тактом происходило что-то полезное. Но с точки зрения логики и процесса разработки - для сложного проекта это нереально, невозможно все сразу вместить в голову и делать финальную версию системы, у которой ни одного такта не пропадает. Поэтому то, что надо менять, отдаем процессору, и постоянно "вытесняем" в аппаратуру проработанные и понятные фрагменты. И Форт тут очень к месту, потому что процессор со своей программой становится такой специальной вещью под названием "заткни временные дыры и не мешай".


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Тесты для микроконтроллеров и процессоров в ПЛИС
СообщениеДобавлено: Ср окт 01, 2025 18:46 
Не в сети
Аватара пользователя

Зарегистрирован: Ср июл 03, 2019 11:10
Сообщения: 634
Откуда: Москва
Благодарил (а): 61 раз.
Поблагодарили: 30 раз.
Накидал в максимально простом варианте, пока чисто проверить концепцию. В адресном пространстве процессора 2 регистра, в которых хранятся адреса источника и приемника. DMA, когда шина свободна, постоянно копирует из источника в приемник.
В тесте натравливаем источник на переменную a, а приемник в цикле попеременно на переменные b и c. Инкрементируем a, а DMA мгновенно (по меркам процессора) пересылает новое значение в b либо c.
Код:
enum {
   SI = 0x7005,
   DI = 0x700D
};

int a = 0x1234, b = 0xDEAD, c = 0xBEEF;

void main () {
   *(int*)UARTBRR = 173;
   *(int*)TIMERRELOAD = 20000;

   printf("%X %X %X%n",a,b,c);

   *(int*)SI = &a;

   while (1) {
      *(int*)DI = &b;
      printf("%X %X %X  ",++a,b,c);

      *(int*)DI = &c;
      printf("%X %X %X%n",++a,b,c);

      delay(1000);
   }
}
В терминале такое:
Код:
1234 DEAD BEEF
1235 1235 BEEF  1236 1235 1236
1237 1237 1236  1238 1237 1238
1239 1239 1238  123A 1239 123A
Сделаю, пожалуй, на этой базе memcpy и strcpy. Ну и, наверное, strcmp. Проблем не должно быть.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Тесты для микроконтроллеров и процессоров в ПЛИС
СообщениеДобавлено: Чт окт 09, 2025 15:54 
Не в сети
Аватара пользователя

Зарегистрирован: Ср июл 03, 2019 11:10
Сообщения: 634
Откуда: Москва
Благодарил (а): 61 раз.
Поблагодарили: 30 раз.
Total Vacuum писал(а):
В 4-битном нет деления, поэтому на arith все еще уступает ARM и Celeron, но теперь на всех прочих тестах уверенно обходит Celeron, а на некоторых даже ARM.
Total Vacuum писал(а):
Более того, даже в 4-битный также можно впихнуть однотактные циклы и деление.
Немного copy/paste, тяп-ляп и готово.
Код:
          countup     arithm       nesting      logic        memory
f4U/20MHz 0.500(1000) 20.499(1000) 31.499(1000) 22.499(1000) 12.505(100)
Код:
                                      count  arith  nest logic stack  mem
Volla Phone 22/MT6769V(ARM)/1Ghz          7     25   147    35   148    37
Asus RO7N/Intel Celeron N3350/2.2Ghz     18    165   480   134   481   147
f4U/20MHz                                 1     41    63    45          25
Аппаратный цикл со счетчиком и деление вместо rshift. В таком варианте разрывает Celeron на куски на всех тестах, да и ARM местами тоже, уступая ему немного лишь на тестах arith и logic, но тут как раз понятно: в системе команд мало места, поэтому сложения/умножения приходится делать через умножение с накоплением, а всю логику через nand. И процессору с 6-битными командами теперь не так заметно уступает. Вообще достаточно пластичная конструкция получается... :)
Система команд такая:
Код:
0 1 do loop num jz call ret @ ! swap pick nand - mla /


Кстати, добил указатели на функции в трансляторе Си-в-Форт, но Coremark все равно пока не будет работать, т.к. там, оказывается, еще и 32-битная арифметика нужна, а процессор 16-битный. Где-то у меня в загашнике есть Coremark на Форте, выложу, как найду.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Тесты для микроконтроллеров и процессоров в ПЛИС
СообщениеДобавлено: Пн окт 13, 2025 20:12 
Не в сети
Аватара пользователя

Зарегистрирован: Ср июл 03, 2019 11:10
Сообщения: 634
Откуда: Москва
Благодарил (а): 61 раз.
Поблагодарили: 30 раз.
Берем самый слабый процессор, прикручиваем к нему strcpy/memcpy через DMA, в результате 16384 итераций Dhrystone на частоте 20МГц теперь выполняется не за 6.266 секунд, а за 4.558 (если честно ждать окончание копирования после каждой операции) или даже 4.416 (если не ждать после memcpy, т.к. тут точно успевает, а после strcpy добавить немного ручных nop, там буквально пару символов не успевает скопироваться в том месте, где два strcpy в коде идут подряд, в теории такую добавку мог бы делать компилятор). Если в тактах на итерацию, то вместо 7649 становится 5471 или даже 5391 тактов. Т.е. производительность вырастает примерно на 40%, а число тактов на итерацию уменьшается на 2 с лишним тысячи. И хотя тут сложение вместо умножения или умножения с накоплением, 2/ вместо rshift или деления, а литералы набиваются 2-битными порциями, а не 4-битными, процессор, тем не менее, почти догоняет самые быстрые 4-битные процессоры из числа тех, что без поддержки аппаратных циклов. И немудрено, ведь копирование через DMA ест 2 такта на символ, а программное все 30-40, и даже если цикл развернуть, выйдет примерно с десяток-другой тактов. При этом strcmp все еще не через DMA, а программный. Пока обошелся тремя регистрами: адреса источника и приемника, а также счетчик. Если счетчик равен 0, то strcpy, иначе - memcpy. Не могу сообразить, как бы сюда поэлегантнее strcmp прикрутить.

upd. Ну и strcmp набросал на скорую руку. В итоге было/стало:
Код:
cpu     MHz Dhry  s     Dhry/s DMIPS DMIPS/MHz
f46     20  16384 6.213 2637   1.50  0.08
f46+DMA 20  16384 3.968 4129   2.35  0.12
Стало быстрее на 57%, а число тактов на итерацию уменьшилось с 7584 до 4844. И теперь этот совсем слабый и больной процессор обходит любой из тех, в которых нет аппаратной поддержки циклов, и даже большинство из тех, что с циклами. И это с честным ожиданием после каждой из операций strcpy/memcpy/strcmp, хотя некоторые опросы статуса можно безболезненно убрать, тогда за 60% будет прирост скорости. К остальным процессорам тоже прикручу DMA при случае, но сначала потренируюсь и доведу до ума на этом образце. Пока реализовано на тех же трех регистрах, для выполнения операции strcmp в счетчик надо записать отрицательное число, причем такое, которое не может получиться при посимвольном вычитании двух строк, например, 0x8000. Оно будет висеть в регистре статуса до первого несовпадения или до конца строки.

Вообще в данном конкретном тесте модуль DMA хоть и занимает шины попеременно с процессором, но такой режим работы сложно назвать параллельным, т.к. мы запускаем операцию strcpy/memcpy/strcmp, но продолжаем выполнение программы лишь дождавшись окончания этой операции. Хотя можно придумать много сценариев, когда даже такой примитивный DMA будет работать параллельно с процессором, сравнивая/копируя строки/блоки памяти, пока процессор занят другими более важными делами.

Надо будет еще оформить режимы работы DMA, когда забираем данные из одного и того же регистра периферии и раскладываем по разным ячейкам в памяти, либо наоборот пересылаем блок памяти посимвольно в один и тот же регистр периферии. Другими словами, когда размеры блоков памяти источника/приемника произвольные и могут различаться. Может паузу настраиваемую какую-то надо будет придумать, чтобы читать/писать периферийный регистр раз в несколько тактов, чтобы периферия не захлебывалась. И еще надо будет организовать возможность постоянной пересылки данных через DMA, а не только однократной, как сейчас. Заливка, поиск символа или подстроки и т.д., может еще что-то придумается по ходу пьесы.

еще upd.
Не удержался :) Для самого быстрого из 4-битных без/с DMA:
Код:
cpu     MHz Dhry  s     Dhry/s DMIPS DMIPS/MHz
f4D     20  16384 3.401 4817   2.74  0.14
f4D+DMA 20  16384 2.186 7495   4.27  0.21
Процессор с такой системой команд:
Код:
0 1 while repeat num jz call ret @ ! swap pick nand - mla /
Ускорилось на 56%, а в тактах на итерацию экономия почти полторы тысячи (4152 vs 2668). Для сравнения у 6-битного сейчас в районе 0.25 DMIPS/MHz, но там пока нет DMA :)


Последний раз редактировалось Total Vacuum Вт окт 21, 2025 23:37, всего редактировалось 1 раз.

Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Тесты для микроконтроллеров и процессоров в ПЛИС
СообщениеДобавлено: Сб окт 18, 2025 01:15 
Не в сети
Аватара пользователя

Зарегистрирован: Ср июл 03, 2019 11:10
Сообщения: 634
Откуда: Москва
Благодарил (а): 61 раз.
Поблагодарили: 30 раз.
Dhrystone и Coremark на Форте:
http://totalvacuum.ru/BENCH/dhry.f
http://totalvacuum.ru/BENCH/coremark.zip


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Тесты для микроконтроллеров и процессоров в ПЛИС
СообщениеДобавлено: Сб окт 18, 2025 02:17 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 8050
Благодарил (а): 29 раз.
Поблагодарили: 147 раз.
С Dhrystone сразу вопрос пересылки память-память.

Код:
Source End Start DO COPYLOOP


Этот вариант LOOP сделает запись memdata в [I] и инкремент числа на стеке, а в мануле оно сразу идет на чтение памяти. Надо будет попробовать, уж очень интересно выглядит "программный DMA" на частоте 80 МГц...


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Тесты для микроконтроллеров и процессоров в ПЛИС
СообщениеДобавлено: Вт окт 21, 2025 23:31 
Не в сети
Аватара пользователя

Зарегистрирован: Ср июл 03, 2019 11:10
Сообщения: 634
Откуда: Москва
Благодарил (а): 61 раз.
Поблагодарили: 30 раз.
Hishnik писал(а):
Код:
Source End Start DO COPYLOOP
Правильно ли понимаю, что тут будет такт на символ? У меня через DMA в идеальном случае лишь два такта на символ выходит плюс некоторое количество тактов вначале на инициализацию. А все потому, что пожадничал и оставил в резерве на будущее второй порт BRAM. Но даже в таком варианте ускорение очень заметное, впрочем, это актуально лишь для задач, активно использующих строки или memcpy.
Для коллекции 3 и 6-битный процессор без/с DMA:
Код:
cpu     MHz Dhry   s      Dhry/s DMIPS DMIPS/MHz
f3H     20  16384 13.581  1206   0.69  0.03
f3H+DMA 20  16384  8.844  1853   1.05  0.05
Код:
cpu     MHz Dhry   s      Dhry/s DMIPS DMIPS/MHz
f61     20  16384  1.725  9498   5.41  0.27
f61+DMA 20  16384  1.183 13850   7.88  0.39
Такты на итерацию прилично экономятся: c 16578 уменьшается до 10796 в 3-битном и с 2106 до 1444 в 6-битном.
:) И только самый первый из 3-битных даже с таким ускорителем совсем безнадежен:
Код:
cpu     MHz Dhry   s      Dhry/s DMIPS DMIPS/MHz
f30     20    256  7.654    33   0.02  0.00
f30+DMA 20    256  7.250    35   0.02  0.00
Тут аж 30 тыс. тактов экономия, но это капля в море на общем фоне в 600 тыс тактов на итерацию :)


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Тесты для микроконтроллеров и процессоров в ПЛИС
СообщениеДобавлено: Ср окт 22, 2025 02:07 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 8050
Благодарил (а): 29 раз.
Поблагодарили: 147 раз.
Total Vacuum писал(а):
Правильно ли понимаю, что тут будет такт на символ?


С двупортовой памятью можно один порт постоянно читать, а в другой постоянно писать. потоком. На старт нужно будет одно чтение, а дальше пойдет перекладывание с латентностью в один такт.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 28 ]  На страницу Пред.  1, 2

Часовой пояс: UTC + 3 часа [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
phpBB сборка от FladeX // Русская поддержка phpBB