Forth
http://fforum.winglion.ru/

Multi-threading для софт-процессора
http://fforum.winglion.ru/viewtopic.php?f=3&t=2606
Страница 2 из 5

Автор:  вопрос [ Пт май 28, 2010 22:09 ]
Заголовок сообщения:  Re: Multi-threading для софт-процессора

Хм, для чего формулы? Если представить это словесно : три ядра, которые каждое выполняет отдельный процесс, выполнят три процесса за то же время, за которое одно ядро выполнит один, если ... если работа с памятью всё равно не может быть быстрее для каждого по отдельности (так?)

Автор:  WingLion [ Пт май 28, 2010 22:17 ]
Заголовок сообщения:  Re: Multi-threading для софт-процессора

не так. память как раз быстрее каждого ядра в отдельности... и поочередно обслуживает три ядра, а тут представлена формульная схема, как эти три ядра сделать в железе с минимальным усложнением относительно одноядерного варианта процессора при сохранении скорости каждого ядра на том же уровне, на котором одно ядро работает.
А суммарная скорость общей связки - в три раза выше одинарного ядра.

Автор:  Hishnik [ Пт май 28, 2010 23:43 ]
Заголовок сообщения:  Re: Multi-threading для софт-процессора

WingLion писал(а):
Увеличивается в три раза только количество тригеров, но _не логика_!

А логика используется одна на все три ядра.

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

Автор:  WingLion [ Сб май 29, 2010 04:20 ]
Заголовок сообщения:  Re: Multi-threading для софт-процессора

Мультиплексоров то нет. Есть многоразрядный регистр сдвига.
У меня эксперимент с трехъядерным процессором покзал такие результаты для 16-бит варианта процессора:

Одно ядро ~900LE
Трехядерный вариант ~1500LE

Ни о каком тиражировании логики не идет речи. В Ксайлинксе, на сколько я понял, регистры сдвига для всех трех ядер, должны получиться вообще что-то типа три регистра в цепочке на одной ячейке (за счет организации), и увеличение объема будет совсем мизерным при подобном подходе...
Эх, надо таки брать плату с шестым спартаном...

Автор:  mOleg [ Сб май 29, 2010 14:48 ]
Заголовок сообщения:  Re: Multi-threading для софт-процессора

Хищник писал(а):
Для этого, конечно, требуется, чтобы они стартовали с разных адресов.

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

Автор:  Hishnik [ Сб май 29, 2010 14:58 ]
Заголовок сообщения:  Re: Multi-threading для софт-процессора

WingLion писал(а):
Ни о каком тиражировании логики не идет речи. В Ксайлинксе, на сколько я понял, регистры сдвига для всех трех ядер, должны получиться вообще что-то типа три регистра в цепочке на одной ячейке (за счет организации), и увеличение объема будет совсем мизерным при подобном подходе...

Не получится ли тут, что ядра все же будут бороться за доступ и потребуется арбитраж? Например, при пустом цикле в конвейере придется постоянно дожидаться своей очереди, хотя можно было бы прокачать команду и побыстрее.

Автор:  Hishnik [ Сб май 29, 2010 14:59 ]
Заголовок сообщения:  Re: Multi-threading для софт-процессора

mOleg писал(а):
Хищник писал(а):
Для этого, конечно, требуется, чтобы они стартовали с разных адресов.

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

А можно теперь не страшным термином, а конкретным HDL это проиллюстрировать? Как это два ядра, стартовавшие с одного адреса, и работающие с одной памятью и на одной частоте, разойдутся по своим потокам исполнения.

Автор:  WingLion [ Сб май 29, 2010 15:14 ]
Заголовок сообщения:  Re: Multi-threading для софт-процессора

Хищник писал(а):
Не получится ли тут, что ядра все же будут бороться за доступ и потребуется арбитраж? Например, при пустом цикле в конвейере придется постоянно дожидаться своей очереди, хотя можно было бы прокачать команду и побыстрее.


У каждого ядра будет свое время доступа к шине. Три ядра - три такта - три момента доступа. У каждого ядра момент (такт) свой. А синхронная память каждый такт принимает команду от одного из ядер и исполняет команды разных ядер раздельно в разные моменты времени. Маленький нюанс только при чтении, когда данные появляются на выходе не в момент передачи адреса и сигнала чтения, а через пару-тройку тактов, в зависимости от настроек. И в тот момент соответствующее ядро и должно ловить их на соответствующем шаге конвеера. Запись в такую память происходит за один такт сразу. Подается адрес, данные и сигнал записи, поэтому все три ядра будут писать и читать не мешая друг другу, каждое ядро в свой такт...

А пустой цикл конвеера (когда ядро чего-то ждет), на шине памяти появится пустой такт, соответствующий этому ядру, поэтому арбитр нужен для определения ждет чего ядро или нет, если ждет - вместо него на конвеер запускается работающее ядро (если они есть такие еще, кроме тех, что на конвеере в текущий момент находятся). И тогда пустого такта памяти не будет.

