Информация об изменениях

Сообщение Re: Вопрос по многопоточности для C++ проекта от 05.07.2016 18:59

Изменено 05.07.2016 19:04 velkin

Здравствуйте, AlexGin, Вы писали:

AG>В связи с этои возникает вопрос:

AG>Оптимальная (прежде всего с точки зрения производительности) реализация многопоточности:
AG>1) При помощи функций WinAPI — вероятно, это самый производительный вариант, однако недостаток — нет кроссплатформенности;
AG>2) Средствами Qt — QThread кроссплатформенность есть, вопрос по производительности не очевиден, доп-бонус — отсутствие сложного кода, как в п.1;
AG>3) Средствами STL — std::thread (примерно та же картина как и во втором пункте).
AG>Дополнительная красота третьего пункта — если будет серверное приложение, без GUI, то не нужно "притягивать за уши" доплнительные библиотеки.

AG>Какие могут быть соображения по выбору?


На самом деле никакого выбора из этих трёх пунктов нет, нужно брать средства Qt. Теперь маленькое отступление по поводу комментария выше:
http://doc.qt.io/qt-4.8/qthread.html
http://doc.qt.io/qt-5/qthread.html

int QThread::idealThreadCount () [static]
Возвращает идеальное количество потоков, которое может быть запущено в системе. Она делает запрос количества процессорных ядер, как реальных, так и логических. Эта функция возвращает -1, если количество процессорных ядер не может быть определено.


Ещё добавлю, что параллельное программирование в Qt состоит не из одного QThread.

http://doc.qt.io/qt-5/threads-technologies.html
1) QThread: Low-Level API with Optional Event Loops
2) QThreadPool and QRunnable: Reusing Threads
3) Qt Concurrent: Using a High-level API

Пояснение:
http://doc.crossplatform.ru/qt/4.8.x/html-qt/threads-qtconcurrent.html

Пространство имен QtConcurrent предоставляет высокоуровневые API, которые делают возможным написание многопоточных программ без использования низкоуровневых потоковых примитивов, таких как мьютексы, блокировки чтение-запись, условия ожидания или семафоры. Программы, написанные с помощью QtConcurrent, автоматически приводят количество используемых потоков в соответствие с доступным количеством процессорных ядер. Это означает, что приложения, написанные сегодня, будут продолжать масштабироваться при развертывании на многоядерных системах в будущем.


И немного классики:
http://www.intuit.ru/studies/courses/1156/190/lecture/4942?page=4

SISD (Single Instruction, Single Data) – системы, в которых существует одиночный поток команд и одиночный поток данных. К такому типу можно отнести обычные последовательные ЭВМ;
SIMD (Single Instruction, Multiple Data) – системы c одиночным потоком команд и множественным потоком данных. Подобный класс составляют многопроцессорные вычислительные системы, в которых в каждый момент времени может выполняться одна и та же команда для обработки нескольких информационных элементов; такой архитектурой обладают, например, многопроцессорные системы с единым устройством управления. Этот подход широко использовался в предшествующие годы (системы ILLIAC IV или CM-1 компании Thinking Machines), в последнее время его применение ограничено, в основном, созданием специализированных систем;
MISD (Multiple Instruction, Single Data) – системы, в которых существует множественный поток команд и одиночный поток данных. Относительно этого типа систем нет единого мнения: ряд специалистов считает, что примеров конкретных ЭВМ, соответствующих данному типу вычислительных систем, не существует и введение подобного класса предпринимается для полноты классификации; другие же относят к данному типу, например, систолические вычислительные системы (см. [51, 52]) или системы с конвейерной обработкой данных;
MIMD (Multiple Instruction, Multiple Data) – системы c множественным потоком команд и множественным потоком данных. К подобному классу относится большинство параллельных многопроцессорных вычислительных систем.


Причём за использование того же OpenMP, MPI или ещё чего-нибудь придётся заплатить свою цену. Если нужно обычное прикладное приложение, то проще использовать чистый Qt. Могу сказать и по другому, если используется Qt, то это явно прикладное приложение, а не какой-нибудь навороченный кластер на тысячи компьютеров, иначе это был бы boost или что-то в этом роде.

Таким образом логичнее всего делать проект на Qt, но изучить его возможности. Или взять для примера мой нетбук и дестоп:
http://ark.intel.com/ru/products/55637/Intel-Atom-Processor-N570-1M-Cache-1_66-GHz

Количество ядер 2
Количество потоков 4

http://ark.intel.com/ru/products/80807/Intel-Core-i7-4790K-Processor-8M-Cache-up-to-4_40-GHz

Количество ядер 4
Количество потоков 8

Разница между производительностью Intel® Atom™ Processor N570 и Intel® Core™ i7-4790K Processor просто огромна.
Intel Core i7-4790K @ 4.00GHz 11,197 попугаев
Intel Atom N570 @ 1.66GHz 576 попугаев

