因此,我正在翻译用C语言创建的程序。该程序的目的是简单地从文件中读取矩阵,以稀疏行格式压缩矩阵,然后计算矩阵向量乘积。
这是用C语言编写的程序片段。
//Read the MatrixMarket file and initialize a CSR formatted matrix.
csr_load_matrix(fileName, &compressedSparseMatrix);
//Set the correct values to the struct and create the memory allocation.
double *x;
double *y;
x = malloc(compressedSparseMatrix.cols * sizeof(double));
y = malloc(compressedSparseMatrix.rows * sizeof(double));
//initialize the vector x
for(int i = 0; i < compressedSparseMatrix.cols; i++){
x[i]= i+1;
}
//Calculate how long it takes to find the Matrix-Vector Product for the CSR Matrix.
//Start the timer.
clock_t begin = clock();
for (int i = 0; i < iterations; i++) {
csrMVP(&compressedSparseMatrix, x, y);
}
clock_t end = clock();
double totalTimeSpent = (double) (end - begin) / CLOCKS_PER_SEC;
这是我的Main.c,下面是我的csrMVP函数:
int csrMVP(CSR_Matrix *funcMatrix, double *x, double *y){
unsigned int i, j;
unsigned int k = 0;
double *value = funcMatrix->val;
unsigned int *column = funcMatrix->col;
unsigned int *rowPointer = funcMatrix->ptr;
double hold;
for(i = 0; i < funcMatrix->rows; i++){
hold = 0.0;
j = k;
k = rowPointer[i+1];
for(j; j < k; j++){
y[i] = y[i] + value[j] * x[i];
}
}
}
我的程序可以在C语言中完美运行。这里的想法是我想计算MVP 1000次,并查看编译器可以执行多快/慢。
所以现在我的下一个目标是在GoLang中使用并发来比较Golang可以执行MVP进程1000次的速度。
这是我的Golang程序的开始:(为了节省空间,假装
[]float64{...}
是一个大矩阵。)func main(){
var interation int
m := mat64.NewDense(32, 32, []float64{...})
//csr_print_matrix(m)
//m.CSRPrint()
//var y []float64
y := make([]float64, 32)
x := make([]int, 32)
for i := range x {
x[i] = i + 1
}
interation = 2
start := time.Now()
for i := 0; i < interation; i ++ {
m.CSRMVP(x, y)
}
elapsed := time.Since(start)
log.Printf("Matrix took %s", elapsed)
}
我的m.CSRMVP()函数是:
func (m *Dense) CSRMVP(x []int, y []float64){
fmt.Println("Value of Y:")
var j,end, newY int
var values []float64
var col_indices, row_ptr []int
values = m.mat.Data
end = 0
for i := 0; i < m.capCols; i++{
y[i] = 0.0
newY = int(y[i])
j = end
end = row_ptr[i+1]
for ; j < end; j++ {
newY = newY + int(values[j]) * x[col_indices[j]]
fmt.Print(newY)
y[i] = float64(newY)
}
}
}
该问题似乎是传递变量x和y的内存分配问题。
这是我的程序只运行一次MVP的输出。
panic: runtime error: index out of range
goroutine 1 [running]:
github.com/gonum/matrix/mat64.(*Dense).CSRMVP(0xc42001e100, 0xc420055d50, 0x20, 0x20, 0xc420055e50, 0x20, 0x20)
/Users/jeanmac/go/src/github.com/gonum/matrix/mat64/dense.go:573 +0x215
main.main()
/Users/jeanmac/go/src/matrices/main.go:75 +0x16c
我一直在学习Go。我的目标只是看更快。我相信我的错误是由于x和y的内存分配不正确。在C语言中,我调用Malloc来创建这些变量所需的内存,但我不确定Go的替代方案是什么。
go.line中的573行对应于:
end = row_ptr[i+1]
main.go中的第75行对应于:m.CSRMVP(x, y)
最佳答案
您正在使用github.com/gonum/matrix/mat64
。它已经过时了:
https://github.com/gonum/matrix/
Gonum矩阵
该存储库不再维护。发展已移至
https://github.com/gonum/gonum。