2

在矩阵采用压缩稀疏列格式的稀疏矩阵向量乘法之后,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 分别是矩阵的列指针、行索引和非零值。谢谢。

4

1 回答 1

2

以下内容对您有用吗(使用 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 已经有一段时间了 - 如果这对您不起作用,请使用评论让我知道。同时这里有一个非常好的参考/教程

另外——你会发现之前有人问过类似的问题——虽然语言是 C,但基本的循环结构非常相似。那里的对话表明,当矩阵变得非常大(超过缓存的大小)时,并行化的加速是最小的。

于 2013-07-09T20:43:44.693 回答