• Gemmini测试test文件chisel源码详解(四)


     矩阵生成TestUtils.scala

    1. // See README.md for license details.
    2. package gemmini
    3. object TestUtils {
    4. type Matrix[T] = Seq[Seq[T]]
    5. def rows[T](m: Matrix[T]) = m.length
    6. def cols[T](m: Matrix[T]) = m.head.length
    7. def dims[T](m: Matrix[T]) = (rows(m), cols(m))
    8. def mult[A](a: Matrix[A], b: Matrix[A])(implicit n: Numeric[A]): Matrix[A] = {
    9. import n._
    10. for (row <- a)
    11. yield for(col <- b.transpose)
    12. yield row zip col map Function.tupled(_*_) reduceLeft (_+_)
    13. }
    14. def add[A](a: Matrix[A], b: Matrix[A])(implicit n: Numeric[A]): Matrix[A] = {
    15. import n._
    16. for ((ra, rb) <- a zip b)
    17. yield for ((elema, elemb) <- ra zip rb)
    18. yield elema + elemb
    19. }
    20. def identity(dim: Int): Matrix[Int] = {
    21. for (i <- 0 until dim)
    22. yield Seq.fill(i)(0) ++ Seq(1) ++ Seq.fill(dim-i-1)(0)
    23. }
    24. def consecutive(dim: Int): Matrix[Int] = {
    25. (1 to dim*dim).grouped(dim).toSeq
    26. }
    27. def zero(dim: Int): Matrix[Int] = Seq.fill(dim, dim)(0)
    28. def rand(dim: Int, max: Int = 32): Matrix[Int] = Seq.fill(dim, dim)(scala.util.Random.nextInt(max))
    29. def print2DArray[A](a: Matrix[A]): Unit = {
    30. a.foreach {
    31. line => println(line.map(_.toString).reduce(_ + "\t" + _))
    32. }
    33. }
    34. }
    • TestUtils 对象中定义了一个类型别名 Matrix[T],表示一个由 T 类型的元素组成的二维序列。
    • rows[T] 函数接受一个 Matrix[T] 类型的参数 m,并返回它的行数,即 m 的长度。
    • cols[T] 函数接受一个 Matrix[T] 类型的参数 m,并返回它的列数,即 m 的第一行的长度。
    • dims[T] 函数接受一个 Matrix[T] 类型的参数 m,并返回它的维度,即 (rows(m), cols(m)) 的元组。
    • mult[A] 函数接受两个 Matrix[A] 类型的参数 a 和 b,并返回它们的矩阵乘积。这个函数要求 A 类型是一个数值类型,可以进行加法和乘法运算。函数中使用了 for 推导式和 map、reduceLeft 等高阶函数来实现矩阵乘法的算法。
    • add[A] 函数接受两个 Matrix[A] 类型的参数 a 和 b,并返回它们的矩阵加法。这个函数要求 A 类型是一个数值类型,可以进行加法运算。函数中使用了 for 推导式和 zip 函数来实现矩阵加法的算法。
    • identity 函数接受一个整数参数 dim,并返回一个 dim x dim 的单位矩阵,即对角线上为 1,其余为 0 的矩阵。函数中使用了 for 推导式和 Seq.fill 函数来构造单位矩阵。
    • consecutive 函数接受一个整数参数 dim,并返回一个 dim x dim 的连续矩阵,即从 1 到 dim*dim 的整数按行排列的矩阵。函数中使用了 to 和 grouped 方法来构造连续矩阵。
    • zero 函数接受一个整数参数 dim,并返回一个 dim x dim 的零矩阵,即所有元素都为 0 的矩阵。函数中使用了 Seq.fill 函数来构造零矩阵。
    • rand 函数接受一个整数参数 dim,以及一个可选的整数参数 max,默认值为 32。函数返回一个 dim x dim 的随机矩阵,即所有元素都是从 0 到 max-1 中随机选择的整数。函数中使用了 Seq.fill 和 scala.util.Random.nextInt 方法来构造随机矩阵。
    • print2DArray[A] 函数接受一个 Matrix[A] 类型的参数 a,并打印出它的内容。函数中使用了 foreach 方法和 reduce 方法来格式化并输出每一行元素。
    1. // See README.md for license details.
    2. package gemmini
    3. object TestUtils {
    4. //定义二维矩阵
    5. type Matrix[T] = Seq[Seq[T]]
    6. //获取矩阵的行数、列数和维度的函数。rows函数返回矩阵的行数,cols函数返回矩阵的列数,dims函数返回矩阵的维度
    7. def rows[T](m: Matrix[T]) = m.length
    8. def cols[T](m: Matrix[T]) = m.head.length
    9. def dims[T](m: Matrix[T]) = (rows(m), cols(m))
    10. //用于矩阵乘法
    11. def mult[A](a: Matrix[A], b: Matrix[A])(implicit n: Numeric[A]): Matrix[A] = {
    12. //函数使用嵌套的for推导式来遍历矩阵a的每一行和矩阵b的每一列
    13. //在每个元素位置上,它使用row zip col将两个对应位置的元素组成一个元组,然后对该元组应用乘法操
    14. //使用Function.tupled将乘法操作应用到每个元素上
    15. //最后,使用reduceLeft和+_将每一行中的乘积相加,得到最终的结果矩阵。
    16. import n._
    17. for (row <- a)
    18. yield for(col <- b.transpose)
    19. yield row zip col map Function.tupled(_*_) reduceLeft (_+_)
    20. }
    21. //矩阵加法
    22. def add[A](a: Matrix[A], b: Matrix[A])(implicit n: Numeric[A]): Matrix[A] = {
    23. import n._
    24. for ((ra, rb) <- a zip b)
    25. yield for ((elema, elemb) <- ra zip rb)
    26. yield elema + elemb
    27. }
    28. //生成单位矩阵
    29. def identity(dim: Int): Matrix[Int] = {
    30. for (i <- 0 until dim)
    31. yield Seq.fill(i)(0) ++ Seq(1) ++ Seq.fill(dim-i-1)(0)
    32. }
    33. //生成连续数字矩阵
    34. def consecutive(dim: Int): Matrix[Int] = {
    35. (1 to dim*dim).grouped(dim).toSeq
    36. }
    37. //生成全零矩阵
    38. def zero(dim: Int): Matrix[Int] = Seq.fill(dim, dim)(0)
    39. //生成随机整数矩阵
    40. def rand(dim: Int, max: Int = 32): Matrix[Int] = Seq.fill(dim, dim)(scala.util.Random.nextInt(max))
    41. //打印
    42. def print2DArray[A](a: Matrix[A]): Unit = {
    43. a.foreach {
    44. line => println(line.map(_.toString).reduce(_ + "\t" + _))
    45. }
    46. }
    47. }

     

  • 相关阅读:
    【计算机网络】计算机网络体系结构与参考模型
    生产环境日志还用notepad++?难怪定位慢,UltraEdit了解一下!
    y126.第七章 服务网格与治理-Istio从入门到精通 -- 访问网格外部服务(十二)
    OpenVINO相关
    TensorFlow搭建双向LSTM实现时间序列预测(负荷预测)
    Linux 命令学习 -磁盘分区和格式化
    英文科技论文写作与发表-写作实践(第7章)
    2022icpc沈阳站感想
    repr函数输出调试信息
    nlp小模型也可在控制和被控制结果的数据集(题库)上表现出智能
  • 原文地址:https://blog.csdn.net/qq_52505851/article/details/133811642