英特尔并行工作室时间不一致



我有一些使用英特尔TBB的代码,我在32核机器上运行。在代码中,我使用

parallel_for(blocked_range (2,left_image_width-2, left_image_width/32)…

生成32到并发工作的线程,没有竞争条件,并且每个线程都有相同的工作量。我使用clock_t来测量程序所花费的时间。对于特定的图像,大约需要19秒才能完成。

然后我通过英特尔并行工作室运行我的代码,它在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;

尚不清楚运行时的差异是由两个不同的输入(图像)造成的,还是仅仅是两种不同的运行时测量方法(clock_t差异与英特尔软件测量)造成的。此外,您没有向我们展示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的分析工具。是一个强大的工具,当你通过它运行程序时,你可以(以一种图形化的方式)查看代码中每个函数的处理时间(以及调用次数)。我敢肯定,做完这些你就会明白了。

最后一个想法-当使用英特尔软件时,程序完成了它的课程吗?我问这个问题是因为有时Vtune会收集一段时间的数据,然后在不允许程序完成的情况下停止。

最新更新