如果矩阵处于压缩稀疏列格式,那么一个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分别是列指针,行索引和矩阵的非零值。感谢。
答案 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
这应该将外部循环的“工作”划分为多个不同的处理器,同时确保内部循环变量k
和ind
我使用OMP已经有一段时间了 - 如果这对您不起作用,请使用评论让我知道。同时有一个非常好的参考/教程here
另外 - 你会发现similar question was asked earlier - 虽然语言是C,但基本的循环结构非常相似。那里的对话表明,当矩阵变得非常大(超过缓存的大小)时,并行化的加速很小。