Performance 在fortran(&x2B;openmp)中尽可能快地查找随机列表之间的匹配
我有两个列表,我需要将一个列表中的元素与另一个列表中的元素进行匹配,并将这些元素输出到一个新的矩阵(输出)。用Fortran实现这一点的最快方法是什么?迄今为止的暴力:Performance 在fortran(&x2B;openmp)中尽可能快地查找随机列表之间的匹配,performance,loops,fortran,openmp,Performance,Loops,Fortran,Openmp,我有两个列表,我需要将一个列表中的元素与另一个列表中的元素进行匹配,并将这些元素输出到一个新的矩阵(输出)。用Fortran实现这一点的最快方法是什么?迄今为止的暴力: do i = 1,Nlistone do j = 1,Nlisttwo if A(i).eq.B(j) then output(i) = B(j) end if end do end do openmp版本: !$OMP PARALLEL PRIVATE(i,j) do i =
do i = 1,Nlistone
do j = 1,Nlisttwo
if A(i).eq.B(j) then
output(i) = B(j)
end if
end do
end do
openmp版本:
!$OMP PARALLEL PRIVATE(i,j)
do i = 1,NA
do j = 1,NB
if A(i).eq.B(j) then
filtered(i) = A(j)
end if
end do
end do
!$OMP END PARALLEL DO
当然有更好的方法可以做到这一点,排序在这里不是一个选项(向量元素没有任何特定的顺序)。python中是否有类似于
mask
的布尔参数?使用内部任何类似这样的函数可能会更快
do i = 1,Nlistone
if (any(B==A(i))) output(i) = A(i)
end do
但我不会打赌这会提高性能,我会测试两个版本。您应该能够安全地将其包装在中$OMP并行DO
构造,因为输出
的每个元素仅由一个线程写入 您还可以在for all
或(更新的)do concurrent
构造中包含条件测试,这两种构造使用相同的语法:
do concurrent(i = 1:Nlistone, any(a(i) == b))
output(i) = a(i)
end do
这可能比代码列表快,具体取决于A
和B
的性质。但是它仍然具有相同的时间复杂度O(n^2),而排序可以是O(n*log(n))。如果Nlistone/=Nlisttwo
,只需循环通过较短的数组并将其元素与较长的数组匹配,就可以获得等于这些大小之比的因子 找到匹配项后,有什么原因不能退出内部循环吗?我需要在filtered(I)=…下使用一个CONTINUE语句?只是出于好奇——高绩效马克、赫里斯托·伊利耶夫和伊恩·布什似乎一直都在提供出色的帮助(我相信还有其他人)。你是受雇于stackoverflow还是仅仅是善良的撒玛利亚人?我怀疑Stack Exchange是否雇佣了任何人在这里发布答案:)@Griff Continue在Fortran中本质上是一个NOP。出口是你在那条线下需要的。不,我不为stackoverflow工作,但谢谢你的好话!我原来的omp似乎不起作用:过滤(i)=A(j)错误:$OMP原子赋值必须在(1)的右侧有一个运算符或内部变量,为什么不起作用?