2

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

parallel_for(blocked_range (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;

任何意见,将不胜感激。

4

1 回答 1

0

目前尚不清楚运行时间的差异是由于两个不同的输入(图像)还是仅仅是两种不同的运行时间测量方法(clock_t 差异与英特尔软件测量)。此外,您没有向我们展示 create_threads_and_do_work() 中发生了什么,也没有提及您正在使用的英特尔 Parallel Studio 中的什么工具,是 Vtune 吗?

您的clock_t 差异方法将计算调用它的线程(示例中的主线程)的处理时间,但它可能不计算在create_threads_and_do_work() 中产生的线程的处理时间。它是否执行取决于您是否在该函数中等待所有线程完成然后才退出该函数,或者您是否只是生成线程并立即退出(在它们完成处理之前)。如果您在函数中所做的只是parallel_for(),那么clock_t 差异应该会产生正确的结果,并且应该与其他运行时测量没有什么不同。

在 Intel Parallel Studio 中有一个称为 Vtune 的分析工具。是一个强大的工具,当您通过它运行程序时,您可以(以令人愉悦的图形方式)查看代码中每个函数的处理时间(以及调用时间)。我很确定在这样做之后你可能会弄明白。

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

于 2014-11-15T05:38:32.707 回答