Вызов функции с другим количеством потоков, переданных приложению - PullRequest
1 голос
/ 26 апреля 2009

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

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();
}

Где, nThreads: значение, указанное в командной строке

Мой вопрос заключается в том, даст ли это желаемый результат, так как будет ли вызываться функция 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 потока для завершения и т. д.

Ответы [ 2 ]

1 голос
/ 26 апреля 2009

Как насчет использования чего-то вроде OpenMP ? Если ваша цель - масштабируемость, возможно, это лучший выбор.

1 голос
/ 26 апреля 2009

Если я правильно понимаю, то, что вы действительно хотите сделать, это что-то вроде этого:

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 (пока?). Он будет проверен , но дата обзора пока не запланирована.

...