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=50000length=100000length=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 缓存。

查看我对 的回答了解更多详情。