Оптимальное количество используемых потоков

#multithreading #cpu #core

#многопоточность #процессор #Ядро

Вопрос:

Итак, я решаю очень простую проблему. — генерация простых чисел (это не так уж и смущающе параллельно, поскольку они записываются (и считываются для проверки, являются ли они фактором) из общего источника. для интереса:http://pastebin.com/sQQLpMgB

В любом случае, то, что вдохновило меня на написание этого (частично), было реализацией моего доступа к этому двухъядерному процессору Xeon E5520 (с IIRC 16GB ram в комплекте)

Итак, я знаю, что каждый процессор поддерживает 8 активных потоков. Но тогда есть фоновые процессы (и, вероятно, другие пользователи), которые используют некоторые из них (на самом деле, вероятно, больше, чем все эти). Итак, каково хорошее эмпирическое правило относительно того, сколько потоков ускоряет работу, прежде чем они будут сдерживаться из-за чрезмерности. (Я предполагаю, что это правило должно учитывать, сколько потоков может быть активным одновременно)

Ответ №1:

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

Комментарии:

1. Можете ли вы предложить подходящий инструмент для определения, попал ли я в точку?

2. Поиск по двоичной системе будет работать, да. Отличная идея. (мне потребовалось 30 секунд, чтобы понять, что вы улучшаете). Я мог бы даже поместить бит, определяющий идеальное количество потоков, для запуска при каждом запуске программы, чтобы она всегда выполнялась оптимально.

Ответ №2:

Если операция в основном связана с процессором (не ожидая операций ввода-вывода), то хорошее первое предположение — 1 к 1 с количеством логических ядер процессора. Учитывая, что генерация простых чисел в основном связана с процессором и что в вашем распоряжении будет 16 логических ядер, я бы начал с 16 потоков. Проведите несколько тестов и посмотрите, что получится. Я ожидаю, что производительность достигнет максимума около 16 потоков, но это действительно зависит от того, сколько операций ввода-вывода выполняется для хранения сгенерированных простых чисел.