| #!/usr/bin/env scala |
| !# |
| |
| val m = args(0).toInt |
| val n = args(1).toInt |
| val approx_nnz = args(2).toInt |
| |
| val pnnz = approx_nnz.toDouble/(m*n) |
| val idx = collection.mutable.ArrayBuffer[Int]() |
| val p = collection.mutable.ArrayBuffer(0) |
| |
| for (i <- 0 until m) { |
| for (j <- 0 until n) { |
| if (util.Random.nextDouble < pnnz) |
| idx += j |
| } |
| p += idx.length |
| } |
| |
| val nnz = idx.length |
| val v = Array.tabulate(n)(i => util.Random.nextInt(1000)) |
| val d = Array.tabulate(nnz)(i => util.Random.nextInt(1000)) |
| |
| def printVec(t: String, name: String, data: Seq[Int]) = { |
| println("const " + t + " " + name + "[" + data.length + "] = {") |
| println(" "+data.map(_.toString).reduceLeft(_+",\n "+_)) |
| println("};") |
| } |
| |
| def spmv(p: Seq[Int], d: Seq[Int], idx: Seq[Int], v: Seq[Int]) = { |
| val y = collection.mutable.ArrayBuffer[Int]() |
| for (i <- 0 until p.length-1) { |
| var yi = 0 |
| for (k <- p(i) until p(i+1)) |
| yi = yi + d(k)*v(idx(k)) |
| y += yi |
| } |
| y |
| } |
| |
| println("#define R " + m) |
| println("#define C " + n) |
| println("#define NNZ " + nnz) |
| printVec("double", "val", d) |
| printVec("int", "idx", idx) |
| printVec("double", "x", v) |
| printVec("int", "ptr", p) |
| printVec("double", "verify_data", spmv(p, d, idx, v)) |