openmp的性能
The performance of openmp
我正在测试 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的性能,非常感谢。
这里没有什么奇怪的。您的代码是 memory bound,从 length=50000
到更长的数组时速度变慢是由于数据不再能够放入 CPU 最后一级缓存。
length=50000
:数据大小为 4 个线程 x 2 个数组 x 50000 个元素 x 每个元素 8 个字节 = 3.05 MiB < L3 缓存大小(i5-4590 为 6 MiB)
length=100000
:数据大小为 6.10 MiB > L3 缓存大小
length=150000
:数据大小为 9.16 MiB > L3 缓存大小
在第二种情况下,数组只比CPU缓存稍大,因此时间差只比2x大一点。第三种情况,一半的数组数据无法装入缓存,必须从主存流式传输。
当仅从主线程调用该函数时,使用的内存是并行区域中使用的内存的 1/4,并且数组完全适合所有三种不同长度的 L3 缓存。
查看我对 的回答了解更多详情。
我正在测试 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的性能,非常感谢。
这里没有什么奇怪的。您的代码是 memory bound,从 length=50000
到更长的数组时速度变慢是由于数据不再能够放入 CPU 最后一级缓存。
length=50000
:数据大小为 4 个线程 x 2 个数组 x 50000 个元素 x 每个元素 8 个字节 = 3.05 MiB < L3 缓存大小(i5-4590 为 6 MiB)length=100000
:数据大小为 6.10 MiB > L3 缓存大小length=150000
:数据大小为 9.16 MiB > L3 缓存大小
在第二种情况下,数组只比CPU缓存稍大,因此时间差只比2x大一点。第三种情况,一半的数组数据无法装入缓存,必须从主存流式传输。
当仅从主线程调用该函数时,使用的内存是并行区域中使用的内存的 1/4,并且数组完全适合所有三种不同长度的 L3 缓存。
查看我对