Но принципиальной разницы в программировании для того и другого процессора нет, просто нужно определиться с общей стратегией.
Re: Вопрос по многопоточности для C++ проекта
Здравствуйте, AlexGin, Вы писали:

AG>В связи с этои возникает вопрос:

AG>Оптимальная (прежде всего с точки зрения производительности) реализация многопоточности:
AG>1) При помощи функций WinAPI — вероятно, это самый производительный вариант, однако недостаток — нет кроссплатформенности;
AG>2) Средствами Qt — QThread кроссплатформенность есть, вопрос по производительности не очевиден, доп-бонус — отсутствие сложного кода, как в п.1;
AG>3) Средствами STL — std::thread (примерно та же картина как и во втором пункте).
AG>Дополнительная красота третьего пункта — если будет серверное приложение, без GUI, то не нужно "притягивать за уши" доплнительные библиотеки.

AG>Какие могут быть соображения по выбору?


На самом деле никакого выбора из этих трёх пунктов нет, нужно брать средства Qt. Теперь маленькое отступление по поводу комментария выше:
http://doc.qt.io/qt-4.8/qthread.html
http://doc.qt.io/qt-5/qthread.html

int QThread::idealThreadCount () [static]
Возвращает идеальное количество потоков, которое может быть запущено в системе. Она делает запрос количества процессорных ядер, как реальных, так и логических. Эта функция возвращает -1, если количество процессорных ядер не может быть определено.


Ещё добавлю, что параллельное программирование в Qt состоит не из одного QThread.

http://doc.qt.io/qt-5/threads-technologies.html
1) QThread: Low-Level API with Optional Event Loops
2) QThreadPool and QRunnable: Reusing Threads
3) Qt Concurrent: Using a High-level API

Пояснение:
http://doc.crossplatform.ru/qt/4.8.x/html-qt/threads-qtconcurrent.html

Пространство имен QtConcurrent предоставляет высокоуровневые API, которые делают возможным написание многопоточных программ без использования низкоуровневых потоковых примитивов, таких как мьютексы, блокировки чтение-запись, условия ожидания или семафоры. Программы, написанные с помощью QtConcurrent, автоматически приводят количество используемых потоков в соответствие с доступным количеством процессорных ядер. Это означает, что приложения, написанные сегодня, будут продолжать масштабироваться при развертывании на многоядерных системах в будущем.


И немного классики:
http://www.intuit.ru/studies/courses/1156/190/lecture/4942?page=4

SISD (Single Instruction, Single Data) – системы, в которых существует одиночный поток команд и одиночный поток данных. К такому типу можно отнести обычные последовательные ЭВМ;
SIMD (Single Instruction, Multiple Data) – системы c одиночным потоком команд и множественным потоком данных. Подобный класс составляют многопроцессорные вычислительные системы, в которых в каждый момент времени может выполняться одна и та же команда для обработки нескольких информационных элементов; такой архитектурой обладают, например, многопроцессорные системы с единым устройством управления. Этот подход широко использовался в предшествующие годы (системы ILLIAC IV или CM-1 компании Thinking Machines), в последнее время его применение ограничено, в основном, созданием специализированных систем;
MISD (Multiple Instruction, Single Data) – системы, в которых существует множественный поток команд и одиночный поток данных. Относительно этого типа систем нет единого мнения: ряд специалистов считает, что примеров конкретных ЭВМ, соответствующих данному типу вычислительных систем, не существует и введение подобного класса предпринимается для полноты классификации; другие же относят к данному типу, например, систолические вычислительные системы (см. [51, 52]) или системы с конвейерной обработкой данных;
MIMD (Multiple Instruction, Multiple Data) – системы c множественным потоком команд и множественным потоком данных. К подобному классу относится большинство параллельных многопроцессорных вычислительных систем.


Причём за использование того же OpenMP, MPI или ещё чего-нибудь придётся заплатить свою цену. Если нужно обычное прикладное приложение, то проще использовать чистый Qt. Могу сказать и по другому, если используется Qt, то это явно прикладное приложение, а не какой-нибудь навороченный кластер на тысячи компьютеров, иначе это был бы boost или что-то в этом роде.

Таким образом логичнее всего делать проект на Qt, но изучить его возможности. Или взять для примера мой нетбук и десктоп:
http://ark.intel.com/ru/products/55637/Intel-Atom-Processor-N570-1M-Cache-1_66-GHz

Количество ядер 2
Количество потоков 4

http://ark.intel.com/ru/products/80807/Intel-Core-i7-4790K-Processor-8M-Cache-up-to-4_40-GHz

Количество ядер 4
Количество потоков 8

Разница между производительностью Intel® Atom™ Processor N570 и Intel® Core™ i7-4790K Processor просто огромна.
Intel Core i7-4790K @ 4.00GHz 11,197 попугаев
Intel Atom N570 @ 1.66GHz 576 попугаев

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