【发布时间】:2016-05-06 09:16:07
【问题描述】:
我正在测试openmp的性能,但我发现一些奇怪的结果,这是我的测试代码:
void test()
{
int a = 0;
clock_t t1 = clock();
int length =50000;
double *t3 = new double[length]();
double *t4 = new double[length]();
for (int i = 0; i <8000; i++)
{
for (int j = 0; j < length; j++)
{
t3[j] = t3[j] + t4[j];
}
}
clock_t t2 = clock();
printf("Time = %d %d\n", t2 - t1,omp_get_thread_num());
delete[] t3;
delete[] t4;
}
int main()
{
clock_t t1 = clock();
printf("In parallel region:\n");
#pragma omp parallel for
for (int j = 0; j < 8; j++)
{
test();
}
clock_t t2 = clock();
printf("Total time = %d\n", t2 - t1);
printf("In sequential region:\n");
test();
printf("\n");
}
当我分别设置length=50000或length=100000或length=150000时,结果如图:
很奇怪
- 经过的时间不是一条直线(
length=150000的经过时间几乎是length=50000的5倍),而计算量是一条直线。 - 同样奇怪的是,当
length=150000时,并行区域中测试函数的运行时间不等于顺序区域中测试函数的运行时间。
我的cpu是intel Core i5-4590(4核),平台是vs2013,win8
非常希望有人能告诉我原因以及如何解决这个问题以提高openmp的性能,非常感谢。
【问题讨论】:
-
@ZheyuanLi 我从书中挑选了这段代码,那么我应该使用什么计时器来获得正确的结果?
-
@Debo 使用
omp_get_wtime()
标签: c windows performance openmp