在矩阵采用压缩稀疏列格式的稀疏矩阵向量乘法之后,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 已经有一段时间了 - 如果这对您不起作用,请使用评论让我知道。同时这里有一个非常好的参考/教程
另外——你会发现之前有人问过类似的问题——虽然语言是 C,但基本的循环结构非常相似。那里的对话表明,当矩阵变得非常大(超过缓存的大小)时,并行化的加速是最小的。