I have two silly questions about the example code below.
1) There is a small, but noticeable speed up in this code if I define the
alias
colptr = A.colptr
rowval = A.rowval
nzval = A.nzval
2) Also, I would not expect a speed up from the @simd macro since the loop
@simd for k=colptr[col]:(colptr[col+1]-1)
@inbounds soma += B[rowval[k]] * nzval[k]
end
does not have a unitary stride, but the diference is also noticiable.
As there are no mentions to alias in the Performance Tips I would like to
known if there
is a logical explanation for this.
# Test Code ( Y = A*B, A is sparse)
function Test( A::SparseMatrixCSC{Float64,Int64}, B::Array{Float64},
Y::Array{Float64})
# Lets assume it is square
n = size(A,1)
# Local alias
colptr = A.colptr
rowval = A.rowval
nzval = A.nzval
#Loops
@inbounds for col = 1:n
const s = 0.0
@simd for k=colptr[col]:(colptr[col+1]-1)
@inbounds s += B[rowval[k]] * nzval[k]
end
Y[col] = s
end
end