Важная информация

User Tag List

Страница 84 из 84 ПерваяПервая ... 8081828384
Показано с 831 по 837 из 837

Тема: ЭТЮДЫ

  1. #831
    Activist
    Регистрация
    14.04.2013
    Адрес
    г. Ростов-на-Дону
    Сообщений
    359
    Спасибо Благодарностей отдано 
    8
    Спасибо Благодарностей получено 
    9
    Поблагодарили
    7 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    ccf и sbc можно заменить на adc:
    Код:
    rra
    adc a,0FFh
    rla
    sbc a,a
    Для проверки A>B:
    Код:
    rra
    adc a,07Fh
    rla
    sbc a,a
    5 байт, 19 тактов.

  2. #832
    Member
    Регистрация
    25.11.2015
    Адрес
    г. Москва
    Сообщений
    142
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    0
    Поблагодарили
    0 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Имеется многоядерная система, в которой отсутствует блокировка памяти для выполнения атомарных операций. Совсем отсутствует. Требуется сконструировать функцию AtomicInc, которую можно будет вызывать на разных ядрах и получать уникальные значения счётчика. Посылать выделенному ядру прерывания не вариант, не факт что нашей программе это разрешат, кроме этого мы не знаем на каких ядрах нас запустили, но номер своего ядра каждый поток узнать может. Изначально обнулённый общий блок памяти для синхронизации решения задачи у них тоже имеется, кеширование для него отключёно. Единственный вариант который пока удалось придумать:
    0) сделать каждому ядру свой флаг, изначально сброшенный
    1) установить свой флаг перед чтением счётчика
    2) прочитать флаги остальных ядер и счётчик
    3) если стоит только наш, записываем новый счётчик и снимаем флаг, и на этом выходим
    4) если стоят флаги с большим номером, переходим к пункту 2 ожидая пока их снимут
    5) если стоят флаги с меньшим номером, снимаем свой и ждём пока снимут остальные чтобы перейти к пункту 1 для новой попытки
    Будет ли такой алгоритм работать или есть варианты проще и надёжнее?

  3. #833
    Activist
    Регистрация
    14.04.2013
    Адрес
    г. Ростов-на-Дону
    Сообщений
    359
    Спасибо Благодарностей отдано 
    8
    Спасибо Благодарностей получено 
    9
    Поблагодарили
    7 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Многозадачность вытесняющая? Зашёл поток на ядре в функцию, а диспетчер прервал на полуслове и на это ядро другой поток повесил, который зашёл в функцию...
    Нужно больше информации о системе.

    Под спойлером глупость, которая в таких условиях тоже не будет работать, можно не читать.

    Скрытый текст

    Создаём массив по количеству ядер. В массиве: флаг запроса, значение.

    Запускаем некий главный процесс.
    0. Процесс в цикле ищет установленный флаг запроса.
    Если нашёл:
    1. Прочитать счётчик.
    2. Инкремент.
    3. Записать новое значение в счётчик и в элемент массива, в котором найден флаг.
    4. Сбросить флаг запроса.
    5. Перейти в пункт 0 и искать новый запрос.

    Получение значения (работа ведётся со своим элементом массива, по номеру ядра):
    1. Установить флаг запроса.
    2. Дождаться сброса флага запроса.
    3. Прочитать значение.

    Но одно ядро занято.
    [свернуть]

  4. #834
    Member
    Регистрация
    25.11.2015
    Адрес
    г. Москва
    Сообщений
    142
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    0
    Поблагодарили
    0 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Bolt Посмотреть сообщение
    Многозадачность вытесняющая?
    На данный момент нет, считается что функция, запущенная на некотором ядре, работает пока ей это нужно. Изначально, общий блок памяти обнуляется, после чего функция должна запуститься на N ядрах, но если некоторые заняты, для них это произойдёт чуть позже. А может на каких-то ядрах будет произведён повторный запуск, или вообще все запуски произойдут на одном и том же ядре. Выделять отдельное ядро для инкремента счётчика нельзя, оно слишком производительное чтобы заниматься такой фигнёй.
    У меня идея заключается в том, что если записать флаг и быстро проверить остальные, то не более одного процесса успеет увидеть всего один флаг, и в этом случае можно менять счётчик уже без дополнительных проверок.

  5. #835
    Activist
    Регистрация
    14.04.2013
    Адрес
    г. Ростов-на-Дону
    Сообщений
    359
    Спасибо Благодарностей отдано 
    8
    Спасибо Благодарностей получено 
    9
    Поблагодарили
    7 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Может тогда типа как в сетях используется CSMA/CD?

    1. Зашли в функцию, сразу поставили флаг.
    2. Просмотрели флаги, если никого нет - инкремент, сброс флага, выход.
    Если есть кто-то ещё:
    3. Сбросить свой флаг.
    4. Выждать некий случайный интервал.
    5. Начать заново с пункта 1.

    Если кто-то уже работает - он работает до конца, остальные будут сбрасывать-устанавливать флаги.

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

    Примерно так разруливает коллизии Ethernet.

  6. #836
    Member
    Регистрация
    25.11.2015
    Адрес
    г. Москва
    Сообщений
    142
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    0
    Поблагодарили
    0 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Bolt, там проблема в том, что при шине в 16 байт реальное обращение в память занимает 50 тактов, то есть пока мы ждём этот флаг, можно успеть прочитать 800 байт(и столько же записать, так как шины отдельные). Моя версия алгоритма именно поэтому начинается с записи, а не чтения флага, так как такой подход вроде как уменьшает время блокировки свободного ресурса, но это еще нужно проверить. А вот если ресурс часто оказывается занят, возможно имеет смысл вместо освобождения поставить флаг, что нам он тоже нужен, чтобы захвативший ресурс раздал уникальные счётчики всем кто ждёт.

  7. #837
    Activist
    Регистрация
    14.04.2013
    Адрес
    г. Ростов-на-Дону
    Сообщений
    359
    Спасибо Благодарностей отдано 
    8
    Спасибо Благодарностей получено 
    9
    Поблагодарили
    7 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    blackmirror, какая-то сложная там у вас система
    Цитата Сообщение от blackmirror Посмотреть сообщение
    А вот если ресурс часто оказывается занят, возможно имеет смысл вместо освобождения поставить флаг, что нам он тоже нужен, чтобы захвативший ресурс раздал уникальные счётчики всем кто ждёт.
    Во. Кто первый зашёл, тот становится вон тем супервизором, который в цикле просматривает флаги и раздаёт всем номера. Всем раздал - сам взял номер и вышел.
    Да, он может застрять надолго. Если приложению это критично, то супервизор передаёт кому-то эту роль и выходит.

Страница 84 из 84 ПерваяПервая ... 8081828384

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. Этюды: как бы написать поизящнее.
    от AndTorp в разделе Программирование
    Ответов: 5
    Последнее: 17.03.2008, 01:43
  2. Ответов: 0
    Последнее: 18.08.2006, 21:40
  3. Этюды: печать шрифтом 5x5...
    от breeze в разделе Программирование
    Ответов: 12
    Последнее: 27.03.2005, 04:21

Метки этой темы

Ваши права

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