|
62 / 63 / 3
Регистрация: 25.05.2009
Сообщений: 520
|
|
Различается ли написание программ в C++ Builder для одно-двухъядерных процессоров?21.12.2009, 07:14. Показов 4837. Ответов 29
Метки нет (Все метки)
Например, в текущей программе предстоит перебор 10^12 вариантов с небольшими вычислениями.
Будет ли прога по умолчанию просчитываться двумя ядрами проца или что-то дописать надо? Я просто не в курсе архитектуры процессора.
1
|
|
| 21.12.2009, 07:14 | |
|
Ответы с готовыми решениями:
29
Написание программ для многоядерных процессоров
Написание простейших программ для С++ |
|
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
|
| 21.12.2009, 07:17 | |
|
Тема интересна, благодарю за её поднятие.
0
|
|
|
1857 / 714 / 55
Регистрация: 11.12.2008
Сообщений: 1,019
|
|
| 21.12.2009, 09:36 | |
|
Для того, чтобы программа обрабатывалась одновременно несколькими процессорами, нужно просто сделать несколько потоков в программе. Винда потом сама будет решать каким процессором нужно обрабатывать какой поток, и мы этим не занимаемся.
1
|
|
|
62 / 63 / 3
Регистрация: 25.05.2009
Сообщений: 520
|
|
| 21.12.2009, 09:44 [ТС] | |
|
1
|
|
|
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
|
| 21.12.2009, 09:49 | |
|
А как правильно планировать потоки? Чтоб они друг друга не держали и реально работали быстрее, чем один. Какие ни будь примеры/рекомендации есть?
0
|
|
|
1857 / 714 / 55
Регистрация: 11.12.2008
Сообщений: 1,019
|
|
| 21.12.2009, 10:32 | |
|
У меня в этом особого опыта нет. Но логика подсказывает, но нужно стараться, чтобы потоки обрабатывали разные(не пересекающиеся) данные и не использовали глобальных переменных. Очень желательно, чтобы обработкой визуального интерфейса занимался только главный поток программы, а остальные только лишь отправляли ему сообщения.
Можешь почитать еще про OpenMP. Гугли по теме "распараллеливание алгоритмов" "распараллеливание программ" итд.
0
|
|
|
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
||
| 21.12.2009, 11:18 | ||
|
От этого толку мало. Зачем мне вообще полностью независимые потоки, если я хочу быстро решить одну задачу? Как спланировать параллельную работу потоков, чтобы они обменивались данными, но не держали друг друга?
Добавлено через 13 минут
0
|
||
|
|
||
| 21.12.2009, 15:10 | ||
|
Otaka писал всё правильно. Логика при распараллеливании должна быть такой, что ветви исполнения делаются максимально независимыми и по возможности м меньшим количеством точек соприкосновения. Ну и, желательно, расчитать, чтобы до точки синхронизации потоки работали примерно одинаковое время, чтобы не было простоев. Говоря "ветви" я имею в виде не обязательно поток. Это может быть и отдельный процесс, который может исполняться в том числе и на другой машине Добавлено через 50 секунд > и не использовали глобальных переменных Более правильно добавить слово "одновременно"
0
|
||
|
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
||
| 22.12.2009, 06:17 | ||
|
Добавлено через 7 минут Говоря о потоках, которые должны взаимодействовать, я не имею ввиду, что они должны взаимодействовать тесно. Но и противоположная крайность (абсолютная незавсисмость) бесперспективна, а если уж возникают независимые задачи, которые можно решить таким способоам, то их надо решать в разных процессах и в разных приложениях, что даст экономию памяти в том случае, если вдруг окажется востребованной только одна из таких задач. Добавлено через 1 час 53 минуты Минимум связей между подзадачами - общее правило декомпозиции, не зависящее от того, к чему оно отнесено: модулям, подпрограммам, потокам для однопроцессорного одноядерного компа или чему то ещё. Но и одно данное можно ждать из второго потока процентов 90 всего времени, что приведёт к тормозам. Так вот, меня интересует, как надо планировать именно потоки, чтоб таких ситуаций не было.
0
|
||
|
62 / 63 / 3
Регистрация: 25.05.2009
Сообщений: 520
|
|
| 22.12.2009, 07:20 [ТС] | |
|
В качестве эксперимента написал 5 строк кода типа "возми лом, подмети плац" - просто нагрузить проц. ProcessExplorer показывает, что с этим кодом работают оба проца, правда по 50%. Повысил приоритет процесса, стало - первый проц 75%, второй 50%. А общая загрузка почему-то всё равно 50%.
Ничо не понял. Добавлено через 7 минут Если выключаю второй проц, первый грузится на 97% и наоборот.
1
|
|
|
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
|
| 22.12.2009, 07:30 | |
|
Очень интересную заковыку ты нашел.
0
|
|
|
62 / 63 / 3
Регистрация: 25.05.2009
Сообщений: 520
|
|
| 22.12.2009, 08:19 [ТС] | |
|
А после создания отдельного потока с таким же кодом оба проца грузятся по 98%
1
|
|
|
|
|||||
| 22.12.2009, 09:53 | |||||
|
Однако разбивать по 500 тыщ можно по разному. Можно так, что первые 500 тыщ элементов и последние 500 тыщ элементов. А можно чётные и нечётные. Во втором случае получится так, что оба потока при параллельной работе лезут в одни и те же страницы памяти (т.е. по очень близким адресам). Если такая задача будет работать на многопроцессорной (не путать процессорное ядро и процессор) машине и потоки лягут на разные процессоры, то такой вариант скорее всего будет работать медленнее, чем не распараллеленный. Потому что когда два процессора работают с одними и теми же страницами памяти, то начинает сильно тормозить система когерентности кэша. Когда один процессор пишет в память, то данные оседают в кеше, который физически расположен внутри процессора, а поэтому процессор должен "уведомить" другие процессоры, что какая-то запись в памяти на текущий момент на самом деле не лежит в памяти, а лежит в моём кэше.
1
|
|||||
|
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
|||
| 22.12.2009, 10:02 | |||
|
Добавлено через 5 минут
0
|
|||
|
62 / 63 / 3
Регистрация: 25.05.2009
Сообщений: 520
|
||||||
| 22.12.2009, 10:03 [ТС] | ||||||
|
Вот пример:
0
|
||||||
|
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
|
| 22.12.2009, 10:04 | |
|
0
|
|
|
|
|
| 22.12.2009, 12:48 | |
|
DrMcSheen, вопрос поднял конечно сложный, он относится к проэктированию систем, и есль целые книги поднимающие вопрос многопоточности и по каким принцыпам и в каких ситуациях какой лучше выбрать.
В твоей ситуации 2 потока на 2-ух ядрах результат дадут быстрее, напиши 2 одинаковых потока, а вот что они будут вычислять роздели, например по четности (один поток считает операции с четным номером а второй нет), хотя и такой подход не идеален.......
0
|
|
|
|
|
| 22.12.2009, 20:15 | |
|
DrMcSheen, а ты уверен, что rand реально паралеллится и внутри себя не содержит mutex? Мало ли, может там есть какая-то глобальная таблица, доступ к которой делается через синхронизацию внутри функции rand
> Один заранее записал, два других пытаются одновременно (но намного позже записи) читать. Что плохого? Ты точно понимаешь, о чём я говорю? Я говорю о флаговой переменной, и потоки ждут изменения её значения (т.е. это точка синхронизации) > Разницу между многопроцессорными и многоядерными компами я знаю с тех пор, как первый раз услышал про многоядерный камень, так как про многопроцессорные компы знаю ещё с девяностых. Охотно поверю. А всю остальную мысль ты понял?
0
|
|
|
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
||||||
| 23.12.2009, 07:14 | ||||||
|
Добавлено через 1 час 14 минут Как приладе опознать число ядер? Я не требую, чтобы она самостоятельно выполнила реальный тест оборудования - пусть запрашивает через систему, если нет другого удобного пути, но сама, без участия пользователя. Как это сделать под болэндом и как под мелкософт девелопмент студио? Добавлено через 1 час 23 минуты
0
|
||||||
|
|
||||||||
| 23.12.2009, 10:42 | ||||||||
|
Оба метода используют библиотеки run-time поддержки, интерфейсы которых являются высокоуровневыми, но реализация на каждой конкретной платформе строго заточена под конкретную архитектуру. Туда же входит и выяснение количества процессоров. Поддерживаются ли эти средства компиляторами под винду - я не знаю. "Как выяснить количество процессоров под виндой" - вопрос надо ставить именно в такой форме, потому что это делается средствами ОС (в нашем случае через WinApi), а потому в борланде и микрософте это будет выглядеть одинаково
0
|
||||||||
| 23.12.2009, 10:42 | |
|
Помогаю со студенческими работами здесь
20
Написание программ для сервисов Теория Написание компилятора для С++ программ в блокноте Написание программ на заказ для компьютеров и микроконтроллеров Написание программ для OS Andriod 4. С чего начать? Лучший инсталлятор для программ на Borland C++ Builder 6. Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Программный отбор элементов справочника Номенклатура по группе 1С
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа.
В качестве фильтра для отбора справочника служит группа номенклатуры.
Отбор под наименованию группы (на. . .
|
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
|
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс.
Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
|
Программный отбор элементов справочника Сотрудники по перечислениям 1С
Maks 21.03.2026
Установка программного отбора элементов справочника "Сотрудники" из модуля формы документа.
В качестве фильтра для отбора служит предопределенное значение перечислений.
Процедура. . .
|
|
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
|
Оттенки серого
Argus19 18.03.2026
Оттенки серого
Нашёл в интернете 3 прекрасных модуля:
Модуль класса открытия диалога открытия/ сохранения файла на Win32 API;
Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
|
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога
Финальные проекты на Си и на C++:
finish-rectangles-sdl3-c. zip
finish-rectangles-sdl3-cpp. zip
|
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие.
Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
|