【发布时间】:2014-11-10 13:30:54
【问题描述】:
我的(Fortran)代码非常简单。它所做的只是填充一个大数组,这取决于五个(独立的!)变量。这是一个简单的例子
do i = 1, imax
do j = 1, jmax
do k = 1, kmax
array(i,j,k) = ! some function of i,j,k
end do
end do
end do
我会使用不同的线程以更快的方式填充数组的值。
我认为实现这一目标的最简单方法是将循环包含在这些命令中
!$OMP 并行执行
!$OMP 并行结束
但是,如果我这样做,我会得到与串行案例完全不同的结果。如果问题太简单,我深表歉意,但我真的找不到合适的例子来帮助解决我的问题。你能推荐一个解决方案或提供一个例子吗?
【问题讨论】:
-
更具体地了解赋值语句的 rhs。发布一个最小的示例,展示您关注的不当行为。
-
以及马克所说的,我必须问一下循环是否真的像你上面所说的那样有序?如果是这样的话,这对于 Fortran 来说是完全错误的,它就像你能得到的那样不友好的内存子系统,而且你几乎可以肯定从修复它得到的速度至少与使用 OpenMP 一样快
-
@IanBush:同意修复循环排序的必要性,但并不是说您至少可以加快速度,这在很大程度上取决于 RHS 的样子。