【发布时间】:2013-12-12 08:10:18
【问题描述】:
我在 OpenCV 中测试了parallel_for_,通过与简单数组求和和乘法的正常操作进行比较。
我有 100 个整数的数组,每个整数分成 10 个,并使用 parallel_for_ 运行。
然后我也有正常的 0 到 99 的求和和乘法运算。
然后我测量了经过的时间,正常运行比parallel_for_运行快。
我的 CPU 是 Intel(R) Core(TM) i7-2600 四核 CPU。
parallel_for_ 运算耗时 0.002 秒(耗时 2 个时钟周期)进行求和,耗时 0.003 秒(耗时 3 个时钟周期)进行乘法。
但正常运算需要 0.0000 秒(少于一次单击周期)进行求和和乘法运算。我错过了什么?我的代码如下。
测试类
#include <opencv2\core\internal.hpp>
#include <opencv2\core\core.hpp>
#include <tbb\tbb.h>
using namespace tbb;
using namespace cv;
template <class type>
class Parallel_clipBufferValues:public cv::ParallelLoopBody
{
private:
type *buffertoClip;
type maxSegment;
char typeOperation;//m = mul, s = summation
static double total;
public:
Parallel_clipBufferValues(){ParallelLoopBody::ParallelLoopBody();};
Parallel_clipBufferValues(type *buffertoprocess, const type max, const char op): buffertoClip(buffertoprocess), maxSegment(max), typeOperation(op){
if(typeOperation == 's')
total = 0;
else if(typeOperation == 'm')
total = 1;
}
~Parallel_clipBufferValues(){ParallelLoopBody::~ParallelLoopBody();};
virtual void operator()(const cv::Range &r) const{
double tot = 0;
type *inputOutputBufferPTR = buffertoClip+(r.start*maxSegment);
for(int i = 0; i < 10; ++i)
{
if(typeOperation == 's')
total += *(inputOutputBufferPTR+i);
else if(typeOperation == 'm')
total *= *(inputOutputBufferPTR+i);
}
}
static double getTotal(){return total;}
void normalOperation(){
//int iteration = sizeof(buffertoClip)/sizeof(type);
if(typeOperation == 'm')
{
for(int i = 0; i < 100; ++i)
{
total *= buffertoClip[i];
}
}
else if(typeOperation == 's')
{
for(int i = 0; i < 100; ++i)
{
total += buffertoClip[i];
}
}
}
};
主要
#include "stdafx.h"
#include "TestClass.h"
#include <ctime>
double Parallel_clipBufferValues<int>::total;
int _tmain(int argc, _TCHAR* argv[])
{
const int SIZE=100;
int myTab[SIZE];
double totalSum_by_parallel;
double totalSun_by_normaloperation;
double elapsed_secs_parallel;
double elapsed_secs_normal;
for(int i = 1; i <= SIZE; i++)
{
myTab[i-1] = i;
}
int maxSeg =10;
clock_t begin_parallel = clock();
cv::parallel_for_(cv::Range(0,maxSeg), Parallel_clipBufferValues<int>(myTab, maxSeg, 'm'));
totalSum_by_parallel = Parallel_clipBufferValues<int>::getTotal();
clock_t end_parallel = clock();
elapsed_secs_parallel = double(end_parallel - begin_parallel) / CLOCKS_PER_SEC;
clock_t begin_normal = clock();
Parallel_clipBufferValues<int> norm_op(myTab, maxSeg, 'm');
norm_op.normalOperation();
totalSun_by_normaloperation = norm_op.getTotal();
clock_t end_normal = clock();
elapsed_secs_normal = double(end_normal - begin_normal) / CLOCKS_PER_SEC;
return 0;
}
【问题讨论】:
-
嗯,首先,clock() 对于任何测量都不够准确。其次,您无法仅通过一次试验来衡量性能。第三,对于如此小的循环体开销(并行执行和您的程序本身)高于计算时间(例如,如果您必须将 100 个数字相加/相乘,最好使用 SIMD 指令而不是使其并行)。
-
谢谢。是的,我应该比较重要的计算。
-
不仅仅是循环体本身,这类测试还有其他问题(有关更多详细信息,请参阅我的回答)。
标签: c++ performance opencv parallel-processing