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分別是矩陣的行指針,行索引和非零值。謝謝。
一個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分別是矩陣的行指針,行索引和非零值。謝謝。
爲您做以下工作(更新與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
這應該劃分外循環的「工作」過許多不同的處理器,同時確保有內部循環變量的單獨副本k
和ind
我已經使用OMP已經有一段時間了 - 如果這不適用於您,請使用評論讓我知道。同時有一個非常好的參考/教程here
而且 - 你會發現一個similar question was asked earlier - 雖然語言是C,基本的循環結構非常相似。那裏的對話表明,當矩陣變得非常大(超過緩存的大小)時,並行化的速度很小。
我以前使用過這種確切的方法,它工作正常。您也可以將其壓縮爲一個OMP指令: !$ omp parallel do private(k,ind) 當您使用parallel do時,不需要將''i''指定爲private。 – korrok
@korrok謝謝。我不確定是否將'i'作爲'私人' - 如果您查看編輯歷史記錄,您會看到我在最初的帖子後添加了它,只是爲了確保。同意凝結應該工作。這種情況下的結語是什麼? '平行做'? – Floris
如果你用'atomic'子句不保護'y(ind)= y(ind)+ x(i)* a(k)',那麼'ind = ja(k) 。 – Massimiliano