Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance 在fortran(&x2B;openmp)中尽可能快地查找随机列表之间的匹配_Performance_Loops_Fortran_Openmp - Fatal编程技术网

Performance 在fortran(&x2B;openmp)中尽可能快地查找随机列表之间的匹配

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 =

我有两个列表,我需要将一个列表中的元素与另一个列表中的元素进行匹配,并将这些元素输出到一个新的矩阵(输出)。用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 = 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)的右侧有一个运算符或内部变量,为什么不起作用?