因此,我正在翻译用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

08-19 15:41