我试图找出如何加速我的代码的某些部分。我有三个浮点变量:var1,var2,var3。
以顺序模式...
double start1, end1, t1;
start1= (double)cvGetTickCount();
var1= tester->predict(videocapture, params1, image);
var2= tester->predict(videocapture, params2, image);
var3= tester->predict(videocapture, params3, image);
end1= (double)cvGetTickCount();
t1= (end1-start1)/((double)cvGetTickFrequency()*1000.);
printf( "Time1 = %g ms\n", t1 );
它似乎比并行线程稍快......
double start2, end2, t2;
start2= (double)cvGetTickCount();
mp_set_dynamic(0); // Explicitly enable/disable dynamic teams
omp_set_num_threads(3); // Use 3 threads for all consecutive parallel regions
#pragma omp parallel num_threads(3)
{
#pragma omp sections //nowait
{
#pragma omp section
{
#pragma omp critical
{
var1= tester->predict(videocapture, params1, image);
}
}
#pragma omp section
{
#pragma omp critical
{
var2= tester->predict(videocapture, params2, image);
}
}
#pragma omp section
{
#pragma omp critical
{
var3= tester->predict(videocapture, params3, image);
}
}
}
}
}
end2= (double)cvGetTickCount();
t2= (end2-start2)/((double)cvGetTickFrequency()*1000.);
printf( "Time2 = %g ms\n", t2 );
有人可以帮我加快找到这三个变量的过程并告诉我我做错了什么
答案 0 :(得分:0)
查看critical
pragma here的规范。
这里有三个关键点:
1)如果你没有为critical
pragma命名,它会映射到一些未指定的名称,并且所有未命名的关键部分都使用相同的名称。
2)一次只有一个线程可以在任何具有给定名称的关键部分中。
3)当一个线程遇到一个临界区时,它会在那里等待,直到其中没有其他线程处于活动状态。
因此,您的代码会告诉所有线程等待所有线程同时轮流执行一段代码。这相当于以串行方式执行操作,除了它需要首先生成线程的开销(以及由于等待而导致的任何开销,这可能是忙等待的。)