0

我在 Fortran 中有这个顺序代码。我的问题是,当我放置 Openmp 指令时,并行代码比顺序代码慢,而且我看不到错误。

REAL, DIMENSION(:), ALLOCATABLE :: current, next
ALLOCATE ( current(TOTAL_Z), next(TOTAL_Z))

CALL CPU_TIME(t1)

!$OMP PARALLEL SHARED (current, next) PRIVATE (z)
DO t = 1, TOTAL_TIME
    !$OMP  DO SCHEDULE(STATIC, 2)
    DO z = 2, (TOTAL_Z - 1)
        next(z) = current (z) + KAPPA*DELTA_T*((current(z - 1) - 2.0*current(z) +      current(z + 1)) / DELTA_Z**2)
    END DO
    !$OMP END DO
    current = next
END DO

CALL CPU_TIME(t2)

!$OMP END PARALLEL 

TOTAL_Z、TOTAL_TIME、KAPPA、DELTA_T、DELTA_Z 是常数。
当我运行并行代码时,我在 htop 中看到并且我的 2 个内核以 100% 的速度工作
在顺序代码中,CPU_TIME 是 79 seg,并行是 132 seg
谢谢

4

3 回答 3

3

我刚刚遇到同样的问题。

使用 cpu_time() 似乎不适合衡量多线程代码的性能。cpu_time() 将添加所有线程的总时间,这可能会随着线程数量的增加而增加。

我在另一个论坛上找到了这个, http://software.intel.com/en-us/forums/topic/281897

您应该使用 system_clock() 或 omp_get_wtime() 函数来获得更准确的例程时间。

于 2013-09-30T14:24:29.713 回答
1

它可能很慢,因为线程正在争用访问shared变量。如果您可以更改它以使用reduction它可能会更快。但这可能并不容易,因为“当前”的计算会访问多个数组元素。

于 2013-03-12T15:11:30.577 回答
1

根据迭代次数,您可能还面临嵌套数组上的错误共享问题。由于 DO 循环分布的块大小相当小,因此 nest(z)、nest(z+1)、nest(z+2)、nest(z+3) 等的缓存行可能会在CPU 的 L1/L2 高速缓存。

干杯,-迈克尔

于 2013-09-30T20:00:07.517 回答