#visual-studio-2010 #parallel-processing #tbb
#visual-studio-2010 #параллельная обработка #tbb
Вопрос:
У меня есть некоторый код, который использует Intel TBB, и я работаю на 32-ядерном компьютере. В коде я использую
parallel_for (заблокированный диапазон (2,left_image_width-2, left_image_width /32) …
для запуска 32 потоков, выполняющих параллельную работу, отсутствуют условия гонки, и, как мы надеемся, каждому потоку предоставляется одинаковый объем работы. Я использую clock_t для измерения того, сколько времени занимает моя программа. Для выполнения определенного образа требуется примерно 19 секунд.
Затем я запустил свой код через Intel Parallel Studio, и он выполнил код за 2 секунды. Это результат, которого я ожидал, но я не могу понять, почему между ними такая большая разница. Суммирует ли time_t тактовые циклы на всех ядрах? Даже тогда это не имеет смысла. Ниже приведен фрагмент, о котором идет речь.
clock_t begin=clock();
create_threads_and_do_work();
clock_t end=clock();
double diffticks=end-begin;
double diffms=(diffticks*1000)/CLOCKS_PER_SEC;
cout<<"And the time is "<<diffms<<" ms"<<endl;
Будем признательны за любой совет.
Ответ №1:
Не совсем ясно, является ли разница во времени выполнения результатом двух разных входных данных (изображений) или просто двух разных методов измерения времени выполнения (разница clock_t против Измерение программного обеспечения Intel). Кроме того, вы не показываете нам, что происходит в create_threads_and_do_work (), и вы не упомянули, какой инструмент в Intel Parallel Studio вы используете, это Vtune?
Ваш метод clock_t difference суммирует время обработки вызвавшего его потока (основного потока в вашем примере), но он может не учитывать время обработки потоков, созданных в create_threads_and_do_work(). Происходит это или нет, зависит от того, ожидаете ли вы в рамках этой функции завершения всех потоков и только после этого выходите из функции или вы просто создаете потоки и выходите немедленно (до того, как они завершат обработку). Если все, что вы делаете в функции, это parallel_for(), то разница clock_t должна давать правильный результат и не должна отличаться от других измерений во время выполнения.
В Intel Parallel Studio есть инструмент профилирования под названием Vtune. это мощный инструмент, и когда вы запускаете свою программу с его помощью, вы можете просмотреть (в графически приятном виде) время обработки (а также время вызова) каждой функции в вашем коде. Я почти уверен, что после выполнения этого вы, вероятно, поймете это.
Последняя идея — завершила ли программа свой курс при использовании программного обеспечения Intel? Я спрашиваю, потому что иногда Vtune некоторое время собирает данные, а затем останавливается, не позволяя программе завершиться.