当矩阵采用压缩稀疏列格式时,OpenMP 如何并行执行稀疏矩阵 vector 乘法?
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,但基本循环结构非常相似。那里的对话表明,当矩阵变得相当大(超过缓存的大小)时,并行化的加速是最小的。
关于c - csc 中 spmv 的 openmp 并行化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17557677/