Вызов функции с разным количеством потоков, переданных приложению

StackOverflow https://stackoverflow.com/questions/790552

Вопрос

У меня есть функция, которую нужно каждый раз вызывать с разным количеством потоков (я делаю некоторые вычисления производительности, поэтому мне нужно знать, когда производительность начинает ухудшаться).Пример приведен ниже:

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 ( Открытый )?Если ваша цель - масштабируемость, это, вероятно, лучший выбор.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top