В простейшем случае, когда есть только три ядра, и они в цикле крутятся, арбитр не нужен, время работы ядер с памятью строго определено, и конфликтов наблюдаться просто не должно (неоткуда им взяться). А пустые такты памяти в моменты, когда ядро чего-то ждет, просто дают повод задуматься о том, чтобы их использовать, а не терять понапрасну.

Автор:  mOleg [ Сб май 29, 2010 15:34 ]
Заголовок сообщения:  Re: Multi-threading для софт-процессора

Хищник писал(а):
А можно теперь не страшным термином, а конкретным HDL это проиллюстрировать?

HDL нет, а вот в виде алгоритма можно.
кстати, тут надо оговориться, нужно ли действительно всем процессорам одновременно запускаться (возможно более удачный вариант - запуск одного, инициализация системы (Загрузка кода, инициализация перифирии, распределение памяти), и принудительный запуск остальных процессоров с конкретными задачами для них. Т.е. речь об иерархической системе.

что же до алгоритма. То должна существовать ячейка памяти X
процессоры, доходя до точки "разбегания" каждый
обменивает значение переменной Х со значением в личном регистре процессора (там должна быть -1)
если после обмена в регистре 0 - продолжаем выполнение, если -1 "зависаем" в ожидании (т.е. пытаемся опять и опять обменять значение X на -1 в регистре проца, как только вернется 0 пойдем дальше)
(т.е. один проц войдет в секцию кода)
после этого код выполняет только один процессор (сколько бы других ни было)
он может определить, например, какой код стоит дальше выполнять в гордом одиночестве
или оставить информацию для следующего, куда нужно перейти, например, увеличив указатель на список точек входа для процессоров.)
по выходу из секции в Х нужно записать 0.

вобщем, ничего сложного. Просто операцию обмена и ожидания лучше делать в железе.

Автор:  mOleg [ Сб май 29, 2010 15:35 ]
Заголовок сообщения:  Re: Multi-threading для софт-процессора

кстати, а не получится, что память начнет сильно тормозить?
ведь скорее всего адреса будут у разных процов разные (т.е. в разных страницах), а это по нескольку дополнительных тактов на доступ???

Автор:  mOleg [ Сб май 29, 2010 15:41 ]
Заголовок сообщения:  Re: Multi-threading для софт-процессора

дело в том, что объекты синхронизации придется всеравно делать, раз уж память общаяя. Тот же HERE надо будет трогать монопольно только одному процессору за раз (к примеру).

Автор:  WingLion [ Сб май 29, 2010 15:46 ]
Заголовок сообщения:  Re: Multi-threading для софт-процессора

mOleg писал(а):
ведь скорее всего адреса будут у разных процов разные (т.е. в разных страницах), а это по нескольку дополнительных тактов на доступ???


Для синхронной _статической_ памяти никаких лишних тактов на доступ нет... это у DRAM, SD-RAM, DDR и иже с ними дополнительные такты нужны, и у них организация страничная.
A у простой SRAM (блоковая память в ПЛИС) все просто:
вход - клок;
вход - сигнал адреса чтения;
вход - сигнал адреса записи (раздельно от адреса чтения!);
вход - сигнал данных для записи;
вход - сигнал записи;
вход - сигнал чтения (необязателен, можно оставить его активным постоянно);
выход - считанные данные (раздельно от входа данных для записи).
И все.

Операции все синхронны.
За один такт. При чтении только данные на выходе появляются не в тот же такт, а через несколько тактов (их число и называется latency). свои такты latency ядро ждет, а в это время работают с памятью (вычитывают данные) другие ядра.

Автор:  WingLion [ Сб май 29, 2010 15:49 ]
Заголовок сообщения:  Re: Multi-threading для софт-процессора

mOleg писал(а):
дело в том, что объекты синхронизации придется всеравно делать, раз уж память общаяя. Тот же HERE надо будет трогать монопольно только одному процессору за раз (к примеру).


формально, каждый процессор должен будет иметь свой HERE в свободной памяти. Общая софтверная часть у них будет неизменной или должна меняться одним процессором (супервизором).
Изменяемые части могут быть, но в раздельной памяти. т.е. свободные от ядра части общей памяти должны быть разделены между процессорами (этому дала, этому дала, а этому не дала).

Автор:  mOleg [ Сб май 29, 2010 15:51 ]
Заголовок сообщения:  Re: Multi-threading для софт-процессора

WingLion писал(а):
Для синхронной _статической_ памяти никаких лишних тактов на доступ нет...

я просто не понял, о какой памяти речь. Я как раз подумал о DDR.

Автор:  mOleg [ Сб май 29, 2010 15:52 ]
Заголовок сообщения:  Re: Multi-threading для софт-процессора

WingLion писал(а):
формально, каждый процессор должен будет иметь свой HERE в свободной памяти. Общая софтверная часть у них будет неизменной или должна меняться одним процессором (супервизором).

тогда это не имеет смысла, лучше каждому дать свою память. Кстати HERE - это был просто пример понятный, будут и другие общие переменные 100500 :)

Страница 2 из 5 Часовой пояс: UTC + 3 часа [ Летнее время ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/