OSDev

для всех
Текущее время: 28 мар 2024, 21:31

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 32 ]  На страницу 1, 2, 3, 4  След.
Автор Сообщение
СообщениеДобавлено: 15 май 2015, 13:11 

Зарегистрирован: 28 окт 2014, 10:41
Сообщения: 31
Подскажите по 2 вопросам:

1) Как работать с разными ядрами в ассемблере?
Допустим, я разбиваю код долгой функции на число частей, равное кол-ву ядер и собираюсь каждому из них назначить её выполнение.

2) Распараллелит ли один процессор подобный код (по скорости выполнения) скажем, команды в две вместо 6?:
Код:
mov rax, [m1]
mov rbx, [m2]
mov rcx, [m3]
add rax, 0x12345
add rbx, 0x34567
add rcx, 0x56789
...


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 15 май 2015, 14:34 
Аватара пользователя

Зарегистрирован: 16 май 2007, 23:46
Сообщения: 1126
1) Команд для работы с разными ядрамми в ассемблере нет.
2) Зависит от процессора. Верне от ядра. В нем есть конвейер который рассовывае команды по исполнительным блокам (В терминологии интела port). Так вот для работы с памятью есть 1-2 порта. Для работы с арифметикой 2-4 порта. Исполнительный блок(порт) для арифметики называется арефметическое логическое устройство сокращенно АЛУ.
Блоки работают паралельно. Т.е сложение будет паралельно, а вот чтение нет.

Что касается скорости, то она обусловленно особенностью аппаратуры. И считается очень сложно.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 15 май 2015, 14:51 

Зарегистрирован: 10 апр 2012, 23:19
Сообщения: 277
зачем так распинаться, многоядерность распараллеливает задачи а не функции,
много поточность может разложить функцию на составляющие, но каждую команду она не параллелит.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 15 май 2015, 14:55 

Зарегистрирован: 28 окт 2014, 10:41
Сообщения: 31
Спасибо.
pavia писал(а):
1) Команд для работы с разными ядрамми в ассемблере нет.
Несколько обескураживает... А как же программисту распределять возможности многоядерных процессоров?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 15 май 2015, 14:58 

Зарегистрирован: 28 окт 2014, 10:41
Сообщения: 31
scuter писал(а):
много поточность может разложить функцию на составляющие, но каждую команду она не параллелит.

Так могу ли я как-нибудь отдать выполнение разного кода разным ядрам?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 15 май 2015, 15:01 

Зарегистрирован: 10 апр 2012, 23:19
Сообщения: 277
panotnap писал(а):
Так могу ли я как-нибудь отдать выполнение разного кода разным ядрам?

да, как уже сказано через порты.
для этого нужно глубокое изучение документации.

мне больше армы нравятся, там прям команды есть загрузить в сопроцессор регистры, запустить сопроцессор в каком то месте.


Последний раз редактировалось scuter 15 май 2015, 15:04, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 15 май 2015, 15:03 
Аватара пользователя

Зарегистрирован: 28 май 2012, 23:44
Сообщения: 237
Откуда: Санкт-Петербург
panotnap писал(а):
Допустим, я разбиваю код долгой функции на число частей, равное кол-ву ядер и собираюсь каждому из них назначить её выполнение.

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

panotnap писал(а):
2) Распараллелит ли один процессор подобный код (по скорости выполнения) скажем, команды в две вместо 6?:

В современных процессорах x86 есть несколько уровней параллелизма, не нужно путать их. По ядрам разносятся большие блоки кода, объединенные в логические единицы исполнения ОС, как писал выше.

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

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 15 май 2015, 15:09 

Зарегистрирован: 28 окт 2014, 10:41
Сообщения: 31
По внутрероцессорной обработке ответы понятны, спасибо.
А вот по поводу ядер не очень - разве каждое 64-битное ядро не имеет свой набор регистров (16 рэксов и всё прочее), которые ОС может задействовать по своему усмотрению? Если так, то вот мне и хотелось бы знать, КАК ядро (ОС) распределяет код по ядрам (процессорным)? По разным ядрам.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 15 май 2015, 15:12 
Аватара пользователя

Зарегистрирован: 16 май 2007, 23:46
Сообщения: 1126
Цитата:
Несколько обескураживает... А как же программисту распределять возможности многоядерных процессоров?
Для взаимодействия между ядрами есть 2 механизма.
1. Это посылка прерывания нужному ядру или группе.
2. Работа(Чтение и запись) с общей памятью.
Всё остальное делает ядро ОС.

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

Как иницииаровать ядра. Есть прерывания инициализации.

Более подробно про прерывания читать в разделе про APIC.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 15 май 2015, 15:34 

Зарегистрирован: 28 окт 2014, 10:41
Сообщения: 31
Спасибо. Именно то, что нужно. Прерывания, APIC. Эх... А я думал, что всё проще. :(

А долго ли происходит процесс остановки/запуска процессоров на работу с определённым потоком опкодов, если в тактах, примерно? На сколько затратен будет вызов ядер для той или иной обработки? Например, нужно сжать видео-файл (ядром ОС :D ). Какого размера он должен быть, чтобы использование многоядерности для этого процесса была оправданной?


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

Часовой пояс: UTC + 3 часа


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

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


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

Найти:
Перейти:  
cron
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB