将C翻译为Golang。如何分配内存以匹配C?

时间:2018-04-11 23:34:28

标签: c go memory indexing malloc

所以我正在翻译我在C中创建的程序。该程序的目标是简单地从文件中读取矩阵,以稀疏行格式压缩矩阵,然后计算矩阵矢量乘积。 / p>

以下是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的替代方案。

密集的573行对应: end = row_ptr[i+1] main.go中的第75行对应: m.CSRMVP(x, y)

1 个答案:

答案 0 :(得分:0)

您正在使用github.com/gonum/matrix/mat64。它已经过时了:

  

https://github.com/gonum/matrix/

     

Gonum Matrix

     

不再维护此存储库。发展已经转移到了   https://github.com/gonum/gonum