gpt4 book ai didi

c - openmp的性能

转载 作者:可可西里 更新时间:2023-11-01 11:16:49 24 4
gpt4 key购买 nike

我正在测试 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时,结果如图所示: enter image description here

奇怪的是

  • 耗时不是直线上升(length=150000时的耗时几乎是length=50000时的5倍),而计算是一条直线。
  • 同样奇怪的是,当 length=150000 时,并行区域中测试函数的运行时间不等于顺序区域中测试函数的运行时间。

我的cpu是intel Core i5-4590(4核) 平台是vs2013,win8

急切希望有人能告诉我原因以及如何解决这个问题以提高openmp的性能,非常感谢。

最佳答案

这里没有什么奇怪的。您的密码是 memory boundlength=50000 到更长的数组时速度变慢是因为数据不再能够放入 CPU 最后一级缓存。

  • length=50000:数据大小为 4 个线程 x 2 个数组 x 50000 个元素 x 每个元素 8 个字节 = 3.05 MiB < L3 缓存大小(6 MiB for i5-4590)
  • length=100000:数据大小为 6.10 MiB > L3 缓存大小
  • length=150000:数据大小为 9.16 MiB > L3 缓存大小

在第二种情况下,数组只比 CPU 缓存稍大,因此时间差只比 2x 大一点。在第三种情况下,一半的数组数据无法装入缓存,必须从主存流式传输到主存。

当仅从主线程调用该函数时,使用的内存是并行区域中使用的内存的 1/4,并且数组完全适合所有三种不同长度的 L3 缓存。

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

关于c - openmp的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37068594/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com