реклама на сайте
подробности

 
 
> TMS320c6678 и многоядерность, Как раскидать задачи на разные ядра ?
Digi
сообщение Dec 23 2013, 11:12
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 150
Регистрация: 20-08-04
Пользователь №: 529



Не могу понять, как в один *.out файл поместить програмные модули, которые должны работать в разных ядрах.
И вообще я еще не понял принцип работы программы в многоядерном процессоре. Я понял я так: К примеру Ядро 0 выполняет задачи передачи данных, обобщение результатов вычислений. Ядра 1-4 вычисляют принятые во внутреннюю память данные и укладывают туда же результаты. Связь между ядрами осуществялется через внутренюю память.
Это правильно или как то иначе ?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Hoodwin
сообщение Dec 25 2013, 17:08
Сообщение #2


Знающий
****

Группа: Участник
Сообщений: 881
Регистрация: 21-03-10
Из: _// \\_
Пользователь №: 56 107



Так я же написал, что в общей. Дело не в памяти, а в том, как именно через нее взаимодействовать. (Хотя, если совсем точно, то у FIFO в интерфейсе нет адреса, он скрыт внутри реализации). Межъядерные прерывания - не самый удобный механизм синхронизации, впрочем как и spinlock. При нормальной загрузке процессора это слишком большой оверхед, либо малая вероятность захватить spinlock. Простейшая аналогия - дозвониться в call-центр, где звонки в очередь не ставятся.

Формально двусвязный список тоже можно считать очередью (FIFO), если один в него пишет, а другой читает. Однако операции с указателями списка производят обе стороны, и поэтому любая операция постановки/выборки из очереди требует критической секции (spinlock или mutex), что и становится узким местом. В случае кольцевого буфера не нужен ни spinlock, ни mutex. Вот. В общем-то даже прерывания не нужны, хотя с ними можно снизить частоту опроса до минимума и не будить ядро без надобности. По моему опыту вполне жизнеспособный вариант IPC. Я его не никому не хочу навязывать, просто хочу обратить внимание, что бывает, что городят связку список+спинлок там, где хорошо бы подошла именно асинхронная кольцевая очередь (FIFO).



Да, и еще хочу добавить, что такая модель довольно легко масштабируется на случай отсутствия общей памяти между ядрами. Например, у нас была как-то связка HOST+DSP, которые общались между собой вообще через разогнанный до мегабит UART. И такой способ обмена данными тоже довольно удачно лег на модель кольцевых очередей, никто и не заметил.

Сообщение отредактировал Hoodwin - Dec 25 2013, 17:09
Go to the top of the page
 
+Quote Post
jcxz
сообщение Dec 26 2013, 16:40
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



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

Ну ещё (на этапе старта ПО) использовал, что типа state-машины для простой синхронизации (одно ядро выполняет какой-то кусок кода, заканчивает, переключает состояние
state-машины, другое ядро начинает работать, а первое - ждёт, до того как 2-е ядро не выполнит свой кусок и не изменит состояние state-машины и так далее).
Но это только на этапе инициализации для упрощения инициализации ресурсов. Потом ядра работали асинхронно, практически не ожидая друг друга.
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th August 2025 - 04:52
Рейтинг@Mail.ru


Страница сгенерированна за 0.01352 секунд с 7
ELECTRONIX ©2004-2016