csc中spmpv的openmp并行化

时间:2013-07-09 20:32:55

标签: c fortran openmp

如果矩阵处于压缩稀疏列格式,那么一个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 个答案:

答案 0 :(得分: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已经有一段时间了 - 如果这对您不起作用,请使用评论让我知道。同时有一个非常好的参考/教程here

另外 - 你会发现similar question was asked earlier - 虽然语言是C,但基本的循环结构非常相似。那里的对话表明,当矩阵变得非常大(超过缓存的大小)时,并行化的加速很小。