c - csc 中 spmv 的 openmp 并行化

标签 c fortran openmp

当矩阵采用压缩稀疏列格式时,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

这应该将外部循环的“工作”分配给多个不同的处理器,同时确保内部循环变量kind有单独的副本>

我已经有一段时间没有使用 OMP 了 - 如果这对您不起作用,请使用评论告诉我。同时有一个非常好的引用/教程here

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

关于c - csc 中 spmv 的 openmp 并行化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17557677/

相关文章:

Java JNI - 返回 jintArray 时出现 EXCEPTION_ACCESS_VIOLATION

c - 使用终端而不是 Xcode 运行 C 脚本

fortran - 将具有派生类型作为参数的函数作为 Fortran 中的参数传递

c++ - OpenMP:一次为线程分配一个迭代

c - OSX 10.11 上的 OpenMP 支持,gcc 错误 "file omp.h not found"

c: 返回目录中的所有文件名

c - 当我相信我的代码没问题时,Turbo C 给我 "Declaration Terminated Incorrectly"

arrays - Fortran 错误 # 6366 : The shapes of the array expressions do not conform

algorithm - 网格前 10 个值的坐标

Android OpenCV 并行化循环