2013-01-24 50 views
0

我有兩個列表,我需要匹配一個元素,並將這些元素輸出到一個新的矩陣(輸出)中。在Fortran中最快的方法是什麼?蠻力至今:在fortran中儘可能快地找到隨機列表之間的匹配(+ openmp)

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的布爾參數?

+1

是否有任何理由爲什麼一旦找到匹配就無法退出內循環? –

+0

我需要一個CONTINUE語句在篩選下(i)= ...? – Griff

+0

出於好奇 - 高性能標誌,Hristo Iliev和伊恩布什似乎是人們一貫的優秀幫助(我確信還有其他人)。你是通過stackoverflow還是隻是好的撒瑪利亞人? – Griff

回答

2

這可能是更快地使用內在ANY功能是這樣的

do i = 1,Nlistone 
    if (any(B==A(i))) output(i) = A(i) 
end do 

,但我不會賭這種提高性能,我想測試兩個版本。因爲output的每個元素只能由一個線程寫入,所以您應該能夠安全地將其包含在!$OMP PARALLEL DO構造中。

+0

我的原始omp似乎沒有工作:過濾(i)= A(j) 錯誤:!$ OMP ATOMIC賦值必須在(1)的右側有一個運算符或內部函數爲什麼這不起作用? – Griff

0

您還可以在forall或(新)do concurrent構造條件測試,兩者都使用相同的語法:

do concurrent(i = 1:Nlistone, any(a(i) == b)) 
    output(i) = a(i) 
end do 

這可能是比你的代碼上市速度更快,這取決於性質AB。但它仍然具有O(n^2)的相同時間複雜度,而排序可以是O(n * log(n))。如果是Nlistone /= Nlisttwo,只需循環較短的數組並將其元素與較長的數組匹配,即可獲得與這些大小的比率相等的因子。