2013-07-09 48 views
1

一個OpenMP如何在稀疏矩陣向量乘法的情況下並行化,其中矩陣採用壓縮稀疏列格式?cmp中spmv的openmp並行化

do i=1,lastcol 
    do k=ia(i),ia(i+1)-1 
     ind=ja(k) 
     y(ind)=y(ind)+x(i)*a(k) 
    end do 
end do 

這裏,ia,ja和a分別是矩陣的行指針,行索引和非零值。謝謝。

回答

1

爲您做以下工作(更新與ATOMIC子句,以防止的Massimiliano發現的問題)

!$ OMP PARALLEL DO PRIVATE(k, ind, temp) 
do i=1,lastcol 
    do k=ia(i),ia(i+1)-1 
     ind=ja(k) 
     temp = x(i)*a(k) 
     !$ OMP ATOMIC 
     y(ind)=y(ind)+temp 
     !$ OMP END ATOMIC 
    end do 
end do 
!$ OMP END PARALLEL DO 

這應該劃分外循環的「工作」過許多不同的處理器,同時確保有內部循環變量的單獨副本kind

我已經使用OMP已經有一段時間了 - 如果這不適用於您,請使用評論讓我知道。同時有一個非常好的參考/教程here

而且 - 你會發現一個similar question was asked earlier - 雖然語言是C,基本的循環結構非常相似。那裏的對話表明,當矩陣變得非常大(超過緩存的大小)時,並行化的速度很小。

+0

我以前使用過這種確切的方法,它工作正常。您也可以將其壓縮爲一個OMP指令: !$ omp parallel do private(k,ind) 當您使用parallel do時,不需要將''i''指定爲private。 – korrok

+0

@korrok謝謝。我不確定是否將'i'作爲'私人' - 如果您查看編輯歷史記錄,您會看到我在最初的帖子後添加了它,只是爲了確保。同意凝結應該工作。這種情況下的結語是什麼? '平行做'? – Floris

+1

如果你用'atomic'子句不保護'y(ind)= y(ind)+ x(i)* a(k)',那麼'ind = ja(k) 。 – Massimiliano