稀疏BLAS矩阵行向量积覆盖循环索引

时间:2014-07-18 16:40:10

标签: matrix fortran sparse-matrix blas

我正在使用从http://math.nist.gov/~KRemington/fspblas/下载的NIST稀疏BLAS v0.5矩阵乘法例程,一次将一个矩阵乘以列向量。在特定点调用例程(根据矩阵而改变)之后,包含在其中的do循环索引被覆盖。我认为它可能与我有关,将它作为例程的上三角矩阵报告,但不明白为什么它应该对单行向量产生影响。我已经使用这个例程乘以整个(相同的)矩阵而没有任何问题。伪代码再现问题(使其结束第四个[外部]循环):

program row_vec_mult_test   
integer lwork,ind1,ind2,ind(4),ind_int,i,j,row_ind,val_ind
integer descra(9),H_col(:),H_pntrb(1),H_pntre(1),H_col_tmp(4)
double precision in(10),out(10),work(5),H_val(:),
 1 out_tmp(1),H(10,10),H_val_tmp(4)

allocatable H_col,H_val

descra(1) = 1
descra(2) = 2
descra(3) = 0
descra(4) = 1
descra(5) = 0
lwork = 5

do i = 1,10
 in(i) = i
end do

H = 0.0d0
H(1,6) = 3
H(2,8) = 6
H(4,5) = 2
H(7,9) = 1
H(8,9) = 7
H(9,10) = 5

do i = 1,10
 do j = 1,10
  if (i==j) then
   H(i,j) = i
  else
   H(j,i) = H(i,j)
  end if
 end do
end do

do ind1 = 1,10
 row_ind = 1
 val_ind = 1
 H_pntrb(1) = 1
 H_col_tmp = 0
 H_val_tmp = 0.0d0
 do ind2 = 1,10
  if(H(ind1,ind2) /= 0.0d0) then
   H_val_tmp(val_ind) = H(ind1,ind2)
   H_col_tmp(val_ind) = ind2
   val_ind = val_ind + 1
   row_ind = row_ind + 1
   H_pntre(1) = row_ind
  else
  end if
 end do
 where(H_val_tmp /= 0)
  ind = 1
 elsewhere
  ind = 0
 end where
 ind_int = sum(ind)
 if (allocated(H_val)) deallocate(H_val)
 allocate(H_val(ind_int))
 H_val = H_val_tmp(:ind_int)
 if (allocated(H_col)) deallocate(H_col)
 allocate(H_col(ind_int))
 H_col = H_col_tmp(:ind_int)
 !print *,
 !print *, ind1
 !print *, int(H_val)
 !print *, H_col
 !print *, H_pntrb
 !print *, H_pntre
 call dcsrmm(0,1,1,10,1.0d0,descra,H_val,H_col,H_pntrb,
 1  H_pntre,in,10,0.0d0,out_tmp,1,work,lwork)
   out(ind1) = out_tmp(1)
  end do

  do i = 1,10
   print *, out(i)
  end doroutine to

end

输出:

At line 81 of file csr_row_mult_test.f
Fortran runtime error: Array reference out of bounds for array 'out', upper bound of dimension 1 exceeded (1074790400 > 10)

Backtrace for this error:
+ in the main program
+ /lib64/libc.so.6(__libc_start_main+0xfd) [0x3c5cc1ed1d]

在RHEL6上编译,gfortran 4.4.7,-fimplicit-none -Wall -Wtabs -fbounds-check -fbacktrace -O5

P.S。虽然与我之前的问题类似,但它们实际上是不同的程序,并且解决该问题的方法都没有解决这个问题。

1 个答案:

答案 0 :(得分:0)

问题是我对称矩形矩阵的规范。我没有尝试将其更改为指定非对称矩阵,尽管这可能有效。在我的问题中引用的稀疏BLAS实现中,有一个向量 - 向量乘法例程ddoti,因此修改矩阵的行以表示单个向量并使用它有效地消除了该问题。

顺便说一句,在后面的库实现中包含更详细的错误报告,这就是我确定错误来源的方式。