Оптимальное количество потоков
От: Михaил  
Дата: 23.07.19 16:34
Оценка:
Привет
Как в cpp можно узнать, сколько потоков оптимально запускать на конкретной машине?
Есть, скажем, очередь из n=1000 блоков данных. Есть процессор с 4-мя ядрами. Есть ли какие-то встроенные механизмы, чтоб узнать, что оптимально запустить 4 std::thread, которые будут разбирать из очереди и обрабатывать эти блоки по мере возможности? Или, возможно, есть какие-то более высокоуровневые средства для параллельной обработки множества блоков (не считая всякие железо-зависимые CUDA'ы)?
Спасибо
Re: Оптимальное количество потоков
От: Dair Россия https://dair.spb.ru
Дата: 23.07.19 16:38
Оценка:
Здравствуйте, Михaил, Вы писали:

М>Как в cpp можно узнать, сколько потоков оптимально запускать на конкретной машине?

М>Есть, скажем, очередь из n=1000 блоков данных. Есть процессор с 4-мя ядрами. Есть ли какие-то встроенные механизмы, чтоб узнать, что оптимально запустить 4 std::thread, которые будут разбирать из очереди и обрабатывать эти блоки по мере возможности? Или, возможно, есть какие-то более высокоуровневые средства для параллельной обработки множества блоков (не считая всякие железо-зависимые CUDA'ы)?

Linux/macOS/cygwin:

long number_of_processors = sysconf(_SC_NPROCESSORS_ONLN);
Re: Оптимальное количество потоков
От: reversecode google
Дата: 23.07.19 17:42
Оценка:
спросить у гугла прежде чем бежать постить на ктыв

https://en.cppreference.com/w/cpp/thread/thread/hardware_concurrency
Re: Оптимальное количество потоков
От: a7d3  
Дата: 24.07.19 01:44
Оценка:
Здравствуйте, Михaил, Вы писали:

М>... есть какие-то более высокоуровневые средства для параллельной обработки множества блоков (не считая всякие железо-зависимые CUDA'ы)?

М>Спасибо

Да «пожалуйста»:

OpenCL (Open Computing Language) is a framework for writing programs that execute across heterogeneous platforms consisting of central processing units (CPUs), graphics processing units (GPUs), digital signal processors (DSPs), field-programmable gate arrays (FPGAs) and other processors or hardware accelerators. OpenCL specifies programming languages (based on C99 and C++11) for programming these devices and application programming interfaces (APIs) to control the platform and execute programs on the compute devices. OpenCL provides a standard interface for parallel computing using task- and data-based parallelism.

OpenCL is an open standard maintained by the non-profit technology consortium Khronos Group. Conformant implementations are available from Altera, AMD, Apple (OpenCL along with OpenGL is deprecated for Apple hardware, in favor of Metal 2[7]), ARM, Creative, IBM, Imagination, Intel, Nvidia, Qualcomm, Samsung, Vivante, Xilinx, and ZiiLABS.


OpenMP is an implementation of multithreading, a method of parallelizing whereby a master thread (a series of instructions executed consecutively) forks a specified number of slave threads and the system divides a task among them. The threads then run concurrently, with the runtime environment allocating threads to different processors. ...

By default, each thread executes the parallelized section of code independently. Work-sharing constructs can be used to divide a task among the threads so that each thread executes its allocated part of the code. Both task parallelism and data parallelism can be achieved using OpenMP in this way.

The runtime environment allocates threads to processors depending on usage, machine load and other factors. The runtime environment can assign the number of threads based on environment variables, or the code can do so using functions. The OpenMP functions are included in a header file labelled omp.h in C/C++.


The Parallel Patterns Library (PPL) provides an imperative programming model that promotes scalability and ease-of-use for developing concurrent applications. The PPL builds on the scheduling and resource management components of the Concurrency Runtime. It raises the level of abstraction between your application code and the underlying threading mechanism by providing generic, type-safe algorithms and containers that act on data in parallel. The PPL also lets you develop applications that scale by providing alternatives to shared state.

The PPL provides the following features:

Re[2]: Оптимальное количество потоков
От: sergii.p  
Дата: 24.07.19 06:00
Оценка:
Здравствуйте, reversecode, Вы писали:

R>https://en.cppreference.com/w/cpp/thread/thread/hardware_concurrency


оно количество ядер вернёт. А спрашивают про оптимальное количество потоков для разбора коллекции задач. Я например встречал число std::thread::hardware_concurrency * 2. Есть мнение, что кто-то что-то померил и получил, что надо умножать на два. Весьма спорное утверждение с учётом того, что число потоков желательно рассчитывать исходя из исходной загруженности системы. Но более продвинутых алгоритмов я не находил (хотя признаться и не искал).
Re[3]: Оптимальное количество потоков
От: andrey.desman  
Дата: 24.07.19 06:14
Оценка: +2
Здравствуйте, sergii.p, Вы писали:

SP>оно количество ядер вернёт. А спрашивают про оптимальное количество потоков для разбора коллекции задач. Я например встречал число std::thread::hardware_concurrency * 2. Есть мнение, что кто-то что-то померил и получил, что надо умножать на два. Весьма спорное утверждение с учётом того, что число потоков желательно рассчитывать исходя из исходной загруженности системы. Но более продвинутых алгоритмов я не находил (хотя признаться и не искал).


Это все сугубо от кода зависит. Если он какой-то блокирующий ввод-вывод делает, то умножать на поболее чем 2 стоит. А если потоки сильно за общий ресурс толкаться будут, то и на 2 умножать не надо.
Общего рецепта нет.
Re: Оптимальное количество потоков
От: kov_serg Россия  
Дата: 24.07.19 06:18
Оценка: +1
Здравствуйте, Михaил, Вы писали:

М>Привет

М>Как в cpp можно узнать, сколько потоков оптимально запускать на конкретной машине?
М>Есть, скажем, очередь из n=1000 блоков данных. Есть процессор с 4-мя ядрами. Есть ли какие-то встроенные механизмы, чтоб узнать, что оптимально запустить 4 std::thread, которые будут разбирать из очереди и обрабатывать эти блоки по мере возможности? Или, возможно, есть какие-то более высокоуровневые средства для параллельной обработки множества блоков (не считая всякие железо-зависимые CUDA'ы)?

Очень просто запускаете с разным количеством потоков (1,2,3..100,...) и строите зависимость общей производительности (throughoutput) от этого количества. Если есть явный максимум то выбираете это число.
Re: Оптимальное количество потоков
От: Maniacal Россия  
Дата: 24.07.19 12:53
Оценка: -1
Здравствуйте, Михaил, Вы писали:

М>Привет

М>Как в cpp можно узнать, сколько потоков оптимально запускать на конкретной машине?
М>Есть, скажем, очередь из n=1000 блоков данных. Есть процессор с 4-мя ядрами. Есть ли какие-то встроенные механизмы, чтоб узнать, что оптимально запустить 4 std::thread, которые будут разбирать из очереди и обрабатывать эти блоки по мере возможности?

Вроде как, оптимальным всегда считалось соотношение "количество потоков = количество физических ядер + 1". С hyperthreading'ом уже не так всё однозначно и зависит от характера потоков. Но, скорее всего, "количество потоков = количество логических ядер + 1". Притом, очень желательно потоки привязывать к конкретным номерам ядер.
Re[3]: Оптимальное количество потоков
От: Mihas  
Дата: 24.07.19 13:29
Оценка:
Здравствуйте, sergii.p, Вы писали:

SP>Я например встречал число std::thread::hardware_concurrency * 2.

И я где-то про такой же коэффициент вычитал.
С ним мои две пары ядер (гипертрэйдинг же) были загружены на 100%, перепахивая очередь.
Re[3]: Оптимальное количество потоков
От: gka Россия  
Дата: 26.07.19 09:06
Оценка:
Здравствуйте, sergii.p, Вы писали:

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


R>>https://en.cppreference.com/w/cpp/thread/thread/hardware_concurrency


SP>оно количество ядер вернёт. А спрашивают про оптимальное количество потоков для разбора коллекции задач. Я например встречал число std::thread::hardware_concurrency * 2.

SP>Есть мнение, что кто-то что-то померил и получил, что надо умножать на два. Весьма спорное утверждение с учётом того, что число потоков желательно рассчитывать исходя из исходной загруженности системы. Но более SP>продвинутых алгоритмов я не находил (хотя признаться и не искал).

Про это написанно у Рихтера при описании порта завершения. Там же все и объясняется, почему.
Отредактировано 26.07.2019 9:07 gka . Предыдущая версия .
Re[2]: Оптимальное количество потоков
От: IID Россия  
Дата: 31.07.19 10:59
Оценка: 2 (1)
Здравствуйте, Dair, Вы писали:

D>Linux/macOS/cygwin:


D>
D>long number_of_processors = sysconf(_SC_NPROCESSORS_ONLN);
D>


Но ведь это не отвечает на поставленный вопрос!

Ты всего лишь получишь количество логических ядер. Hyperthreading не учтён. А он мог дать очень существенную прибавку!
Хуже того: только тех, которые незапаркованы в данный момент (и легко могут быть сняты с парковки, даже автоматически — при повышении нагрузки в системе).
kalsarikännit
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.