Несоответствия синхронизации Intel Parallel Studio

#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 некоторое время собирает данные, а затем останавливается, не позволяя программе завершиться.