Вызов функции с разным количеством потоков, переданных приложению
-
16-09-2019 - |
Вопрос
У меня есть функция, которую нужно каждый раз вызывать с разным количеством потоков (я делаю некоторые вычисления производительности, поэтому мне нужно знать, когда производительность начинает ухудшаться).Пример приведен ниже:
getTime() {
return 0;
}
int main() {
boost::threadpool::thread_pool<> threads(nThreads);
for(int j = 0; j <= nLines; j++){
threads.schedule(boost::bind(&getTime, nThreads, 1));
}
threads.wait();
}
Где, n потоков:Значение, заданное в командной строке
Мой вопрос в том, даст ли это мне желаемый результат, будет ли это вызывать функцию 'getTime' с 'nThreads' каждый раз, когда программа обращается к циклу for?Или мне нужен какой-то другой метод, чтобы выяснить то же самое?
что я действительно хочу сделать, так это это:
boost::threadpool::thread_pool<> threads(nThreads);
// start a new thread that calls the "getTime" function
for(int j = 0; j <= nLines; j++){
//threads.schedule(boost::bind(&getTime, nThreads, 1));
threads.schedule(boost::bind(&getTime, 0, nLines, pc));
}
(не уверен, что из вышеперечисленного является правильным.)
функция getTime() должна запускаться с заданным количеством строк, которые я получаю из текстового файла, и передавать каждую строку API, производительность которого я хочу рассчитать.но это не имеет отношения к возникшему у меня вопросу.
я хочу каждый раз вызывать функцию с разным количеством потоков и вычислять, сколько времени потребовалось каждому потоку для завершения.каково было общее время, затраченное на 1 поток, каково было общее время, затраченное на завершение 2 потоков и т.д.
Решение
Если я правильно понимаю, то, что вы действительно хотите сделать, это что-то вроде этого :
int main()
{
int nbThreads = 20;
boost::threadpool::thread_pool<> threads(nbThreads);
for(int threadId = 0; threadId <= nbThreads ; ++threadId)
{
threads.schedule(getTime);
}
threads.wait();
}
Если я прав, вам не нужно использовать boost::bind здесь.
Обратите внимание, что Boost.ThreadPool не является частью Boost (пока?это ).Это будет рассмотренный, но дата пересмотра пока не запланирована.
Другие советы
Как насчет использования чего-то вроде OpenMP ( Открытый )?Если ваша цель - масштабируемость, это, вероятно, лучший выбор.