gpt4 book ai didi

parallel-processing - 内部 dot_product 比 a*a+b*b+c*c 慢?

转载 作者:行者123 更新时间:2023-12-05 06:33:44 26 4
gpt4 key购买 nike

最近我测试了显式求和和内函数计算点积的运行时差异。令人惊讶的是,朴素的显式书写速度更快

  program test

real*8 , dimension(3) :: idmat
real*8 :: dummy(3)

idmat=0
dummy=0

do i=1,3

idmat(i)=1

enddo

do j=1,10**10

! dummy(mod(j,3)+1)=dot_product(idmat,idmat)
dummy(mod(j,3)+1)=idmat(1)*idmat(1)+idmat(2)*idmat(2)+idmat(3)*idmat(3)

enddo

print*, dummy

end program test

这是让我感到困惑的地方:

1。无-O3优化

如果我使用:gfortran test.f90 -o test ;时间./test

我发现使用函数 dot_product(上面有评论)的运行时间为 6,297s,使用手动显式编写的运行时间为 4,486s。这有什么意义?

2。包括-O3优化

如果我使用:gfortran test.f90 -O3 -o test ;时间./test

我发现运行时间分别为 1,808s1,803s。所以两者实际上具有相同的速度。

3。我真正期待的是什么

...是更快的内在函数,因为它可以:

  1. 并行计算 3 个产品
  2. 添加 3 个产品

显式形式必须按顺序:

  1. 计算产品 1
  2. 计算产品 2
  3. 计算产品 3
  4. 添加 3 个产品

我是否必须创建一个新的并行 dot_product 函数才能更快?还是有一个我不知道的 gfortran 编译器的附加选项?

请注意:我在互联网上阅读了有关现代 Fortran 中的 SIMD、自动矢量化和并行化的信息。虽然我学到了一些东西,但我的问题在任何地方都没有得到解答。

最佳答案

即使查看未优化的数字也毫无意义。优化后的数字相同,所以一切正常。

“...是更快的内在函数,因为它可以:并行计算 3 个产品”

除非启用特定的并行优化,否则不会并行执行任何操作。这些优化对于循环和内部函数一样容易,而且对于循环来说通常更容易。

好吧,至少对于使用线程或类似的并行 的正常意义而言。可以并行完成的是使用向量指令并安排指令在 CPU 流水线中重叠。这可以通过优化编译器来完成,并且在您使用 -O3 时可能对两个版本都完成。当未启用优化时,您不应期望发生这种情况。

“并行”指令 (SIMD) 的使用有时可以通过使用像 !$omp simd!$DEC VECTOR 这样的编译器指令来改进。

“我是否必须创建一个新的并行 dot_product 函数才能更快?”

是的,通常你会这样做。例如使用 OpenMP。或者你可以:

“或者 gfortran 编译器是否有一个我不知道的附加选项?”

是的,自动并行化https://gcc.gnu.org/wiki/AutoParInGCC ,例如 -floop-parallelize-all -ftree-parallelize-loops=4

请注意,它不会并行进行这些单独的乘法运算,它会使 i 循环并行进行。

关于parallel-processing - 内部 dot_product 比 a*a+b*b+c*c 慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50608410/

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